Numpy 8位图像在opencv中的cvtColor()之前转换为16/32位图像

时间:2017-08-25 16:13:59

标签: python opencv numpy colors

我根据我的理解从阅读文档进行了一些测试,但偶然发现了这一点。

来源: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?

1 个答案:

答案 0 :(得分:3)

我不同意你所链接问题的答案。格式uint8可以表示256个整数值,即0到255 (2^8 - 1)的整数。 256不能表示为uint8uint16的范围是0到(2^16 - 1) = 65535

因此,如果您想要一个16位的图像,其色彩级别为65535,并且当您阅读图像并且格式[0, 1]时图像的强度值在float范围内时,需要将值乘以65535然后将数组转换为uint16

最好将最终结果的类型转换为您执行操作的最后一步。这主要有两个原因:   - 如果按浮点执行除法或乘法,结果将返回浮点数,您需要再次更改类型。   - 一般而言(在术语的数学意义上),转换    从float到integer引入了错误。铸造类型    操作的结束可以防止错误传播。

要返回8位(即256色),您需要将所有值乘以255 / 65535

同样的推理适用于具有2^32 = 4,294,967,296可能强度值的32位图像,即[0, 4294967295]范围内的值。这些数字变大,您宁愿使用浮点格式的32位图像,其中值包含在[0, 1]范围内。

PS:我发现你的代码很混乱,没有详细介绍。了解8/16/32/64位格式是图像中可能的强度等级数量的表示,这是使您能够理解对图像进行的变换的关键。