该代码段展示了如何利用OpenCV库将含有绿幕的图片转换成具有透明背景的PNG图片。通过色彩空间转换(HSV),定义绿色范围,创建掩码,然后进行按位运算来分离和提取绿幕部分,最终保存为带Alpha通道的图像。
def get_none_img(img):
"""
将绿幕图片抠成透明背景图片
:return:
"""
# todo 读取并转换图片格式
_, ext = os.path.splitext(img)
opencv = cv2.imread(os.path.join(IMAGES_ABS_PATH, img))
hsv = cv2.cvtColor(opencv, cv2.COLOR_RGB2HSV)
# todo 指定绿色范围,60表示绿色,我取的范围是-+10
minGreen = np.array([30, 70, 70])
maxGreen = np.array([80, 255, 255])
# todo 确定绿色范围
mask = cv2.inRange(hsv, minGreen, maxGreen)
# todo 确定非绿色范围
mask_not = cv2.bitwise_not(mask)
# todo 通过掩码控制的按位与运算锁定绿色区域
green = cv2.bitwise_and(opencv, opencv, mask=mask)
# todo 通过掩码控制的按位与运算锁定非绿色区域
green_not = cv2.bitwise_and(opencv, opencv, mask=mask_not)
# todo 拆分为3通道
b, g, r = cv2.split(green_not)
# todo 合成四通道
bgra = cv2.merge([b, g, r, mask_not])
# todo 保存带有透明通道的png图片,有了这种素材之后,就可以给这张图片替换任意背景了
cv2.imwrite(f'./caches/image1/{_}.png', bgra)