为什么 Opencv python 包装器中的数据类型必须是“uint8”?

zha*_*hen 4 python opencv

我想使用以下代码创建灰色图像:

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)

所以我必须更改intuint8,然后一切正常。但我仍然很好奇为什么我必须使用uint8而不是int,是否有任何文档描述了这一点?

uni*_*rio 5

文档,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)