Okay, ich spiele damit herum, ein PIL-Bildobjekt hin und her in ein numpy-Array zu konvertieren, damit ich einige Pixel-für-Pixel-Transformationen schneller durchführen kann, als es das PIL- PixelAccess
Objekt zulässt. Ich habe herausgefunden, wie man die Pixelinformationen in einem nützlichen 3D-Numpy-Array platziert:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Aber ich kann nicht herausfinden, wie ich es wieder in das PIL-Objekt laden kann, nachdem ich alle meine fantastischen Transformationen durchgeführt habe. Ich bin mir der putdata()
Methode bewusst , kann sie aber anscheinend nicht dazu bringen, sich zu verhalten.
pic.size[0]
undpic.size[1]
ausgetauscht werden sollten (dhreshape(pic.size[1], pic.size[0], 3)
), dasize
istwidth x height
oderx * y
, während die Matrixreihenfolge istrows x columns
.Antworten:
Sie sagen nicht, wie genau
putdata()
sich nicht verhält. Ich gehe davon aus, dass du es tustDies liegt daran,
putdata
dass eine Folge von Tupeln erwartet wird und Sie ihr ein numpy-Array geben. Dieswird funktionieren, aber es ist sehr langsam.
Ab PIL 1.1.6 ist die "richtige" Konvertierung zwischen Bildern und Numpy-Arrays einfach
obwohl das resultierende Array ein anderes Format als Ihr Array hat (3D-Array oder Zeilen / Spalten / RGB in diesem Fall).
Nachdem Sie Ihre Änderungen am Array vorgenommen haben, sollten Sie in der Lage sein, entweder
pic.putdata(pix)
ein neues Image zu erstellen oder ein neues Image mit zu erstellenImage.fromarray(pix)
.quelle
Image.fromarray
ist nicht in der PIL-Dokumentation (!) Aufgeführt, daher hätte ich es ohne dies nie gefunden.numpy.asarray(pic)
als "richtige" Art der Konvertierung aufgeführt, nichtnumpy.array(pic)
. Gemäß dieser Antwortarray
wird eine Kopie erstellt, während diesasarray
nicht derasarray
Fall ist (aber dann ist das Ergebnis schreibgeschützt).I
Als Array öffnen :Machen Sie dann einige Dinge
I
, um es wieder in ein Bild umzuwandeln:Filtern Sie numpy Bilder mit FFT, Python
Wenn Sie dies aus irgendeinem Grund explizit tun möchten, gibt es auf dieser Seite in korrelation.zip die Funktionen pil2array () und array2pil (), die getdata () verwenden .
quelle
import Image
zuerst? Haben Sie PIL installiert?uint8
Umstellung notwendig?numpy.asarray(Image.open(filename))
scheint für .jpg-Bilder zu funktionieren, aber nicht für .png. Das Ergebnis wird als angezeigtarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Es scheint keine offensichtlich benannten Methoden desPngImagePlugin.PngImageFile
Objekts zu geben, um dies zu lösen. Ich denke, ich sollte dies als neue Frage stellen, aber es ist sehr relevant für diesen Thread. Versteht jemand, was hier falsch läuft?getdata()
eine Sequenz wie das Objekt ( pillow.readthedocs.io/en/3.4.x/reference/… ) zurück, aber ein Kissenbild implementiert das__array_interface__
,numpy
mit dem auf die Rohbytes zugegriffen werden kann eines Bildes, ohne einen Iterator durchlaufen zu müssen (siehe github.com/python-pillow/Pillow/blob/… und docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Sie können sogar einfach verwendennumpy.array(PIL.Image.open('test.jpg'))
Ich verwende Pillow 4.1.1 (den Nachfolger von PIL) in Python 3.5. Die Umstellung zwischen Pillow und Numpy ist unkompliziert.
Eine Sache, die
im
beachtet werden muss, ist, dass der Kissenstil Spalten-Major ist, während der Numpy-Stilim2arr
Zeilen-Major ist. Die FunktionImage.fromarray
berücksichtigt dies jedoch bereits. Das heißt,arr2im.size == im.size
undarr2im.mode == im.mode
im obigen Beispiel.Wir sollten das HxWxC-Datenformat berücksichtigen, wenn wir die transformierten Numpy-Arrays verarbeiten, z. B. die Transformation
im2arr = np.rollaxis(im2arr, 2, 0)
oder dasim2arr = np.transpose(im2arr, (2, 0, 1))
CxHxW-Format.quelle
np.flipud
Fix erforderlich war . Obwohl mein PIL-Image von Grund auf neu erstellt wurdeImageDraw.Draw
. Ich denke, man muss vorsichtig sein, woher der Ursprung ihrer Koordinaten kommt.Sie müssen Ihr Bild folgendermaßen in ein Numpy-Array konvertieren:
quelle
.convert("L")
durch.convert("RGB")
Das Beispiel, das ich heute verwendet habe:
quelle
Wenn Ihr Bild in einem Blob-Format (dh in einer Datenbank) gespeichert ist, können Sie dieselbe von Billal Begueradj erläuterte Technik verwenden, um Ihr Bild von Blobs in ein Byte-Array zu konvertieren.
In meinem Fall brauchte ich meine Bilder, die in einer Blob-Spalte in einer DB-Tabelle gespeichert waren:
Ich habe dann eine Hilfsfunktion erstellt, um meinen Datensatz in np.array zu ändern:
Danach konnte ich die byteArrays in meinem neuronalen Netzwerk verwenden.
quelle
Numpy to PIL
Bild konvertieren undPIL to Numpy
quelle
Sie können das Bild in Numpy umwandeln, indem Sie das Bild nach dem Ausquetschen der Features in die Funktion Numpy () analysieren (Unnormalisierung).
quelle