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

7

我使用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。


如果您将图像发布到第三方网页上,我们可以通过编辑将其发布到您的问题中。 - Richard Erickson
你在哪里声明了“gray”? - pzp
抱歉,那是打错了。应该是“img”,我已经更正了。 - Rosy Li
1
我用一张*.jpg的图片尝试了这段代码,它可以工作!为什么*.png格式的图片不能工作呢? - Rosy Li
1个回答

6

通常情况下,当您在假定的白色画布上绘制一些黑线时,就会出现这种情况。大多数应用程序以透明背景导出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:     # 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通道。

抱歉,在5年后挖出这个未回答的“僵尸”问题。我的解决方案在仅有alpha通道信息时,以及rgb通道和alpha通道中都有信息时可以很好地工作。


1
太好了,它帮助我解决了同样的问题。 - Meir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接