2016-06-01 16 views
3

Angenommen, ich habe ein 2D-Numpy-Array von Werten im Bereich von 0 bis 1, das ein Graustufenbild darstellt. Wie konvertiere ich das dann in ein PIL Image-Objekt? Alle bisherigen Versuche haben extrem seltsame Pixel oder schwarze Bilder ergeben.2D-Numpy-Array von Graustufenwerten in ein PIL-Bild konvertieren

for x in range(image.shape[0]): 
    for y in range(image.shape[1]): 
     image[y][x] = numpy.uint8(255 * (image[x][y] - min)/(max - min)) 

#Create a PIL image. 
img = Image.fromarray(image, 'L') 

In dem obigen Code wird das Bild durch numpy Array normalisiert (image [x] [y] - min)/(max - min), so wird jeder Wert auf dem Bereich 0 bis 1. Es ist dann multipliziert mit 255 und in eine 8-Bit-Ganzzahl umgewandelt. Dies sollte theoretisch durch Image.fromarray mit Modus L in ein Graustufenbild - aber das Ergebnis ist eine Reihe von verstreuten weißen Pixeln.

+1

Verwenden Sie eine aktuelle Version von ['Pillow'] (https://pillow.readthedocs.org/), eine gepflegte Verzweigung von PIL, oder verwenden Sie die ursprüngliche PIL? – MattDMo

+0

+ MattDMo Ich benutze die neueste Version von Pillow, und ich verwende insbesondere Python 3.4 –

+1

Bitte bearbeiten Sie Ihre Frage und posten Sie, was Sie bisher versucht haben, einschließlich Beispiel Eingabe, erwartete Ausgabe, die tatsächliche Ausgabe (falls vorhanden) und den ** Volltext ** aller Fehler oder Rückverfolgungen. – MattDMo

Antwort

1

Wenn ich Sie Frage verstanden habe, möchten Sie ein Graustufenbild mit PIL bekommen.

Wenn dies der Fall ist, müssen Sie nicht jedes Pixel multiplizieren mit 255

Das funktioniert für mich folgende

import numpy as np 
from PIL import Image 

# Creates a random image 100*100 pixels 
mat = np.random.random((100,100)) 

# Creates PIL image 
img = Image.fromarray(mat, 'L') 
img.show() 
+3

Ich habe dies versucht und sehr offensichtliche Bildartefakte bekommen - Es gab sichtbare vertikale Balken alle 7 oder so Pixel. Ist es möglich, dass die neueste Version von Pillow einfach gerade kaputt ist? –

1

Ich denke, die Antwort ist falsch. Die Image.fromarray (____, 'L') Funktion scheint nur mit einem Array von Ganzzahlen zwischen 0 und 255 richtig zu funktionieren. Ich benutze die Funktion np.uint8 dafür.

Sie können dies demonstrieren, wenn Sie versuchen, einen Farbverlauf zu erstellen.

import numpy as np 
from PIL import Image 

# gradient between 0 and 1 for 256*256 
array = np.linspace(0,1,256*256) 

# reshape to 2d 
mat = np.reshape(array,(256,256)) 

# Creates PIL image 
img = Image.fromarray(np.uint8(mat * 255) , 'L') 
img.show() 

macht einen sauberen Gradienten

vs

import numpy as np 
from PIL import Image 

# gradient between 0 and 1 for 256*256 
array = np.linspace(0,1,256*256) 

# reshape to 2d 
mat = np.reshape(array,(256,256)) 

# Creates PIL image 
img = Image.fromarray(mat , 'L') 
img.show() 

hat die gleiche Art von artifacting.

Verwandte Themen