478 Stimmen

Wie konvertiert man ein PIL-Bild in ein Numpy-Array?

Alright, ich bin herumspielen mit der Umwandlung eines PIL-Bild-Objekts hin und her zu einem Numpy-Array, so dass ich einige schnellere Pixel durch Pixel-Transformationen als PIL's tun können PixelAccess Objekt erlauben würde. Ich habe herausgefunden, wie man die Pixel-Informationen in einem nützlichen 3D-Numpy-Array mit Hilfe von:

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

Aber ich kann nicht scheinen, um herauszufinden, wie man es zurück in die PIL-Objekt zu laden, nachdem ich alle meine awesome Transformationen getan haben. Ich bin mir bewusst, dass die putdata() Methode, aber ich kann sie nicht dazu bringen, sich richtig zu verhalten.

469voto

dF. Punkte 70587

Sie sagen nicht, wie genau putdata() verhält sich nicht. Ich nehme an, Sie tun

>>> 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

Der Grund dafür ist putdata erwartet eine Folge von Tupeln, und Sie geben ihr ein Numpy-Array. Diese

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

funktioniert zwar, ist aber sehr langsam.

Ab PIL 1.1.6 wird die die "richtige" Art und Weise der Konvertierung zwischen Bildern und Numpy-Arrays ist einfach

>>> pix = numpy.array(pic)

obwohl das resultierende Array ein anderes Format hat als das Ihre (in diesem Fall ein 3-D-Array oder Zeilen/Spalten/rgb).

Nachdem Sie Ihre Änderungen an dem Array vorgenommen haben, sollten Sie in der Lage sein, entweder pic.putdata(pix) oder erstellen Sie ein neues Bild mit Image.fromarray(pix) .

362voto

endolith Punkte 23212

Ouvrir I als ein Array:

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

Machen Sie ein paar Sachen, um I und wandeln Sie es dann wieder in ein Bild um:

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

Source : Numpy-Bilder mit FFT filtern, Python

Wenn Sie es aus irgendeinem Grund explizit machen wollen, gibt es pil2array() und array2pil() Funktionen, die getdata() auf diese Seite in Korrelation.zip.

131voto

Daniel Punkte 1927

Ich verwende Pillow 4.1.1 (den Nachfolger von PIL) in Python 3.5. Die Konvertierung zwischen Pillow und Numpy ist unkompliziert.

from PIL import Image
import numpy as np
im = Image.open('1.jpg')
im2arr = np.array(im) # im2arr.shape: height x width x channel
arr2im = Image.fromarray(im2arr)

Zu beachten ist, dass der Pillow-Stil im ist spaltenbetont, während numpy-style im2arr ist zeilenweise. Allerdings ist die Funktion Image.fromarray trägt dem bereits Rechnung. Das heißt, arr2im.size == im.size y arr2im.mode == im.mode im obigen Beispiel.

Bei der Verarbeitung der transformierten Numpy-Arrays sollten wir auf das HxWxC-Datenformat achten, z. B. durch die Transformation im2arr = np.rollaxis(im2arr, 2, 0) o im2arr = np.transpose(im2arr, (2, 0, 1)) in das Format CxHxB.

38voto

Billal Begueradj Punkte 17260

Auf diese Weise müssen Sie Ihr Bild in ein Numpy-Array umwandeln:

import numpy
import PIL

img = PIL.Image.open("foo.jpg").convert("L")
imgarr = numpy.array(img)

35voto

Kamran Gasimov Punkte 867

Konvertieren Numpy to PIL Bild und 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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X