2016-03-01 142 views
2

一个PGM文件我有兴趣阅读Python中的PGM文件作为数字文件/矩阵阅读蟒蛇

现在我打开与

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

文件当我读到的第一行,它看起来如预期

r.readline() 

产生

'P5\n' 

下一行是罚款

'1024 1024\n' 

和下

'255\n' 

但后来我得到一系列乱码。它看起来像一些十六进制值与其他东西混合。

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

+0

您正在阅读'P5' style pgm文件,并将其作为您要链接的文档进行描述。您看到的“乱码”是像素数据,编码为“'\ x00''到maxval之间的字节,显示为255(或''\ xff''')。应该有1024×1024字节的“乱码”代表图像数据。 – msw

+0

好的,那我该如何显示它作为数值数据(可能用空格分隔)而不是十六进制值等? –

+0

它看起来不仅仅是十六进制值,还有一些其他的东西。像这样':;; =><@> ?? A?@A @ ?? @?A?BEBACADAHHFEEHHFIFFEGKJLLJLMJKKJIJJFJFHHIGIIIHIILIKLNRNNSTUY] lw' –

回答

3

按照上图所示读取标题后,您将获得宽度(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会吵闹失败;处理这种情况的代码留给读者作为练习。

+0

100%的光彩! –

+1

我也学习PIL似乎很好地处理这种类型的图像文件。非常感谢您的时间和精力。 –