【问题标题】:Understand python image arrays了解python图像数组
【发布时间】:2019-12-11 21:15:31
【问题描述】:

我可以像这样声明一个 3D 数组:

3D 数组,形状-(2, 2, 2)

3D_array = np.array([[[0, 1],[2, 3]], [[4, 5],[6, 7]]])

所以如果我有一个图像10*10(pixels) 3 rgb 通道,image.shape 将是(3x10x10)。 但是我一直看到 image.shape 等于(10x10x3),我不明白为什么?

感谢您的关注。

【问题讨论】:

    标签: python arrays image


    【解决方案1】:

    通常在 numpy 和 matplotlib 中,RGB 通道位于最后一个轴上。这只是一个约定,因此您对此无能为力。如果您使用的程序使用其他约定(通道优先),您可以使用以下方式转换图像:

    channels_first_im = np.moveaxis(channels_last_im, 0, 1)
    

    反之:

    channels_last_im = np.moveaxis(channels_first_im, 0, -1)
    

    【讨论】:

      【解决方案2】:

      如果您对为什么约定图像数组的形状为 (N, M, 3) 而不是 (3, N, M) 感到困惑,让我们看看索引在这两种情况下的工作原理。

      假设我们有一个名为image_array 的图像,它表示一个宽度和高度为100 像素的随机颜色,让我们尝试对其进行索引以访问索引(50, 50) 处的像素值。

      渠道优先

      import numpy as np
      
      image = np.random.random((3, 100, 100)) #image.shape == (3, 100, 100)
      pixel = image[:, 50, 50] #pixel.shape == (3,)
      

      最后一个频道

      import numpy as np
      
      image = np.random.random((100, 100, 3)) #image.shape == (100, 100, 3)
      pixel = image[50, 50] #pixel.shape == (3,)
      

      将通道作为数组的最后一维,意味着单个像素信息更易于索引查找。在第一种情况下,我们需要指定每次都需要整个第一个维度。这些本质上是相同的,但是将通道放在最后可以让我们在如何索引数组方面不那么冗长。

      【讨论】:

      • 感谢四位您的澄清
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多