【问题标题】:Why does saving an image with OpenCV result in a black image?为什么用 OpenCV 保存图像会导致黑色图像?
【发布时间】:2018-06-01 19:53:14
【问题描述】:

所以,我想使用 python Numpy 库创建一个 500x500 的白色图像,尽管我可以在 Photoshop 中轻松完成。下面的代码是有效的,图像是白色的(因为我使用 cv2.imsave 函数保存了图像,后来我用 windows 照片查看器打开了它)。但是当我尝试使用 cv2.imshow 函数显示它时,会显示黑色图像。这是为什么?这是cv2的缺点吗?

import cv2
import numpy as np

img = np.arange(500*500*3)
for i in range(500*500*3):
    img[i] = 255
img = img.reshape((500, 500, 3))
cv2.imwrite("fff.jpg", img)
cv2.imshow('', img)

【问题讨论】:

  • 您可能需要显示具有int8 数据类型的数组 - img.astype(np.uint8)?
  • 你明白了。我修改了第三行并添加了参数“dtype = np.uint8”并且它起作用了。很难找到它。我花了几个小时才找到它。
  • 我可以想象这是一个反复出现的问题,所以我找到了文档并在答案中链接到它。

标签: python numpy opencv cv2


【解决方案1】:

请注意,cv2 模块是 C++ OpenCV 包的薄包装。这是它的文档,与它们交互的 python 包装函数的签名不会改变。来自documentation -

void cv::imshow   (const String &winname,
       InputArray     mat 
 )        

在指定窗口中显示图像。

函数 imshow 在指定窗口中显示图像。 [...]

  • 如果图像是 8 位无符号图像,则按原样显示。
  • 如果图像是 16 位无符号或 32 位整数,则像素除以 256。即 即,取值范围 [0,255*256] 映射到 [0,255]。
  • 如果图像是32位浮点,则像素值乘以255。即取值范围[0,1]映射到[0,255]。

默认情况下,numpy 数组初始化为np.int32np.int64 类型(取决于您的机器)。如果您希望您的数组不做任何更改就显示出来,您应该确保将它们作为 8 位无符号传递。在你的情况下,像这样 -

cv2.imshow('', img.astype(np.uint8))

或者,在初始化数组时,这样做 -

img = np.arange(..., dtype=np.uint8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多