[FIXED] Mischmodus subtrahieren

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]:

  1. Wendete einen Color Dodge an (es wurde keine vorherige Konvertierung sRGB -> linear RGBdurchgeführt) und erhielt diesen von meiner Implementierung, die mit dem GIMP-Ergebnis übereinstimmt.
  2. sRGB -> linear RGBKonvertierung auf Color Dodge und Quellbild. [ Referenz ]
  3. Wenden Sie die Subtraktionsmischung mit Background = Colour Dodgeund anForeground = Source Image
  4. Konvertierenlinear 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 ➞ 255Bereich ansehen, sind sie wahrscheinlich gammakorrigiert. Die Operation wird möglicherweise so durchgeführt:

  • Konvertieren Sie jede Ebene in “lineares Licht” im 0.0 ➞ 1.0Bereich 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.2erhalten 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)

0 Shares:
Leave a Reply

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

You May Also Like