Berechnung des Durchschnitts zweier RGB-Werte

Mit 2 RGB-Werten:

  • 255, 23, 22
  • 201, 18, 122

Ich möchte sie mitteln, dieser Link sagt, dass ich sie wirklich zuerst quadrieren, mitteln und dann die Quadratwurzel finden muss. Ich habe ein paar andere Punkte gesehen, die dasselbe sagen oder näher an der Leistung von 2,2 liegen (und ein Video, warum die Computerfarbe falsch ist).

Ist das wirklich der richtige Weg und wie heißt die Quadrierungsmethode? Ich weiß, dass der TATSÄCHLICH beste Weg der LAB-Raum ist, aber damit kann ich nicht umgehen.

Sie können über lineare vs. Gamma-Farbräume lesen.
Ich bin mir nicht sicher, ob Lab am besten ist (und ja, es ist L ab mit kleinem a und b), weil es nicht wirklich für die Interpolation gedacht ist, so dass es in vielerlei Hinsicht getragen werden würde. Wahrscheinlich besser in XYZ

Antworten (3)

R (255+201)/2 = 228

G (23+18)/2 = 20,5

B (22+122)/2 = 72

Dies hängt von Ihrem Konzept des "Durchschnitts" ab.

Wenn es sich um den Durchschnitt zwischen Schwarz und Weiß handelt, würde ich erwarten, dass das Ergebnis 128 ist und die Gammakorrektur von der Grafikkarte durchgeführt wird .

Aber der Wahrnehmungsgrund hinter dieser Verbindung ist interessant.

Der Punkt ist, dass es nicht nur einen Mittelweg gibt, Sie müssen sich daran erinnern, dass der Farbraum ein 3D-Modell ist, kein lineares.

Schauen Sie sich diese anderen verwandten Beiträge an:

In diesem Beitrag zeige ich 4 verschiedene Wege für einen Farbübergang zwischen Rot und Grün ... und das ist nur auf einem normalen Farbrad.

Erzeugen einer Reihe von Farben zwischen zwei Farben

Aber die Farbe ist nicht nur eine 2D-Oberfläche, sondern ein Körper, der in vielen Formen und Modellen vorkommt.

Wie findet man eine Umkehrfarbe?

Es gibt also nicht nur einen universellen Weg, um Farben zu mitteln . Das hängt von vielen Dingen ab.

also habe ich recht (wahrscheinlich nicht!), dass das nehmen der rgbs und quadrieren (oder vorzugsweise die potenz von 2,2) wirklich der gleiche prozess ist, aber das gamma berücksichtigt (also mehr im einklang damit, wie wir TATSÄCHLICH farbe sehen?)
Sie müssten Ihrer Frage wahrscheinlich "perzeptiv korrekter" hinzufügen. :)
Gibt es also im Fall von "wahrnehmungsmäßig korrekter", um mit der Potenz von 2.2 zu arbeiten, irgendwelche Beweise dafür? Wie überall im Internet, das sagt, dass es genauer ist als nur zu mitteln?

Wahrscheinlich bist du mit Computergrafik besser bedient als mit Grafikdesign, da es dort Brot und Butter gibt und hier ein bisschen zu viel Mathematik. Aber sice Sie sind schon hier. Tatsächlich sind beide Argumentationen enge Annäherungen.

Es stimmt, dass das Bild nicht linear ist. Sie können also nicht davon ausgehen, dass die Addition von Werten deren Summe ergibt, also auch kein Durchschnitt. Wenn Sie richtig liegen wollen, müssen Sie eine Profil-zu-Profil-Konvertierung durchführen*. Technisch würden Sie wahrscheinlich davon ausgehen, dass das Profil sRGB ist, was tatsächlich einer Gammakorrektur von 2,2 nahe kommt. wobei das Gamma definiert ist als:

V aus = V ein Ɣ

Nur ist es nicht ganz ein Gamma von 2,2, weil es tatsächlich linear unter den Werten von 0,04045 ist (oder unter ganzzahligen Werten von 10 in 8-Bit-Farbkanälen). Da die Farbebenen unabhängig sind, können Sie sie zuerst in linear umwandeln und dann berechnen und wieder in nichtlinear umwandeln.

* Hängt jedoch von Ihrer Definition von richtig ab, wenn es richtig ist, wie es im wirklichen Leben funktioniert, dann nein, das funktioniert nicht wirklich. Da die von Computern verwendeten Farbwerte natürliches Licht nicht erfassen können. Dazu benötigen Sie Spektraldaten. Aber das ist ein unendliches Rabbi-Thole. Farbe ist nicht wirklich so einfach, wie die meisten von uns denken, es ist schwieriger, als sie sich vorstellen können.

TL;DR Gut genug

Das Minute Physics-Video Computer Color is Broken erklärt das Problem gut, hat aber einige (kleine) Probleme.

Er stellt fest, dass RGB mit einer Quadratwurzel-komprimierten Version der tatsächlichen Intensität arbeitet:

+--------------+                      +-----+
| Linear Light |----> √r, √g, √b ---->| RGB |
+--------------+                      +-----+

Bevor Sie also versuchen, RGB zu mischen, müssen Sie es wieder in "lineares Licht" umwandeln, indem Sie die Umkehrung anwenden:

+--------------+                      +-----+
| Linear Light |<---- r², g², b² <----| RGB |
+--------------+                      +-----+

Aber das Internet und fast alle Elektronik- und Verbrauchergeräte haben sich auf einen Standard (genannt sRGB) geeinigt, bei dem etwas angewendet wird, das nicht ganz die Quadratwurzel ist.

  • Was Sie als Quadratwurzel kennen, kann ausgedrückt werden als: r 1/2
  • Was sRGB verlangt, ist nah, aber subtil anders: r 1/2.4

Es ist also etwas, das kein Quadrat ist (und keine Quadratwurzel, um es rückgängig zu machen).

Auch die sRGB-Kompandierung ist nichtlinear

Die Formel, die von sRGB verwendet wird, um lineares Licht in sRGB-codiertes Licht umzuwandeln, ist nicht linear:

  • für R linear > 0,0031308
    • R srgb = 1,055 × R linear 1/2,4 – 0,055
  • ansonsten
    • R srgb = 12,92 × R linear

Mit anderen Worten, es kommt einer einfachen Quadratwurzelbildung sehr nahe:

Geben Sie hier die Bildbeschreibung ein

Mit dem einzigen Fallstrick des linearen Abschnitts, wenn Sie wirklich nahe an Null kommen.

Mathematik

Normalerweise benötigen Sie also eine Funktion, die diese Fast-Quadratwurzel- sRGB-Kompandierungsfunktion anwendet:

r = SrgbCompanding(Rlinear);
g = SrgbCompanding(Glinear);
b = SrgbCompanding(Blinear);

Bevor Sie beginnen, Farben in RGB zu mitteln oder zu mischen, müssen Sie die Umkehrung anwenden:

Rlinear = SrgbInverseCompanding(r);
Glinear = SrgbInverseCompanding(g);
Blinear = SrgbInverseCompanding(b);

Sobald sich R, G und B im linearen Licht befinden, können Sie sie mitteln:

R3 = (SrgbInverseCompanding(r1) + SrgbInverseCompanding(r2)) / 2;
G3 = (SrgbInverseCompanding(g1) + SrgbInverseCompanding(g2)) / 2;
B3 = (SrgbInverseCompanding(b1) + SrgbInverseCompanding(b2)) / 2;

Und dann müssen Sie die sRGB-Kompandierung erneut anwenden:

R3 = SrgbCompanding(R3);
G3 = SrgbCompanding(G3);
B3 = SrgbCompanding(B3);