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

如何在Python openCV中显示16位4096强度图像?,python,opencv,image-processing,computer-vision,Python,Opencv,Image Processing,Computer Vision,我有灰度16位tiff格式编码的图像。它们使用16位颜色深度的变体,其中最大强度为4096 我相信openCV中的默认最大强度是65536,所以我的图像使用以下代码显示为黑色 import cv2 image = cv2.imread("test.tif", -1) cv2.imshow('tiff', image) cv2.waitKey(0) cv2.destroyAllWindows() print(image) 我可以使用matplotlib中的vmin和vmax来配置颜色映射:

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

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

import cv2

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

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

我可以使用
matplotlib
中的
vmin
vmax
来配置颜色映射:

import cv2
import matplotlib.pyplot as plt 

image = cv2.imread("test.tif", -1)
plt.imshow(image, cmap="gray", vmin=0, vmax=4096)
plt.show()
它显示图像的内容:

我坚持使用openCV的原因是
matplotlib
不支持显示16位RGB图像

cv2.imshow
的作用不大。有没有办法在Python openCV中显示16位4096强度图像

可以找到测试图像
test.tif

在显示之前,您需要使用它缩放图像

您可以设置图像的最小/最大值,它将适当缩放图像(通过将图像的最小值移动到
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。

可能将图像乘以16以显示,即65536/4096。我猜
cv2。equalizeHist
应该可以。或者
cv2。normalize
@jodis normalize yes,equalize no。均衡是一种非线性映射,一般来说,您不想这样做。