Subtrahieren von Farben und Extrahieren von Transparenzwerten

0

Nehmen wir an, ein Bild wurde halbtransparent gemacht und auf einer flachen Hintergrundfarbe hinzugefügt. Das Originalbild, die Hintergrundfarbe und das Ergebnis (Mischung) sind bekannt. Diese zusätzliche Transparenz (Alpha-Wert) ist jedoch unbekannt und variiert entlang des Bildes. Gibt es eine automatisierte Methode, um diesen zusätzlichen Transparenzwert für jedes Bildelement zu berechnen? Können wir diese Werte kopieren und auf ein anderes Bild anwenden?

[Bild + Transparenz (unbekannt und variiert)] +   FlatBackground = Mix (undurchsichtig)

= [Halbtransparentes Bild] + Flacher Hintergrund = Mischen (undurchsichtig)

Ein Beispiel für das Kopieren jedes hinzugefügten Transparenzwerts, der Bildpixeln entspricht:

for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120

Aber ich möchte diese Werte natürlich nicht ausdrucken. Ich möchte es nur als Maske benutzen (?). Damit kann ich diese Werte auf ein anderes Bild anwenden, um den gleichen Effekt zu erzielen.

destor
quelle
Würde etwas wie "color to alpha" helfen? Das heißt Eine Hintergrundfarbe wird als vollständig transparent interpretiert, und nahe liegende Farben werden als halbtransparent interpretiert.
George

Antworten:

0

Die Transparenz wird mit dem Originalpixel multipliziert und nicht zu diesem addiert, um das gemischte Pixel zu erhalten. Siehe die Diskussion in der PNG-Spezifikation .

Angenommen, 8-Bit-Farbmuster im Bereich von 0..255 und Normalisierung bis 0..1.0 führen Sie dies für jedes Pixel im Bild aus:

m = Mix/255
p = Picture/255
a = alpha = Transparency/255

m = (p * a) + (b * (1.0 - a))

Löse nach "a"

a = (m - b) / (p - b)

Zurück in den ursprünglichen Bereich konvertieren, z. B. 0..255:

Transparency = a * 255

Leider bedeutet dies, dass Sie Transparenz (Alpha) nicht aus allen Pixeln extrahieren können. Insbesondere wenn Bild == Hintergrund (p - b == 0), könnte die Transparenz irgendetwas im Bereich von 0..255 sein (a == irgendetwas von 0.0 bis 1.0); Wenn Sie diese Formel in einem Code verwenden, müssen Sie sich gegen das Teilen durch Null schützen.

Wenn der Bildhintergrund nicht Null ist, können Sie Transparenz erhalten, aber es ist nicht sehr genau, wenn der Unterschied (p - b) klein ist.

Glenn Randers-Pehrson
quelle