Ausgabe
Ich habe versucht, einige der Ebenenüberblendungsmodi von GIMP (GEGL) in Python zu implementieren. Derzeit stecke ich im Subtract Blending-Modus fest. Laut DokumentationSubtract = max(Background - Foreground, 0)
. _ Wenn Sie jedoch einen einfachen Test in GIMP mit Background image = (205,36,50)
und durchführen Foreground image = (125,38,85)
, wird das resultierende zusammengesetzte Bild / die resultierende Farbe angezeigt, (170, 234, 0)
das der obigen Mathematik nicht ganz folgt.
Nach Verständnis verwendet Subtract kein Alpha Blending. Könnte das also ein Compositing-Problem sein? Oder Subtrahieren folgt einer anderen Mathematik? Weitere Details und Hintergründe finden Sie in einer separaten SO- Frage.
BEARBEITEN [14.10.2021] : Ich habe es mit diesem Bild als Quelle versucht. Führen Sie die folgenden Schritte für Bilder aus, die im Bereich normalisiert sind [0, 1]
:
- Wendete einen Color Dodge an (es wurde keine vorherige Konvertierung
sRGB -> linear RGB
durchgeführt) und erhielt diesen von meiner Implementierung, die mit dem GIMP-Ergebnis übereinstimmt. sRGB -> linear RGB
Konvertierung auf Color Dodge und Quellbild. [ Referenz ]- Wenden Sie die Subtraktionsmischung mit
Background = Colour Dodge
und anForeground = Source Image
- Konvertieren
linear RGB-> sRGB
Ich erhalte diese von POC. Linkes RGB-Triplett: (69,60,34); Rechtes RGB-Triplett: (3,0,192) . Und das GIMP- Ergebnis . Linkes RGB-Triplett: (69,60,35); Rechtes RGB-Triplett: (4.255.255)
Lösung
Wenn Sie sich Kanalwerte in diesem 0 ➞ 255
Bereich ansehen, sind sie wahrscheinlich gammakorrigiert. Die Operation wird möglicherweise so durchgeführt:
- Konvertieren Sie jede Ebene in “lineares Licht” im
0.0 ➞ 1.0
Bereich mit so etwas wie
L = ((V/255) ** gamma) (*)
- Wende die “Differenz”-Formel an
- Konvertieren Sie das Ergebnis wieder in Gamma-korrigiert:
V = (255 * (Diff ** (1/gamma)))
Mit gamma=2.2
erhalten Sie 170 für den roten Kanal, aber ich verstehe nicht, warum Sie 234 für den grünen Kanal erhalten.
(*) Die aktuelle Formel hat einen Sonderfall für die sehr niedrigen Werte IIRC.
Beantwortet von – xenoid
Antwort geprüft von – Willingham (FixError Volunteer)