在python中读取一个pgm文件

时间:2016-03-01 13:10:32

标签: python file file-read pgm

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

现在我用

打开文件
f = open('/home/matthew/NCM/mdb001.pgm', 'rb')

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

r.readline()

产生

'P5\n'

,下一行很好

'1024 1024\n'

和下一个

'255\n'

然后我得到了一系列的胡言乱语。看起来有些十六进制值与其他内容混合在一起。

我不想将该文件视为图片图片,我只想以this格式查看。

2 个答案:

答案 0 :(得分:5)

如您所示,在阅读了标题后,您已获得高度(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将会失败;处理此类案件的代码留给读者练习。

答案 1 :(得分:2)

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)

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