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

时间:2014-06-27 05:08:20

标签: python opencv image-processing numpy

我正在使用OpenCV 2在YCbCr色彩空间中进行一些图像处理。目前我可以检测到由于转换RGB而产生的一些噪音 - > YCbCr然后YCbCr - > RGB,但如documentation中所述:

  

如果将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])

2 个答案:

答案 0 :(得分:1)

感谢@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

答案 1 :(得分:0)

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

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

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