cv2.imread和cv2.imshow返回所有零和黑色图像

时间:2015-07-27 14:52:19

标签: python

我使用PPT创建了一个* .png图像。

我想使用cv2-python来阅读并展示它。但是cv2.imshow给了我一个完整的黑色图像,上面没有任何内容。这是我的代码,我只是不知道哪里出错:

img = cv2.imread(r"C:/Users/.../Test_shapes.png")
print img.max(),img.shape
cv2.imshow('color_image',img)
cv2.waitKey()

P.S。 img.shape返回正确的形状(881,1803,3)。但img.max()返回0。

抱歉,我没有足够的声誉在这里添加图片。但是使用Matlab,我的* .png可以成功读取,最大值为108。

1 个答案:

答案 0 :(得分:2)

通常,当您在假定为白色的画布上绘制一些黑线时,会发生这种情况。即使可见的画布为白色,大多数应用程序也会导出具有透明背景的PNG。

结果是图像仅由黑色像素和透明像素组成。那些透明的通常也具有RGB值为0.0.0,因此,如果仅查看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:     # we have an alpha channel
  a1 = ~img[:,:,3]        # extract and invert that alpha
  img = cv2.add(cv2.merge([a1,a1,a1,a1]), img)   # add up values (with clipping)
  img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)    # strip alpha channel

cv2.imshow('aa', img); cv2.waitKey(0); cv2.destroyAllWindows() 

看来cv2根本不是透明胶片的朋友。 cv.add()cv2.addWeighted()都无法轻松应用Alpha通道。

对不起,五年后忍不住要挖出这个没有答案的僵尸。当alpha通道中只有信息,而rgb通道和alpha通道中都包含信息时,我的解决方案效果很好。

相关问题