376

了解しました。PIL画像オブジェクトをnumpy配列に前後に変換して、PILのPixelAccessオブジェクトよりも高速なピクセルごとの変換を実行できるようにしています。次の方法で、ピクセル情報を便利な3Dnumpy配列に配置する方法を理解しました。

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

しかし、すばらしい変換をすべて行った後、それをPILオブジェクトにロードする方法がわからないようです。私はそのputdata()方法を知っていますが、それを動作させることができないようです。

4

8 に答える 8

386

あなたは正確にどのように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).

于 2008-12-21T20:46:21.473 に答える
275

I配列として開く:

>>> I = numpy.asarray(PIL.Image.open('test.jpg'))

にいくつかのことを行ってからI、それを画像に変換します。

>>> im = PIL.Image.fromarray(numpy.uint8(I))

ソース: FFT、Python で numpy 画像をフィルター処理する

何らかの理由で明示的に行いたい場合は、このページの correlation.zipに getdata() を使用する pil2array() および array2pil() 関数があります。

于 2009-07-08T02:33:17.417 に答える
33

次の方法で、画像を numpy 配列に変換する必要があります。

import numpy
import PIL

img = PIL.Image.open("foo.jpg").convert("L")
imgarr = numpy.array(img) 
于 2016-06-07T09:18:59.997 に答える
27

Numpy to PIL画像を変換してPIL to Numpy

import numpy as np
from PIL import Image

def pilToNumpy(img):
    return np.array(img)

def NumpyToPil(img):
    return Image.fromarray(img)
于 2020-05-30T17:07:47.443 に答える