5

Python で読み取ろうとしている 16 ビットの PGM イメージがあります。どうやら (?) PIL はこの形式をサポートしていないようですか?

import Image
im = Image.open('test.pgm')
im.show()

大まかにイメージを示していますが、正しくありません。全体に暗い帯があり、img にはmode=L. これは、 16 ビット TIFF ファイルに関する初期の質問に関連していると思います。PILがサポートしていない16ビットは珍しいですか?PILまたは別の標準ライブラリ、または自家製コードを使用して、Pythonで16ビットPGMファイルを読み取る方法についてアドバイスはありますか?

4

3 に答える 3

4

のモードが必要です"L;16"。ただし"L"、PGM をロードするときに、PIL には File.c にハードコードされたモードがあるようです。16 ビット PGM を読み取れるようにするには、独自のデコーダーを作成する必要があります。

ただし、16 ビット イメージのサポートはまだ不安定なようです。

>>> im = Image.fromstring('I;16', (16, 16), '\xCA\xFE' * 256, 'raw', 'I;16') 
>>> im.getcolors()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 866, in getcolors
    return self.im.getcolors(maxcolors)
ValueError: image has wrong mode

PIL は 16 ビットで画像を読み取ることができると思いますが、実際に画像を保存して操作するのはまだ実験段階です。

>>> im = Image.fromstring('L', (16, 16), '\xCA\xFE' * 256, 'raw', 'L;16') 
>>> im
<Image.Image image mode=L size=16x16 at 0x27B4440>
>>> im.getcolors()
[(256, 254)]

0xCAFE値を と解釈しただけで、0xFE正確には正しくありません。

于 2011-09-09T15:44:29.590 に答える
1

これは、 NumPyに基づく一般的なPNM / PAMリーダーとPyPNGの文書化されていない関数です。

def read_pnm( filename, endian='>' ):
   fd = open(filename,'rb')
   format, width, height, samples, maxval = png.read_pnm_header( fd )
   pixels = numpy.fromfile( fd, dtype='u1' if maxval < 256 else endian+'u2' )
   return pixels.reshape(height,width,samples)

もちろん、この画像形式の書き込みには、通常、ライブラリの支援は必要ありません...

于 2013-02-03T01:33:35.183 に答える