2017-11-27 10 views
0

Ich lerne, numpy zu verwenden, um Bilder zu manipulieren, aber die Farbinformation fehlte. Ich würde gerne herausfinden, warum das passiert.Farbinformationen fehlen in der Bildverarbeitung

Mein Ziel ist es, den Unterschied zwischen zwei Bildern zu extrahieren.

Toy problem: Extract Welly from the graph.

Null Schritt: Ladebibliothek

import numpy as np 
from PIL import Image 

Erster Schritt: Vectorize Bild mit RGBA Informationen

img_org = Image.open('lena.png').convert('RGBA') 
arr_org = np.array(img_org) 
img_mod = Image.open('lena_modified.png').convert('RGBA') 
arr_mod = np.array(img_mod) 
arr_diff= np.zeros_like(arr_mod) 

Zweiter Schritt: die Differenz zwischen zwei Finden Sie heraus, Bilder nach Logikregel

for i in range(arr_mod.shape[0]) : 
    for j in range(arr_mod.shape[1]) : 
     if np.all(arr_mod[i, j]) == np.all(arr_org[i, j]): 
      arr_diff[i,j] = (0,0,0,0) 
     else : 
      arr_diff[i, j] = arr_mod[i, j] 

Dritter Schritt: Schalten Sie das Bild RGBA Informationen zurück zum Bild

img_diff = Image.fromarray(arr_diff, 'RGBA') 
img_diff.save('ans_two.png') 

Ich hoffe, bunte Welly aus dem modifizierten Lena Bild zu bekommen. So

Allerdings habe ich keine Ahnung, es nur den Umriss/schwarzen Teil des Bildes erkennen. Ein möglicher Grund dafür?

enter image description here

Haftungsausschluss: Dies war ein homework von einem Kurs in NTU während 2017 Frühling angeboten. Ich folge diesem Kurs und lerne selbstständig. Du machst also keine Hausaufgaben für mich oder sonst jemanden. Vielen Dank!

+0

Sie können die 'absdiff' Methode verwenden, um das zu tun. Übrigens, wenn Sie können, sollten Sie immer die 'erwartete' Lösung bereitstellen. "Differenz" kann eine Menge Dinge bedeuten, streng genommen wäre es der Unterschied zwischen den Pixelwerten oder den kombinierten Unterschieden. – user1767754

+0

Danke für Ihren Kommentar. Ich habe einen Fehler gemacht, den Unterschied zwischen ihren Pixelwerten zu nehmen und lustige Ergebnisse zu erhalten. Die erwartete Lösung ist das Bild in der Mitte, wo unten rechts ein buntes Bild ist. Allerdings bin ich neugierig, warum ich nur die schwarze Kontur bekommen kann, während ich RGBA-Pixelwerte habe. – Ying

Antwort

1

Ihren RGB Vergleich ändern soll dieses Problem beheben:

if np.array_equal(arr_mod[i, j],arr_org[i, j]): 
     arr_diff[i,j] = (0,0,0,0) 
    else : 
     arr_diff[i, j] = arr_mod[i, j] 

Das Problem ist, weil np.all Wahr zurück, wenn alle Werte Wahr oder ihr Iness-Wert ist wahr sind, das folgende Beispiel wird return true in den interaktiven Konsole

np.all([2,3,4,5]) == np.all([1,2,3,4]) 

Diese falsche in der interaktiven Konsole zurück:

np.all([2,3,4,5]) == np.all([0,2,3,4]) 
0

Lassen Sie mich meinen Fehler genauer erklären. Genau wie @Abhijith PK Erklärung, np.all ist nicht zum Vergleichen Array-Wert (hier Pixelwert). Es wird überprüft, ob alle Werte im Array True sind.

Zum Beispiel überprüfe ich die untere rechte Ecke arr_org[511,511]=[ 75 18 18 255] & np.all([ 75 18 18 255])=True bedeutet, keiner der RGBA-Element ist Null.

jedoch für die schwarze Kontur, wird seine RGBA sein [ 0 0 0 255] & np.all([0 0 0 255])=False bedeutet einen Teil des RGBA Element Null ist.

Ich verwende den falschen Code, aber ich bekomme den Umriss zufällig.Dies liegt daran, dass im ursprünglichen Lena-Bild die meisten/alle RGBA-Pixelwerte nicht Null sind und np.all = True; während in dem modifizierten Lena-Bild der Umriss von Welly schwarz ist und Nullen in RGBA-Pixelwerten np.all = False aufweist. Da nur der schwarze Umriss false von np.all ausgegeben wird, bin ich glücklich, die Umrisse zu erhalten, indem ich np.all vergleiche.

Wieder ist die Verwendung von np.all falsch für meinen Fall. Es wird empfohlen, np.array_equal zu verwenden. Ich versuche nur, das Zusammentreffen von schwarzen Umrissen zu analysieren.