【问题标题】:Problems in displaying uint16 np.array as image将 uint16 np.array 显示为图像的问题
【发布时间】:2020-03-13 21:23:25
【问题描述】:

我有一个代表 RGB 图像的 uint16 3-dim numpy 数组,该数组是从 TIF 图像创建的。 问题是,当我在 QGIS 中导入原始图像时,例如显示正确,但如果我尝试在 python 中显示(使用 plt.imshow)结果不同(在这种情况下更绿色):

QGIS 图片:

绘图图片:

我认为这在某种程度上与 matplotlib 管理 uint16 的方式有关,但即使我尝试除以 255 并转换为 uint8,我也无法获得好的结果。

【问题讨论】:

  • 其实我看到QGIS中不同通道RGB的范围不一样,R =[0, 235], G =[0,363], B=[0,263]
  • 您是否尝试过将 R 除以 235、G 除以 363 等?仍然得到太绿色的输出?
  • 你除以 256,而不是技术上的 255

标签: python image numpy


【解决方案1】:

根据您的评论,图像未使用 RGB 颜色空间编码,因为假设每个通道 8 位,R、G 和 B 通道的值范围为 [0-255]。

我不确定图像使用的是哪种色彩空间,但 TIFF 文件通常使用针对打印进行了优化的 CMYK。

可以尝试的其他常见色彩空间包括 YCbCr (YUV) 和 HSL,但是随着显示硬件和视频流技术的进步,这些年来已经创建了许多变体。

要将整个图像转换为 RGB 颜色空间,我建议使用 opencv-python pip 包。该软件包有详细的文档,但作为示例,您可以将 numpy 数组 img 从 YUV 转换为 RGB:

img_bgr = cv.cvtColor(img, cv.COLOR_YUV2RGB)

【讨论】:

    【解决方案2】:

    当使用plt.imshow 时,你可以使用colormap 参数,例如尝试添加cmap="gray"

    plt.imshow(image, cmap="gray")
    

    来源: https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imshow.html

    【讨论】:

      【解决方案3】:

      如果我尝试标准化图像,我会得到很好的结果:

      对于每个频道: 图像[i,:,:] = 图像[i,:,:] / 图像[i,:,:].max()

      但是,有些图像看起来比其他图像更暗:

      different images

      【讨论】:

      • 相反,如果我将图像除以 65535 进行归一化(因为它们被编码为 uint16),我得到的像素值非常小,因此它们几乎完全是黑色的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多