PIL イメージを NumPy 配列に変換するにはどうすればいいですか? 質問する

PIL イメージを NumPy 配列に変換するにはどうすればいいですか? 質問する

ImagePIL よりも高速なピクセル単位の変換が行えるように、PIL を NumPy 配列に変換するにはどうすればよいですかPixelAccess? 次のようにして NumPy 配列に変換できます。

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

Imageしかし、配列を変更した後、それを PIL に再度ロードするにはどうすればpic.putdata()よいでしょうか? うまく機能しません。

ベストアンサー1

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)

おすすめ記事