opencv读取带alpha通道透明图片,提取背景色

文章讲述了作者如何使用PaddleSeg分离证件照的人像并将背景提取出来,遇到的问题包括透明像素处理、OpenCV对PNG图片的噪点问题以及人像分割不彻底导致的毛边。最终通过调整代码解决了这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因是需要将一张证件照的背景和人物分离出来,但是查阅了网上很多资料,发现大部分都是只是将人像分离出来,但是我的目的是将背景色单独拎出来,所以没有很好的查找到相应资料

解决这个问题的时候,想法是使用paddleseg把人像给抠出来,在和原始图像进行像素删减(这可能不是最好的方法,见谅),人像分离之后发现,paddleseg最后保存的图片是带alpha通道的png图片,而opencv在处理这种图片时图片的透明部分会被自动生成的噪点覆盖,导致出现一下图片的情况,这让我在后面的像素删减的时候出现问题的原因之一(还有一个原始就是alpha通道的图片是4维的ndarray,和原始图片三通道的ndarray不能相减)

 最后找到的方法是将透明像素的RGB值处理为[0,0,0],然后删除Alpha通道,只保留RGB通道。代码如下(其中test是使用paddleseg分割出来的png图片):

img = cv2.imread('blue4.jpg')
img1 = cv2.imread('test.png',cv2.IMREAD_UNCHANGED)
if img1 is not None:
    # 检查图像是否具有Alpha通道(透明度)
    if img1.shape[-1] == 4:
        # 将透明像素的RGB值处理为[0, 0, 0],并删除Alpha通道
        img1[np.where(img1[:, :, 3] == 0)] = [0, 0, 0, 0]
        temp_img = img1[:, :, :3]
else:
    print("无法读取图像")
background_image = img - temp_img
cv2.imwrite('bk_img/result.png', background_image)

这样就得到了想要的背景色,如下图所示,从图中可以看出在人像分割的时候,由于算法原因没有割的很透彻,所以导致有点毛边的出现。

这个情况在我这里是适用的,而且后续的工作也不一定能用上,就是先记录一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值