我根据我的理解从阅读文档进行了一些测试,但偶然发现了这一点。
来源: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?
答案 0 :(得分:3)
我不同意你所链接问题的答案。格式uint8
可以表示256个整数值,即0到255 (2^8 - 1)
的整数。 256不能表示为uint8
。 uint16
的范围是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位格式是图像中可能的强度等级数量的表示,这是使您能够理解对图像进行的变换的关键。