起因是需要将一张证件照的背景和人物分离出来,但是查阅了网上很多资料,发现大部分都是只是将人像分离出来,但是我的目的是将背景色单独拎出来,所以没有很好的查找到相应资料
解决这个问题的时候,想法是使用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)
这样就得到了想要的背景色,如下图所示,从图中可以看出在人像分割的时候,由于算法原因没有割的很透彻,所以导致有点毛边的出现。
这个情况在我这里是适用的,而且后续的工作也不一定能用上,就是先记录一下