【问题标题】:Convert multichannel image into pixelwise pandas dataframe将多通道图像转换为像素级 pandas 数据帧
【发布时间】:2021-02-25 18:36:29
【问题描述】:

如果您有一个多波段图像,例如,尺寸为 1024 * 1024 * 200(列 * 行 * 波段),并且想要将其转换为以下形式的 pandas 数据框:

            Band    Value
1           1       0.14
2           1       1.18
3           1       2.56
.
.
.
209715198   200     1.01
209715199   200     1.15
209715200   200     2.00

所以基本上所有像素都是顺序形式的,以波段号(或波长)和像素值作为列。

有没有一种聪明而有效的方法来做到这一点而无需大量循环、附加到数组等等?

【问题讨论】:

    标签: pandas image dataframe


    【解决方案1】:

    回答

    你可以用 numpy.我会尽力在下面引导你。首先,您需要 3D numpy 数组中的输入图像。我只是要使用一个随机生成的小图来说明。这是完整的代码,下面有解释。

    import numpy as np
    import pandas as pd
    
    images = np.random.randint(0,9,(2,5,5))
    z, y, x = images.shape ## 2, 5, 5 (200, 1024, 1024 for your example)
    arr = np.column_stack((np.repeat(np.arange(z),y*x), images.ravel()))
    df = pd.DataFrame(arr, columns = ['Bands', 'Value'])
    

    说明

    images 输出数组如下所示(基本上是 2 张 5x5 像素的图像):

    [[[5 2 3 6 2]
      [6 1 6 3 2]
      [8 3 2 2 1]
      [5 1 2 6 0]
      [3 4 7 0 2]]
    
     [[1 7 0 7 3]
      [7 4 5 4 3]
      [1 5 4 7 4]
      [2 0 2 7 2]
      [7 0 1 6 7]]]
    

    下一步是使用np.ravel() 将其展平。这将输出您所需的值列:

    #images.ravel()
    [5 2 3 6 2 6 1 6 3 2 8 3 2 2 1 5 1 2 6 0 3 4 7 0 2 1 7 0 7 3 7 4 5 4 3 1 5
     4 7 4 2 0 2 7 2 7 0 1 6 7]
    

    要创建波段列,您需要将数组的 z 值重复 x*y 次。您可以使用np.repeat()np.arange() 来执行此操作。这给了你一个一维数组:

    #(np.repeat(np.arange(z),y*x))
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
     1 1 1 1 1 1 1 1 1 1 1 1 1]
    

    这是必需的波段列。为了结合,他们使用np.column_stack(),然后把它变成一个数据框。以上所有步骤相结合。应该是:

    arr = np.column_stack((np.repeat(np.arange(z),y*x), images.ravel()))
    df = pd.DataFrame(arr, columns = ['Bands', 'Value'])
    

    将输出:

         Bands  Value
    0       0      5
    1       0      2
    2       0      3
    3       0      6
    4       0      2
    5       0      6
    6       0      1
    7       0      6
    8       0      3
    9       0      2
    10      0      8
    11      0      3
    12      0      2
    13      0      2
    14      0      1
    15      0      5
    16      0      1
    17      0      2
    18      0      6
    19      0      0
    20      0      3
    21      0      4
    22      0      7
    23      0      0
    24      0      2
    25      1      1
    26      1      7
    27      1      0
    ...
    

    根据需要。我希望这至少能让你朝着正确的方向前进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2020-08-08
      相关资源
      最近更新 更多