为什么用 OpenCV 保存图像会产生黑色图像?

Why does saving an image with OpenCV result in a black image?

所以,我想使用 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)

请注意,cv2 模块是 C++ OpenCV 包的精简包装器。这是它的文档,签名不会因连接它们的 python 包装函数而改变。来自 documentation -

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

Displays an image in the specified window.

The function imshow displays an image in the specified window. [...]

  • If the image is 8-bit unsigned, it is displayed as is.
  • If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].
  • If the image is 32-bit floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].

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

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

或者,在初始化数组时,按照 -

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