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

原图片
在这里插入图片描述
带有透明通道的图片(在浏览器状态下透明背景呈现白色)
在这里插入图片描述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])
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值