代码之家  ›  专栏  ›  技术社区  ›  Jame

如何根据给定的csv文件将像素值转换为另一个值?

  •  1
  • Jame  · 技术社区  · 8 年前

    我有一个二维图像标签(值从0到20)。我想根据csv文件中的表将图像中的像素值更改为另一个值

    Original value     New value
    
    0                      0
    1                      23
    2                      2
    3                      11
    4                      11
    5                      15
    ...
    

    我们可以用一种简单的方法

    label[label==0]=0
    label[label==1]=23
    label[label==2]=2
    label[label==3|label==4]=11
    label[label==5]=15
    

    对于上面的方法,我需要至少20行来进行转换,并仔细查看csv文件中的表来填写条件中的值。我们有更好的办法吗?我正在使用Python3.6

    更新时间: csv文件喜欢

    label1, 0, 0
    label2, 1, 23
    label3, 2, 2
    label4, 3, 11
    label5, 4, 11
    label6, 5, 15
    

    第一排只是名字,我们不在乎

    1 回复  |  直到 8 年前
        1
  •  1
  •   Dux    8 年前

    使用 numpy 阵列:

    import numpy as np
    
    Data = np.arange(25).reshape((5,5))
    
    #Data
    #array([[ 0,  1,  2,  3,  4],
    #       [ 5,  6,  7,  8,  9],
    #       [10, 11, 12, 13, 14],
    #       [15, 16, 17, 18, 19],
    #       [20, 21, 22, 23, 24]])
    
    switch = np.loadtxt('./test.txt', comment='#')
    

    switch 现在包含6行,其中第一行是旧数字,第二行是新数字。通过循环行数,我们可以更改像素值:

    for i in range(switch.shape[0]):
        Data[Data == switch[i, 0]] = switch[i, 1]
    
    #Data
    #array([[ 0, 23,  2, 11, 11],
    #       [15,  6,  7,  8,  9],
    #       [10, 11, 12, 13, 14],
    #       [15, 16, 17, 18, 19],
    #       [20, 21, 22, 23, 24]])
    

    test.txt文件:

    #old                  new
    0                      0
    1                      23
    2                      2
    3                      11
    4                      11
    5                      15
    

    编辑:

    如果您的数据是在一个.csv文件中,就像在您更新的问题中一样,只需调整 loadtxt 呼叫:

    switch = np.loadtxt('./text.txt', usecols=(1,2), delimiter=',')
    

    这样我们就忽略了第一列(numpy不能处理混合类型的数组(float和string))并且将分隔符从空白改为逗号。 注意:文件扩展名在这里并不重要,它可以是.txt或.csv或任何其他文件。只有文件内容才是重要的。