用python读取pgm文件

用python读取pgm文件,python,file,file-read,pgm,Python,File,File Read,Pgm,我对阅读python中的pgm文件作为数字文件/矩阵感兴趣 现在我用 f = open('/home/matthew/NCM/mdb001.pgm', 'rb') 当我读到第一行时,它看起来和预期的一样 r.readline() 产生 'P5\n' 下一行就可以了 '1024 1024\n' 接下来呢 '255\n' 但后来我听到了一连串的胡言乱语。它看起来像是一些十六进制值与其他东西混合在一起 我不想以图像图片的形式查看该文件,我只想查看其格式。如图所示读取标题后,您得到了宽度(10

我对阅读python中的pgm文件作为数字文件/矩阵感兴趣

现在我用

f = open('/home/matthew/NCM/mdb001.pgm', 'rb')
当我读到第一行时,它看起来和预期的一样

r.readline()
产生

'P5\n'
下一行就可以了

'1024 1024\n'
接下来呢

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


我不想以图像图片的形式查看该文件,我只想查看其格式。

如图所示读取标题后,您得到了宽度(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

如果遇到这样的文件,
read\u pgm
会有噪音地失败;处理此类情况的代码留给读者作为练习。

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)
def read_pgm(pgmf):
“”“将PGM中的整数光栅作为列表列表返回。”“”
header=pgmf.readline()
断言头[:2]==b'P5'
(宽度、高度)=[int(i)表示页眉中的i.split()[1:3]]
深度=int(header.split()[3])

断言您正在阅读的
P5
样式的pgm文件,正如您链接到的文档所描述的那样。您看到的“乱七八糟”是以字节形式编码的像素数据,这些字节介于
'\x00'
到maxval之间,显示为255(或
'\xff
'`)。应该有1024×1024字节的“胡言乱语”表示图像数据。好吧,那么我如何将其显示为数字数据(可能用空格分隔)而不是十六进制值,等等?而且它似乎不仅仅是十六进制值,还有其他一些东西。像这样的
:;;=>??A?@A@@@A?Bebacadahfeehfiffegkjlljlkjijfjfjfhhigiiiliklinrnstuy]lw
我还了解到,PIL似乎能很好地处理这种类型的图像文件读取。非常感谢你的时间和努力。
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)