Python NumPy将8位图像转换为16/32位图像
我正在使用OpenCV 2在YCbCr颜色空间中进行一些图像处理。目前,我可以检测到由于转换RGB->YCbCr,然后是YCbCr->RGB而产生的一些噪声,但如中所述: 如果将cvtColor用于8位图像,则转换过程中会丢失一些信息。对于许多应用程序,这一点并不明显,但建议在需要完整颜色范围的应用程序中使用32位图像,或者在操作之前转换图像,然后再转换回 所以我想将我的图像转换为16或32位,但我没有找到如何使用NumPy。一些想法Python NumPy将8位图像转换为16/32位图像,python,opencv,image-processing,numpy,Python,Opencv,Image Processing,Numpy,我正在使用OpenCV 2在YCbCr颜色空间中进行一些图像处理。目前,我可以检测到由于转换RGB->YCbCr,然后是YCbCr->RGB而产生的一些噪声,但如中所述: 如果将cvtColor用于8位图像,则转换过程中会丢失一些信息。对于许多应用程序,这一点并不明显,但建议在需要完整颜色范围的应用程序中使用32位图像,或者在操作之前转换图像,然后再转换回 所以我想将我的图像转换为16或32位,但我没有找到如何使用NumPy。一些想法 img = cv2.imread(imgNameIn) #
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
),因此,值的范围从0
到65535
如果要从表示为0到1的浮点
数组的图像中获得16位图像,必须将该数组的每个系数乘以65535
此外,将最终结果的类型转换为您执行的操作的最后一步也是一种很好的做法。
这主要有两个原因:
-如果按float
执行除法或乘法,结果将返回float
,您需要再次更改类型。
-一般来说(从术语的数学意义上讲),从浮点到整数的转换可能会引入错误。在操作结束时强制转换类型可防止错误传播。有关提示,请将其作为答案写入并接受,以便将其标记为“已解决”。很抱歉,我没有看到任何按钮接受答案并将问题标记为已解决,我该怎么办?@user3263033您需要发布一个问题的答案,然后单击答案旁边的勾号,以接受它“乘法的结果……通常返回一个浮点数”——请您提供一些这种情况的演示吗?@DanMašek我的意思是“一般”“在数学意义上——至少一次。我以更清晰的方式重新写下了我的想法。感谢您指出我的答案令人困惑。您也可以使用
cv2.normalize(img,dst=None,alpha=0,beta=65535,norm_type=cv2.norm_MINMAX)
获得正确的16位值