我根据阅读文档的理解进行了一些测试,但偶然发现了这一点。
来源:NumPy convert 8-bit to 16/32-bit image
i = cv2.imread(imgNameIn, cv2.CV_LOAD_IMAGE_COLOR) # Need to be sure to have a 8-bit input
img = np.array(i, dtype=np.uint16) # This line only change the type, not values
img *= 256 # Now we get the good values in 16 bit format
但是从我在这里读到的 http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html
要从 32 位缩小到 8 位,必须除以 255,而不是上面提到的我从另一篇文章中得到的 256?下面的代码是我正在尝试使用的代码。
如果有人能够检查我是否正确完成了缩放,我将不胜感激。 我问这个问题主要是为了确认一下假定的类型转换值是255还是256?
最佳答案
我不同意您链接的问题的答案。格式uint8
可以表示256个整数值,即从0到255的整数(2^8 - 1)
。 256 不能表示为 uint8
。 uint16
的范围从 0 到 (2^16 - 1) = 65535
。
因此,如果您想要 16 位、具有 65535 个颜色级别的图像,并且当您读取图像和格式时,图像的强度值在 [0, 1]
范围内float
,您需要将这些值乘以 65535,然后将数组转换为 uint16
。
最好将最终结果的类型转换为所执行操作的最后一步。这主要有两个原因: - 如果您执行 float 除法或乘法,结果将返回 float ,您将需要再次更改类型。 - 一般来说(在该术语的数学意义上),一个变换 从浮点到整数会引入错误。类型转换类型 操作的最后阶段可防止错误传播。
要返回到 8 位,即 256 个颜色级别,您需要将所有值乘以 255/65535
。
同样的推理也适用于具有 2^32 = 4,294,967,296
可能强度值(即 [0, 4294967295]
范围内的值)的 32 位图像。这些数字变得很大,您宁愿使用浮点格式的 32 位图像,其中值包含在 [0, 1]
范围内。
PS:我发现你的代码很困惑,没有详细说明。了解 8/16/32/64 位格式表示图像中可能的强度级别数量是让您了解对图像进行的转换的关键。
关于python - opencv中cvtColor()之前Numpy 8位图像转换为16/32位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885576/