2016-05-27 7 views
1

PIL und tkinter verwenden, ich versuche, wie einige Manipulationen im pixelMatrix eines Bildes zu tun:Bild-Transformation in andere

start = Image.open("gua.jpg") 
sta = start.load() 
i,j = start.size 
current = np.zeros((i,j,3)) 

for ix in range(i): 
    for jx in range(j): 
     current[ix,jx] = [elem*0.5 for elem in sta[ix,jx]] 

current = np.asarray(current) 
current = Image.fromarray(current, "RGB") 
out = ImageTk.PhotoImage(current) 

panel.configure(image = out) 
panel.image = out 

Aber selbst wenn ich die Informationen von dem Image der pixelMatrix meiner Matrix passieren einfach (current[ix,jx] = sta[ix,jx]), mein Ergebnis ist zufällig, was mache ich falsch?

Vielen Dank!

enter image description here

P. S: Ich out = ImageTk.PhotoImage(start) ohne Probleme tun können.

+0

Nachdem Sie do 'current = np.asarray (current)' Wie sieht 'current' eigentlich aus? (drucke es aus und poste das erste Bit, ich weiß, dass es wirklich groß wird) –

+0

Wenn ich innerhalb der Schleife bin, drucke ich sta [ix, jx], aktuelle [ix, jx] das ist die Ausgabe: '(128, 128, 120) [128. 128. 120.]' nach dem Gießen es zu Array das ist, was ich bekomme: '... [[179. 179. 177.] [174. 174. 172 ....] [167. 167. 165.] , [73. 68. 64.] [84. 70. 67.] [153. 133. 132.]] ... ' –

+0

was erwartest du? Ich meine, was willst du machen? –

Antwort

1

Sie müssen angeben, dass die dtype Ihres Arrays ist np.uint8:

current = np.zeros((i,j,3),dtype=np.uint8) 

Wenn Sie dies nicht angeben, wenn PIL die .tobytes() Methode auf dem Array verwendet wird es Daten, die für "RGB" macht keinen Sinn, weil Es ist für Gleitkommazahlen.

Beachten Sie auch, dass fromarray Daten Zeile für Zeile nimmt so die Höhe der ersten Dimension des Arrays sein müssen, können Sie dieses Problem beheben, indem Sie einfach die transpose nehmen, bevor es zu fromarray vorbei:

img = Image.fromarray(current.transpose(1,0,2)) 
Verwandte Themen