2016-03-01 176 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似乎很好地處理這種類型的圖像文件。非常感謝您的時間和精力。 –