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


问题内容

我正在使用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