【问题标题】:Plot RGB image with matshow failed - Invalid shape使用 matshow 绘制 RGB 图像失败 - 形状无效
【发布时间】:2021-05-11 05:54:08
【问题描述】:

我有 12 个波段的数组:

array
(53, 44, 12)

我想从这个数组创建 RGB 图像。 为了做到这一点,我知道我需要从阵列中切出 3,2 和 1 通道并从中创建图像。为了带走这些乐队,我这样做了:

red=array[:,:,3]
green=array[:,:,2]
blue=array[:,:,1]

#stack together:
rgb=np.stack((red,green,blue))

问题是,每当我想将图像显示为 rgb 时,都会出现错误:

fig, ax = plt.subplots(figsize=(20,10))
ax.matshow(rgb)

TypeError:图像数据的形状(3、44、12)无效

我解决它的第一个想法是改变轴的顺序,因为我认为它需要 3 作为行数,我使用了 np.moveaxis:

rgb=np.moveaxis(rgb, 0, -1).shape
rgb.shape
>>>
(44,12,3)

但是当我再次尝试使用 matshow 时,我又遇到了错误:

TypeError: Invalid shape (3,) for image data

我不确定我的错误在哪里,就像过去使用 matshow 一样有效。

我的最终目标是能够将三个波段绘制为 rgb 图像。

【问题讨论】:

    标签: python image numpy matplotlib rgb


    【解决方案1】:

    如果你有一张像这样有 12 个波段的图像:

    image[53,44,12]
    

    而你想要前三个频段,只需使用:

    b0b1b2 = image[..., :3]
    

    检查你有什么:

    print(b0b1b2.shape)
    (53, 44, 3)
    

    这是 Numpy slicing


    如果您想要波段 0、4 和 5,请使用

    b0b4b5 = image[..., [0,4,5]]
    

    【讨论】:

      【解决方案2】:

      您需要沿第 3 轴堆叠:

      rgb = np.dstack((red,green,blue))
      

      rgb = np.stack((red,green,blue), axis=2)
      

      正如Mark Setchell 已经指出的那样,您可以通过标准切片更轻松地完成同样的工作。如果您的 array 的 12 个波段实际上代表 4 个图像(每个 3 个通道),您还可以将数组沿轴 2 拆分为 4 个数组,如下所示:

      a1, a2, a3, a4 = np.split(array, 4, 2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2023-04-02
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多