Das Problem ist womöglich nicht immer eindeutig lösbar. Angenommen man
hat folgende 2 Szenarien:
1) Pixel des Overlay sind entweder Volltransparent oder nicht
Transparent
2) Pixel des Overlay sind Teiltransparent
Im ersten Szenario ist es simpel, immer wenn das selbe Pixel bei beiden
Bildern andere Werte haben ist es teil des Overlays.
Aber im zweiten fall hast du ein Problem. Angenommen ein Pixel des
Originalbilds war Schwarz ohne Transparenz, und das Overlay war Weiss
mit 50% Transparenz. Das resultat wäre Grau ohne Transparenz. Wäre das
Overlay jedoch nicht Transparent, sondern Grau, wäre das resultat
ebenfalls Grau. In dem Fall könnte man somit nicht zwichen 50%
transparentem weissem Overlay oder nicht transparentem Overlay
unterscheiden. Wäre das Originalbild aber 100% Transparent, könnte man
wieder die Methode von fall 1 anwenden. Somit kann man mit dem
Transparentzlevel des Originalbilds einschränken, in welchem Bereich die
Werte des Pixels des Overlays je nach Werten der Pixel der
Vergleichsbilder Liegen.
Jetzt rechne ich das mal nach, ich hoffe ich verrechne mich nicht.
Gegeben sind die Vektoren A, B und C, welche ein correspondierendes
Pixel von Original, Overlay, und Resultat repräsentieren. Der
einfachheit halber verwende ich komponente 0 als Opazität, und den rest
für die Farben. Als Wertebereich verwende ich hier 0 bis 1. C wäre also
so zu berechnen, glaub ich:
1 | C = [
|
2 | (1-A0) * B0 + A0
|
3 | (1-B0) * A1 + B0 * B1
|
4 | (1-B0) * A2 + B0 * B2
|
5 | (1-B0) * A3 + B0 * B3
|
6 | ]
|
Jetzt brauchen wir aber B anhand von A und C. Dazu stellen wir ein
Gleichungssystem auf:
1 | B0 = (C0 - A0) / ( 1 - A0)
|
2 | B0 = (C1 - A1) / (B1 - A1)
|
3 | B0 = (C2 - A2) / (B2 - A2)
|
4 | B0 = (C3 - A3) / (B3 - A3)
|
Nach Auflösen zu B:
1 | B0 = (C0 - A0) / (1 - A0)
|
2 | B1 = (C1 - A1) / B0 + A1
|
3 | B2 = (C2 - A2) / B0 + A2
|
4 | B3 = (C3 - A3) / B0 + A3
|
C0 muss immer grösser oder gleich A0 sein, weil wenn man ein Bild über
ein anderes legt kann das Resultierende Bild transparenter sein als dass
ursprüngliche Bild. Hier ist zu beachten, dass B0 für A0 = 1 undefiniert
ist. Dies macht sinn, denn C0 muss im Wertebereich 0<=A0<=C0<=1 liegen,
für A0=1 muss C1 somit ebenfalls 1 sein, und somit ist unbekannt ob das
Overlay transparent oder identisch zum Original war, und somit auch wie
transparent (B0) es war.
Es kommt aber noch schlimmer. Viele Bildformate verwenden Werte zwischen
0 und 128 oder 0 und 256 für Transparenz. Das Verhältnis von C0 zu A0
wird benötigt, um sämtliche Komponenten des Overlays zu berechnen, da es
dafür entscheidend ist, wie Transparent es ist. Deshalb wird der Wert
von B0 exponentiell ungenauer je grässer A0 ist. C0 kann immer nur
R-A0*R+1 werte annehmen, wobei R die anzahl möglicher Werte von A0 minus
1 ist. Beispiel: für R=255 und A0=254/255, kann C0 nur 2 Werte annehmen:
254/255 und 1. B0 ist immernoch im Bereich
(254/255-254/255)/(1-254/255)<=B0<=(255/255-254/255)/(1-254/255), oder
0<=B0<=1. (B0 ist immer in dem Bereich). aber B0 kann von seinen 256
möglichen Werten zwischen 0 und 1 nur 0 oder 1 annehmen, weil C0 nur 2
werte haben konnte. Man müsste also für C0=0 raten, welcher wert
zwischen 0 und 0.5 es ist, und für C=1 welcher zwischen 0.5 und 1. Bei
A0=253/255 wären die berechenbaren Werte für B1 0, 0.5 und 1, usw.
Um den richtigen Wert im möglichen Bereich zu erraten könnte man ein KNN
verwenden, oder man könnte die änderungsrate benachbarter Pixel
verwenden, oder man könnte es manuell zeichnen, etc. Auf jeden fall ist
es nicht trivial, da beim kombinieren der Bilder genauigkeit verloren
gegangen ist.
PS: Eventuell muss man vor den Berechnungen den Colorspace anpassen, und
ich habe nicht ausprobiert ob die Formeln stimmen.