为什么使用OpenCV保存图像会导致图像变黑?

5 python opencv numpy cv2

因此,我想使用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)
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 4

请注意,该cv2模块是 C++ OpenCV 包的薄包装。这是它的文档,并且连接它们的 python 包装函数的签名不会改变。从文档中-

void cv::imshow   (const String &winname,
       InputArray     mat 
 )        
Run Code Online (Sandbox Code Playgroud)

在指定窗口中显示图像。

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

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

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

cv2.imshow('', img.astype(np.uint8))
Run Code Online (Sandbox Code Playgroud)

或者,在初始化数组时,请执行以下操作:

img = np.arange(..., dtype=np.uint8)
Run Code Online (Sandbox Code Playgroud)