通常情况下,当您在假定的白色画布上绘制一些黑线时,就会出现这种情况。大多数应用程序以透明背景导出PNG图像,即使可见画布是白色的。
结果是图像只由黑色像素和透明像素组成。那些透明的像素通常也具有0.0.0的RGB值--因此如果我们仅查看RGB值,所有颜色都是黑色的。
例如,在inkscape中,您可以在绘图下方放置一个白色矩形来确保PNG导出器真正保存了一些白色背景。
默认的cv2.imread("file.png", cv2.IMREAD_COLOR)
和cv2.imread("file.png", cv2.IMREAD_GRAYSCALE)
都忽略透明度,并且只查看RGB值。这很糟糕,因为完全透明像素的RGB值是没有意义的。
只有cv2.imread("file.png", cv.IMREAD_UNCHANGED)
可以访问透明通道。我们提取Alpha通道,反转它并将其添加回到图像中。这模拟了在白色背景上的Alpha通道:
img = cv2.imread("file.png", cv.IMREAD_UNCHANGED)
if img.shape[2] == 4:
a1 = ~img[:,:,3]
img = cv2.add(cv2.merge([a1,a1,a1,a1]), img)
img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
cv2.imshow('aa', img); cv2.waitKey(0); cv2.destroyAllWindows()
看起来cv2对透明度一点都不友好。无论是cv.add()
还是cv2.addWeighted()
都不能轻松地应用alpha通道。
抱歉,在5年后挖出这个未回答的“僵尸”问题。我的解决方案在仅有alpha通道信息时,以及rgb通道和alpha通道中都有信息时可以很好地工作。