我想使用以下代码创建灰色图像:
import numpy as np
import cv2
cv=cv2
s=np.zeros((240, 320, 3), dtype=int)
s[s==0]=128
cv.imshow('3', s)
cv.waitKey()
cv.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
但我得到了一个完全黑色的图像。当我将图像写入文件时,它确实是一个灰色图像:
fn='example.jpg'
cv.imwrite(fn, s)
Run Code Online (Sandbox Code Playgroud)
所以我必须更改int为uint8,然后一切正常。但我仍然很好奇为什么我必须使用uint8而不是int,是否有任何文档描述了这一点?
从文档,OpenCV 根据数组的类型改变其行为:
- 如果图像是 8 位无符号,则按原样显示。
- 如果图像是 16 位无符号或 32 位整数,则将像素除以 256。即值范围 [0,255*256] 映射到 [0,255]。
- 如果图像是 32 位浮点数,则像素值乘以 255。即值范围 [0,1] 映射到 [0,255]。
因此,以下都将产生相同的图像灰度图像:
s = np.zeros((240, 320), dtype=np.uint8)
s[s==0] = 128
Run Code Online (Sandbox Code Playgroud)
int32:
s = np.zeros((240, 320), dtype=np.int32)
s[s==0] = 128 * 256
Run Code Online (Sandbox Code Playgroud)
float32:
s = np.zeros((240, 320), dtype=np.float32)
s[s==0] = 128 / 256.0
Run Code Online (Sandbox Code Playgroud)