Ausgabe
Ich habe zwei ähnliche maskierte Bilder mit transparentem Hintergrund. Ich möchte Bildunterschiede erzielen und erwarte einen so geringen Wert, da Bilder ähnlich sind.
Aber das Ergebnis zeigt einen großen Unterschied zum transparenten Bereich, der genauso aussieht.
(weiß bedeutet diff)
diff_res = ImageChops.difference(lenna1, lenna2).convert('RGB')
Ich habe den Bildunterschied zwischen lenna1 und lenna2 auf einer Website überprüft und es heißt, dass die Bilder bis auf kleine Unterschiede an den Grenzen gleich sind.
Ich habe dann Alphakanalwert vermutet und lenna1, lenna2 in ‘RGB’ umgewandelt. und es zeigt den Hintergrund des einen schwarz, aber den des anderen weiß.
lenna1 = Image.open('lenna1.png')
lenna2 = Image.open('lenna2.png')
converted_lenna1 = lenna1.convert('RGB')
converted_lenna2 = lenna2.convert('RGB')
konvertierte_lenna1 konvertierte_lenna2
Jetzt weiß ich, dass convert() standardmäßig transparente Bereiche in Schwarz umwandelt. Aber ich verstehe es immer noch nicht.
- Warum gibt es Bildunterschiede zwischen transparenten Bereichen?
- Warum wurde ein transparentes Bild weiß und wie kann ich mein eigenes transparentes Bild “wird weiß” erstellen?
*Ich habe auch mit dem gleichen Alpha-Level mit .putalpha() getestet
Vielen Dank für das Lesen dieser Frage.
Lösung
Beide Bilder enthalten Transparenz, es ist nur so, dass bei einem transparente weiße Pixel und bei dem anderen transparente schwarze Pixel vorhanden sind. Eine andere Art, dasselbe auszudrücken, ist, dass die zugrunde liegende Farbe transparenter Pixel in einem Bild schwarz und im anderen weiß ist. Sie können den Unterschied nicht sehen, weil sie transparent sind!
Hier ist lenna1
die Alpha-Ebene links entfernt, dann die Alpha-Ebene selbst rechts:
Und hier ist lenna2
die Alpha-Ebene links entfernt, dann die Alpha-Ebene selbst rechts:
Sie können sie gleich machen, indem Sie alle transparenten Pixel finden und sie so weiß machen:
# Load the image and make into Numpy array
rgba = np.array(Image.open('lena2.png'))
# Make image transparent white anywhere it is transparent
rgba[rgba[...,-1]==0] = [255,255,255,0]
# Make back into PIL Image and save
Image.fromarray(rgba).save('result.png')
Wenn Sie die transparenten Pixel blau sichtbar machen möchten, damit Sie sie zum Testen sehen können, verwenden Sie:
rgba[rgba[...,-1]==0] = [0,0,255,255]
Wenn Sie ImageMagick installiert haben, können Sie im Terminal alle transparenten Pixel zwingen, die Farbe Ihrer Wahl anzunehmen, z. B. Magenta:
magick lenna1.png -background magenta -alpha background result.png
Das bedeutet oft, dass Sie die PNG-Komprimierung verbessern und die Größe der PNG-Dateien verringern können, indem Sie alle transparenten Pixel schwarz machen, und infolgedessen lässt sich das Bild wahrscheinlich viel besser komprimieren, als wenn die transparenten Pixel alle sehr unterschiedliche Farben haben:
magick image.png -background black -alpha background result.png
Beantwortet von – Mark Setchell
Antwort geprüft von – Senaida (FixError Volunteer)