代码之家  ›  专栏  ›  技术社区  ›  Matt Cremeens

在python中读取pgm文件

  •  10
  • Matt Cremeens  · 技术社区  · 8 年前

    我有兴趣将python中的pgm文件读取为数字文件/矩阵

    现在我用打开文件

    f = open('/home/matthew/NCM/mdb001.pgm', 'rb')
    

    当我读到第一行时,它看起来像预期的那样

    r.readline()
    

    生产

    'P5\n'
    

    下一行是好的

    '1024 1024\n'
    

    下一个

    '255\n'
    

    但后来我听到了一系列的胡言乱语。它看起来像是一些十六进制值与其他东西混合在一起。

    我不想将文件视为图像图片,我只想在 this 总体安排

    3 回复  |  直到 8 年前
        1
  •  10
  •   msw    8 年前

    如图所示,读完标题后,您得到了宽度(1024)、高度(接下来的1024)和深度(255)。要获取像素数据,最容易逐个字节读取:

    def read_pgm(pgmf):
        """Return a raster of integers from a PGM as a list of lists."""
        assert pgmf.readline() == 'P5\n'
        (width, height) = [int(i) for i in pgmf.readline().split()]
        depth = int(pgmf.readline())
        assert depth <= 255
    
        raster = []
        for y in range(height):
            row = []
            for y in range(width):
                row.append(ord(pgmf.read(1)))
            raster.append(row)
        return raster
    

    此代码仅适用于8位深度图像,这就是为什么 assert 声明存在。

    PGM文件在一行上有标题信息是合法的,如下所示:

    P5 1024 1024 15
    

    如果您确实遇到这样的文件, read_pgm 将响亮地失败;处理这种情况的代码留给读者作为练习。

        2
  •  5
  •   GodsFighter    4 年前

    msw的回答引导我编写了以下函数,以读取16位.pmg图像,并使用他描述的标题类型:

    def read_pgm(pgmf):
    """Return a raster of integers from a PGM as a list of lists."""
       header = pgmf.readline()
       assert header[:2] == b'P5'
       (width, height) = [int(i) for i in header.split()[1:3]]
       depth = int(header.split()[3])
       assert depth <= 65535
    
       raster = []
       for y in range(height):
           row = []
           for y in range(width):
               low_bits = ord(pgmf.read(1))
               row.append(low_bits+255*ord(pgmf.read(1)))
           raster.append(row)
       return raster
    
    f = open(pgm_path, 'rb')
    im = read_pgm(f)
    f.close()
    im = np.array(im)
    

    我希望这有助于澄清如何使用先前给出的答案

        3
  •  0
  •   johnDanger Aman    3 年前

    有趣的是,matplotlib内置了此功能。

    下面的输出应该与@GodsFighter的答案相同。

    import matplotlib.pyplot as plt
    with open(f, 'rb') as pgmf:
        im = plt.imread(pgmf)