为什么用 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.int32
或 np.int64
类型(这取决于您的机器)。如果您希望您的数组不做任何更改地显示,您应该确保将它们作为 8 位无符号传递。在你的情况下,像这样 -
cv2.imshow('', img.astype(np.uint8))
或者,在初始化数组时,按照 -
img = np.arange(..., dtype=np.uint8)
所以,我想使用 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.int32
或 np.int64
类型(这取决于您的机器)。如果您希望您的数组不做任何更改地显示,您应该确保将它们作为 8 位无符号传递。在你的情况下,像这样 -
cv2.imshow('', img.astype(np.uint8))
或者,在初始化数组时,按照 -
img = np.arange(..., dtype=np.uint8)