2016-03-01 4 views
2

Я заинтересован в чтении МПГ файл в питона в виде числового файла/матрицыПочитаю МПГ файл в Python

Прямо сейчас я открываю файл с

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

Когда я прочитал первую строчку, это выглядит, как и ожидалось

r.readline() 

производит

'P5\n' 

и следующая строка прекрасно

'1024 1024\n' 

и следующий

'255\n' 

, но затем я получаю серию бредом. Похоже, что некоторые шестнадцатеричные значения смешиваются с другими вещами.

Я не хочу просматривать файл как изображение, просто хочу посмотреть его в формате this.

+0

Вы читаете файл pgm стиля P5 в качестве документации, которую вы указываете для описания. «Таблетка», которую вы видите, это пиксельные данные, закодированные как байты между '' \ 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, похоже, прекрасно справляется с этим типом файла изображения. Большое спасибо за ваше время и усилия. –