Subtrahieren von Farben und Extrahieren von Transparenzwerten

Subtrahieren von Farben und Extrahieren von Transparenzwerten

Nehmen wir an, ein Bild wurde halbtransparent gemacht und mit einer flachen Hintergrundfarbe versehen. Das Originalbild, die Hintergrundfarbe und das Ergebnis (die Mischung) sind bekannt. Aber die hinzugefügte Transparenz (Alphawert) ist unbekannt und variiert im Bild. Gibt es eine automatische Möglichkeit, diesen zusätzlichen Transparenzwert für jedes Pixel des Bildes zu berechnen? Können wir diese Werte kopieren und auf ein anderes Bild anwenden?

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

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

Ein Beispiel für das Kopieren jedes hinzugefügten Transparenzwerts entsprechend den Bildpixeln:

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 natürlich möchte ich diese Werte nicht drucken. Ich möchte sie nur als Maske verwenden(?). So kann ich diese Werte auf ein anderes Bild anwenden, um denselben Effekt zu erzielen.

Antwort1

Die Transparenz wird mit dem Originalpixel multipliziert, nicht zu ihm addiert, um das gemischte Pixel zu erhalten. Siehe die Diskussion imPNG-Spezifikation.

Gehen Sie bei 8-Bit-Farbproben im Bereich von 0 bis 255 und einer Normalisierung auf den Bereich von 0 bis 1,0 für jeden Pixel im Bild wie folgt vor:

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

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

Lösen Sie nach "a" auf

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

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

Transparency = a * 255

Leider bedeutet dies, dass Sie die Transparenz (Alpha) nicht aus allen Pixeln extrahieren können. Insbesondere wenn Bild == Hintergrund (p - b == 0) ist, kann die Transparenz im Bereich zwischen 0 und 255 liegen (a == alles zwischen 0,0 und 1,0); wenn Sie diese Formel in einem Code verwenden, müssen Sie sich gegen Division durch Null schützen.

Wenn der Bildhintergrund ungleich Null ist, können Sie Transparenz erzielen, dies ist jedoch nicht sehr genau, wenn die Differenz (p – b) gering ist.

verwandte Informationen