繁体   English   中英

NumPy将8位图像转换为16/32位图像

[英]NumPy convert 8-bit to 16/32-bit image

我正在使用OpenCV 2在YCbCr颜色空间中进行一些图像操作。 目前,由于RGB-> YCbCr-然后是YCbCr-> RGB,我可以检测到一些噪声,但是如文档所述:

如果将cvtColor与8位图像一起使用,转换将丢失一些信息。 对于许多应用程序,这不会引起注意,但是建议在需要全范围颜色的应用程序中使用32位图像,或者在进行操作之前先转换图像然后再转换回来。

所以我想将图像转换为16或32位,但是我没有找到如何使用NumPy进行转换。 有什么想法吗?

img = cv2.imread(imgNameIn)
# Here I want to convert img in 32 bits
cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB, img)
# Some image processing ...
cv2.cvtColor(img, cv2.COLOR_YCR_CB2BGR, img)
cv2.imwrite(imgNameOut, img, [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 0])

感谢@moarningsun,问题得以解决:

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

接受的答案不正确。 16位图像具有65536强度级别( 2^16 ),因此其值范围为065535

如果要从表示为从0到1的float数组的图像中获取16位图像,则必须将该数组的每个系数乘以65535

同样,优良作法是将最终结果的类型转换为所执行操作的最后一步。 这主要有两个原因:-如果您使用float执行除法或乘法运算,结果将返回float ,您将需要再次更改类型。 -通常(从术语的数学意义上来说),从浮点数到整数的转换会引入错误。 在操作的最后强制转换类型可防止错误传播。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM