[FIXED] Warum macht Pil Convert (' RGB ') etwas transparent zu Schwarz, aber etwas zu Weiß?

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.

lenna1.png lenna2.png

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')

diff_res

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.

  1. Warum gibt es Bildunterschiede zwischen transparenten Bereichen?
  2. 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 lenna1die Alpha-Ebene links entfernt, dann die Alpha-Ebene selbst rechts:

Geben Sie hier die Bildbeschreibung ein

Und hier ist lenna2die Alpha-Ebene links entfernt, dann die Alpha-Ebene selbst rechts:

Geben Sie hier die Bildbeschreibung ein

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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like

[FIXED] Photoshop -Automatisierung

Ausgabe Ich möchte Photoshop-Aktionen über die Visual Basic-Benutzeroberfläche ausführen. Ich meine, wenn der Benutzer auf die Schaltfläche klickt,…