如何在Python openCV中显示16位4096强度图像?

时间:2018-05-29 19:34:17

标签: python opencv image-processing computer-vision

我的图像采用灰度16位tiff格式编码。它们使用16位颜色深度的变体,其中最大强度为4,096。

我相信openCV中的默认最大强度是65,536,所以我的图像使用以下代码显示为黑色。

import cv2

image = cv2.imread("test.tif", -1)

cv2.imshow('tiff', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(image)

enter image description here

我可以在vmin中使用vmaxmatplotlib来配置颜色映射:

import cv2
import matplotlib.pyplot as plt 

image = cv2.imread("test.tif", -1)
plt.imshow(image, cmap="gray", vmin=0, vmax=4096)
plt.show()

它显示图像的内容:

enter image description here

我想坚持使用openCV matplotlib并不支持显示16位RGB图像。

cv2.imshow的{​​{3}}并没有多大帮助。有没有办法在Python openCV中显示16位4096强度图像?

可以找到测试图片test.tif {。{3}}。

1 个答案:

答案 0 :(得分:3)

您希望在显示之前使用cv2.normalize()缩放图像。

您可以设置图像的最小值/最大值,它会适当地缩放图像(通过将图像的最小值移动到alpha并将图像的最大值移动到beta)。假设您的img已经是uint16

img_scaled = cv2.normalize(img, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX)

然后你可以正常查看。

默认情况下,cv2.normalize()会生成与输入图像类型相同的图像,因此如果您想要无符号的16位结果,则输入应为uint16

再次注意,这会线性延伸您的图像范围 - 如果您的图像实际上从未达到0并且说最低值为100,则在您标准化之后,该最低值将是您设置alpha的任何值。如果您不想这样做,正如其中一条评论所暗示的那样,您可以简单地将图像乘以16,因为它目前只能达到4095.使用* 16,它将达到65535。