代码之家  ›  专栏  ›  技术社区  ›  Jay Wang

如何在python opencv中显示16位4096强度图像?

  •  2
  • Jay Wang  · 技术社区  · 6 年前

    我有图像编码为灰度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)
    

    enter image description here

    我可以用 vmin vmax 在里面 matplotlib 要配置颜色映射:

    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图像。

    这个 documentation 属于 cv2.imshow 不是很有帮助。有没有在python opencv中显示16位4096强度图像的方法?

    测试图像 test.tif 可以找到 here .

    1 回复  |  直到 6 年前
        1
  •  5
  •   alkasm Anuj Gautam    6 年前

    你会想用的 cv2.normalize() 在显示前缩放图像。

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

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

    然后你可以正常查看。

    默认情况下, cv2.规范化() 将生成与输入图像相同类型的图像,因此如果希望得到无符号16位结果,则输入应为 UIT16


    同样,请注意,这会线性地扩展您的图像范围——如果您的图像从未实际达到0,并且说最低值是100,则在正常化之后,最低值将是您设置的任何值。 阿尔法 去。如果你不想这样做,正如其中一条评论所暗示的那样,你可以简单地将你的图像乘以16,因为它目前只达到4095。使用*16,它将达到65535。