使用 Python 将绿屏背景替换成自定义图片
AI算法与图像处理
共 2131字,需浏览 5分钟
·
2022-12-31 00:32
你有没有想过我们如何自己替换图像中的绿屏背景?
在这里,将教你如何使用 Python 和 OpenCV 替换具有绿屏背景的图像。
让我们进入正题,首先将拍摄两张图像作为我们程序的输入,一张是绿屏背景的图像,另一张是将设置成背景的图像。
![](https://filescdn.proginn.com/74146bedbf567c7b456bb7dc494194c9/01a2298868d2b21eaca4c7dde9d94fb9.webp)
![](https://filescdn.proginn.com/c758b7dcf40f9e449f5c309045a9b0a4/8046c1720e64e24f7e57889b14ed8c9c.webp)
带有绿屏背景的图像和要设置的背景图像
首先,你需要安装一些必需的库,例如 OpenCV 和 cvzone。
要安装这些库,只需打开命令提示符或终端并键入以下内容,然后按 Enter。
pip install opencv-python
pip install cvzone
安装库后,导入安装的库并读取这两个图像,如下所示,
# Importing libraries
import cv2
from cvzone.SelfiSegmentationModule import SelfiSegmentation
# Reading the green screen and background image
green_screen_img = cv2.imread("Green Screen Image Path")
bg_img = cv2.imread("Background Image Path")
两个图像应具有相同的尺寸(相同的宽度和高度)。使用shape属性检查尺寸(返回高度、宽度、通道)。如果两个图像的尺寸不同,则使用cv2.resize() 将这些图像的尺寸调整为相同的尺寸。
# Checking dimensions
print(green_screen_img.shape)
print(bg_img.shape)
# In my case both are having different dimension.
# So, I have to resize my images to same dimensions.
w, h = 640, 480
green_screen_img = cv2.resize(green_screen_img, (w, h))
bg_img = cv2.resize(bg_img, (w, h))
调整图像大小后,为SelfiSegmentation创建一个从cvzone.SelfiSegmentationModule导入的对象,然后从该对象调用一个函数removeBG(),该函数接受三个参数。
源图像 背景图像/背景颜色 阈值(默认 = 0.1)(可选)
output_1 = segmentor.removeBG(green_screen_img, bg_img)
cv2.imshow("Output-1", output)
cv2.waitKey(0)
![](https://filescdn.proginn.com/a2ebe2e9661c24dbcca04b1e20d57a1c/620a16e2bea52d4519b0a1ed15f6e2b6.webp)
具有默认阈值 (0.1) 的输出图像
output_2 = segmentor.removeBG(green_screen_img, bg_img, threshold=0.4)
cv2.imshow("Output-2", output_2)
cv2.waitKey(0)
![](https://filescdn.proginn.com/ddd56f250efaebde0b5a59a5fcc5ca33/48943619c8516ede4c72bd6e60f7eee2.webp)
输出阈值为 0.4 的图像
注意:最大阈值可以是1。如果阈值设置为 1,则整个图像被背景图像占据,如下所示,
output_3 = segmentor.removeBG(green_screen_img, bg_img, threshold=1)
cv2.imshow("Output-3", output_3)
cv2.waitKey(0)
![](https://filescdn.proginn.com/d59107d82feaf12c1f4636d29792e592/77ab3b860186d9572a09272b75ec6d04.webp)
阈值为 1 的输出图像
你也可以在BGR(蓝色、绿色、红色)值中指定颜色,而不是将图像指定为背景,如下图所示,
# In my case, I am choosing Red color as background
# RED - (0, 0, 255)
output = segmentor.removeBG(green_screen_img, (0, 0, 255))
cv2.imshow("Output", output)
cv2.waitKey(0)
![](https://filescdn.proginn.com/442983458b439910f7b1c19b7b6a6cad/cd6dff5d6b3e0eb60550591f57d34675.webp)
以红色为背景的输出图像
评论