原图片

Python使用OpenCV绿幕抠图生成带有透明通道的PNG图片_python


带有透明通道的图片(在浏览器状态下透明背景呈现白色)

Python使用OpenCV绿幕抠图生成带有透明通道的PNG图片_opencv_02

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()

再放一张效果图片吧

原图:

Python使用OpenCV绿幕抠图生成带有透明通道的PNG图片_python_03


结果:

Python使用OpenCV绿幕抠图生成带有透明通道的PNG图片_opencv_04

从这组图片对比可以看出来,这种方法对边缘的扣取效果还是不够完美。

但是如果你对HSV格式比较熟悉的话,你更改下面的值,理论上可以扣取任意颜色背景的图片(例如背景是紫色你也能搞定),​​这就是PS做不到的优势了​

# todo 指定绿色范围,60表示绿色,我取的范围是-+10
minGreen = np.array([50, 100, 100])
maxGreen = np.array([70, 255, 255])