1. ホーム
  2. パイソン

[解決済み】PILイメージをnumpyの配列に変換する方法は?

2022-03-25 06:02:44

質問

さて、私はPILの画像オブジェクトを前後にnumpy配列に変換して、PILの変換よりも高速なピクセル単位の変換を行うことができるように遊んでいます。 PixelAccess オブジェクトを使用することができます。 ピクセル情報を有用な3D numpy配列に配置する方法を考え出した。

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

しかし、私はすべての素晴らしい変換を行った後、それをPILオブジェクトに読み戻す方法を見つけ出すことができないようです。 私が知っているのは putdata() メソッドがありますが、うまく動作させることができないようです。

解決方法は?

具体的にどうすればいいのかがわからない putdata() が動作していない。していると推測されます。

>>> pic.putdata(a)
Traceback (most recent call last):
  File "...blablabla.../PIL/Image.py", line 1185, in putdata
    self.im.putdata(data, scale, offset)
SystemError: new style getargs format but argument is not a tuple

これは、以下の理由からです。 putdata はタプルのシーケンスを期待し、あなたはそれをnumpyの配列に与えています。これは

>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

は動作しますが、非常に遅くなります。

PIL 1.1.6以降では 画像とnumpyの配列を変換するための正しい方法 は単純に

>>> pix = numpy.array(pic)

が、結果の配列はあなたのものとは異なる形式です(この場合、3次元配列または行/列/rgb)。

そして、配列に変更を加えた後、次のいずれかを行うことができるはずです。 pic.putdata(pix) で新しい画像を作成するか Image.fromarray(pix) .