2010-04-17 6 views
109

Ich habe ein Array thusly erstellt:Wie konvertiere ich ein numpliges Array in ein Bild (und zeige es an)?

import numpy as np 
data = np.zeros((512,512,3), dtype=np.uint8) 
data[256,256] = [255,0,0] 

Was ich dies ist ein einzelner roter Punkt in der Mitte eines 512x512 Bild anzeigen wollen. (Zumindest zu beginnen ... Ich denke, ich kann den Rest von dort herausfinden)

+1

Siehe auch http://stackoverflow.com/questions/902761/saving-a-numpy-array-as- Ein Bild, obwohl dieses die Einschränkung auferlegte, dass PIL nicht verwendet werden konnte. –

Antwort

96

könnten Sie PIL (und Anzeige), um ein Bild zu erzeugen:

from PIL import Image 
import numpy as np 

w, h = 512, 512 
data = np.zeros((h, w, 3), dtype=np.uint8) 
data[256, 256] = [255, 0, 0] 
img = Image.fromarray(data, 'RGB') 
img.save('my.png') 
img.show() 
+0

Das funktioniert wunderbar. Vielen Dank. – jlswint

+2

Es scheint, dass es einen Fehler gibt. Sie erstellen ein Array mit der Größe '(w, h, 3)', aber es sollte '(h, w, 3)' sein, da sich die Indizierung in PIL von der Indizierung in numpy unterscheidet. Es gibt eine verwandte Frage: http: // stackoverflow.com/questions/33725237/image-fromarray-changes-size – user502144

+0

@ user502144: Danke für den Hinweis auf meinen Fehler. Ich hätte ein Array mit der Form '(h, w, 3)' erstellen sollen. (Es ist jetzt behoben, oben.) Die Länge der ersten Achse kann als die Anzahl der Zeilen im Array und die Länge der zweiten Achse als die Anzahl der Spalten gedacht werden. So entspricht "(h, w)" einer Anordnung von "Höhe" "h" und "Breite" "w". 'Image.fromarray' wandelt dieses Array in ein Bild mit der Höhe" h "und der Breite" w "um. – unutbu

0

Mit pygame können Sie ein Fenster öffnen, erhalten die Oberfläche als ein Array von Pixeln und manipulieren, wie Sie von dort wollen. Sie müssen jedoch Ihr numpy Array in das Oberflächenarray kopieren, was viel langsamer ist als das Ausführen tatsächlicher Grafikoperationen auf den pygame Oberflächen selbst.

40

Kürzester Weg ist scipy zu verwenden, wie folgt aus:

from scipy.misc import toimage 
toimage(data).show() 

Dies erfordert die Installation von PIL oder Pillow.

Ein ähnlicher Ansatz erfordert auch PIL oder Kissen, aber die ein anderer Betrachter ist berufen kann: diese

from scipy.misc import imshow 
imshow(data) 
+0

Also ist diese Methode nicht kompatibel mit Python 3.5 ...? – bordeo

+0

@bordeo, warum wäre es nicht kompatibel mit 3.5? Es ist nur ein Import und ein paar Funktionsaufrufe. –

+0

PIL ist inkompatibel mit 3.5 (wird nicht installiert) – bordeo

145

Meinen Sie gerade?

from matplotlib import pyplot as plt 
plt.imshow(data, interpolation='nearest') 
plt.show() 
+2

Dies ist genauer als PIL. PIL skaliert/normalisiert die Array-Werte, während pyplot die tatsächlichen RGB-Werte so verwendet, wie sie sind. – GaryO

+2

Danke! verdient das Abzeichen der besten Antwort! –

+9

Vielleicht gut zu wissen: Wenn Sie Graustufenbilder anzeigen möchten, ist es ratsam, 'plt.gray()' einmal in Ihrem Code aufzurufen, um alle folgenden Graphen in Graustufen umzuschalten. Nicht was das OP will, aber trotzdem gut zu wissen. – Cerno

Verwandte Themen