Python使用OpenCV绿幕抠图生成带有透明通道的PNG图片
原创
©著作权归作者所有:来自51CTO博客作者wx5ecc8c432b706的原创作品,请联系作者获取转载授权,否则将追究法律责任
原图片
带有透明通道的图片(在浏览器状态下透明背景呈现白色)
Python完整代码如下,具体实现流程代码注释已经解释很清楚了,详情请看注释
import cv2
import numpy as np
# todo 读取并转换图片格式
opencv = cv2.imread('/home/huangjx/Pictures/boy.jpeg')
hsv = cv2.cvtColor(opencv, cv2.COLOR_RGB2HSV)
# todo 指定绿色范围,60表示绿色,我取的范围是-+10
minGreen = np.array([50, 100, 100])
maxGreen = np.array([70, 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('/home/huangjx/Pictures/boy.png', bgra)
# todo 显示图片验证结果,opencv LOGO 图片
cv2.imshow('opencv', opencv)
cv2.imshow('green', green)
cv2.imshow('green_not', green_not)
cv2.waitKey()
cv2.destroyAllWindows()
再放一张效果图片吧
原图:
结果:
从这组图片对比可以看出来,这种方法对边缘的扣取效果还是不够完美。
但是如果你对HSV格式比较熟悉的话,你更改下面的值,理论上可以扣取任意颜色背景的图片(例如背景是紫色你也能搞定),这就是PS做不到的优势了
# todo 指定绿色范围,60表示绿色,我取的范围是-+10
minGreen = np.array([50, 100, 100])
maxGreen = np.array([70, 255, 255])