Die "Akzeptierte" Antwort ist falsch und unvollständig
Die einzigen Antworten, die korrekt sind, sind die von @jive-dadson und @EddingtonsMonkey, und unterstützend @nils-pipenbrinck. Die anderen Antworten (einschließlich der akzeptierten) verlinken oder zitieren Quellen, die entweder falsch, irrelevant, veraltet oder defekt sind.
Kurz gesagt:
- sRGB muss linearisiert werden, bevor die Koeffizienten angewendet werden.
- Die Helligkeit (L oder Y) ist linear wie auch das Licht.
- Die wahrgenommene Helligkeit (L*) ist nichtlinear wie auch die menschliche Wahrnehmung.
- HSV und HSL sind in Bezug auf die Wahrnehmung nicht annähernd genau.
- Der IEC-Standard für sRGB legt einen Schwellenwert von 0,04045 fest, es ist nicht 0,03928 (das stammt aus einem obsoleten frühen Entwurf).
- Um nützlich zu sein (d. h. im Verhältnis zur Wahrnehmung) benötigen euklidische Abstände einen wahrnehmungsgleichmäßigen kartesischen Vektorraum wie CIELAB. sRGB ist keiner.
Was folgt, ist eine korrekte und vollständige Antwort:
Weil dieser Thread in Suchmaschinen stark präsent ist, füge ich diese Antwort hinzu, um die verschiedenen Missverständnisse zum Thema zu klären.
Helligkeit ist ein linearer Maßstab für Licht, spektral gewichtet für normales Sehen, aber nicht an die nichtlineare Wahrnehmung von Helligkeit angepasst. Es kann ein relativer Maßstab sein, Y wie in CIEXYZ, oder als L, ein absoluter Maßstab in cd/m2 (nicht zu verwechseln mit L*
).
Wahrgenommene Helligkeit wird von einigen Sehmodellen wie CIELAB verwendet, hier ist L*
(Lstern) ein Wert von wahrnehmbarer Helligkeit und ist nichtlinear, um der nichtlinearen Reaktion der menschlichen Vision anzunähern. (Das heißt, linear zur Wahrnehmung, aber daher nichtlinear zum Licht).
Helligkeit ist ein Wahrnehmungsattribut, es hat keine "physische" Maßeinheit. Einige Farberscheinungsmodelle haben jedoch einen Wert, üblicherweise bezeichnet als "Q" für wahrgenommene Helligkeit, der sich von wahrgenommener Helligkeit unterscheidet.
Luma (Y´ prime) ist ein gammakodiertes, gewichtetes Signal, das bei einigen Videoencodings verwendet wird (Y´I´Q´). Es darf nicht mit linearer Helligkeit verwechselt werden.
Gamma oder Übertragungskurve (TRC) ist eine Kurve, die häufig der Wahrnehmungskurve ähnelt und die häufig auf Bilddaten angewendet wird, um Rauschen zu reduzieren und/oder die Datenverwendung zu verbessern (und andere Gründe).
Um die wahrgenommene Helligkeit zu bestimmen, konvertieren Sie zunächst gamma-kodierte R´G´B´-Bildwerte in lineare Helligkeit (L
oder Y
) und dann in nichtlineare wahrgenommene Helligkeit (*`L`** )
UM DIE HELLIGKEIT ZU FINDEN:
...Weil sie anscheinend irgendwo verloren gegangen ist...
Schritt eins:
Konvertieren Sie alle sRGB 8-Bit-Integerwerte in Dezimalzahlen von 0,0 bis 1,0
vR = sR / 255;
vG = sG / 255;
vB = sB / 255;
Schritt zwei:
Konvertieren Sie einen gammakodierten RGB in einen linearen Wert. sRGB (Computernorm) erfordert beispielsweise eine Potenzkurve von etwa V^2.2, obwohl die "genaue" Transformation lautet:
Wo V´ der gammakodierte R, G oder B-Kanal von sRGB ist.
Pseudocode:
function sRGBtoLin(colorChannel) {
// Senden Sie dieser Funktion einen dezimalen sRGB-gammakodierten Farbwert
// zwischen 0,0 und 1,0, und sie gibt einen linearisierten Wert zurück.
if ( colorChannel <= 0,04045 ) {
return colorChannel / 12,92;
} else {
return pow((( colorChannel + 0,055)/1,055),2,4);
}
}
Schritt drei:
Um die Helligkeit (Y) zu finden, wenden Sie die Standardkoeffizienten für sRGB an:
Pseudocode unter Verwendung der obigen Funktionen:
Y = (0,2126 * sRGBtoLin(vR) + 0,7152 * sRGBtoLin(vG) + 0,0722 * sRGBtoLin(vB))
UM DIE WAHRGENOMMENE HELLIGKEIT ZU FINDEN:
Schritt vier:
Nehmen Sie die Helligkeit Y von oben und transformieren Sie sie in L*
Pseudocode:
function YtoLstar(Y) {
// Senden Sie dieser Funktion einen Helligkeitswert zwischen 0,0 und 1,0,
// und sie gibt L* zurück, was "wahrnehmbare Helligkeit" ist.
if ( Y <= (216/24389)) {
return Y * (24389/27);
} else {
return pow(Y,(1/3)) * 116 - 16;
}
}
L* ist ein Wert von 0 (schwarz) bis 100 (weiß), wobei 50 das wahrnehmbare "Mittelgrau" ist. L* = 50 entspricht Y = 18,4 oder mit anderen Worten einer 18% grauen Karte, die die Mitte einer fotografischen Belichtung (Ansel Adams Zone V) darstellt.
Referenzen:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Charles Poyntons Gamma-FAQ
10 Stimmen
Die wahrgenommene Helligkeit ist das, wonach ich suche, danke.
0 Stimmen
Ich habe [diesen Code][1] (geschrieben in C#) gefunden, der hervorragende Arbeit bei der Berechnung der "Helligkeit" einer Farbe leistet. In diesem Szenario versucht der Code festzustellen, ob weißer oder schwarzer Text über der Farbe platziert werden soll. [1]:nbdtech.com/Blog/archive/2008/04/27/…
2 Stimmen
Es gibt einen guten Artikel (Farbmanipulation in .NET - Teil 1) über Farbräume und deren Konvertierungen, einschließlich sowohl Theorie als auch Code (C#). Für die Antwort schauen Sie sich das Thema Konvertierung zwischen Modellen im Artikel an.
0 Stimmen
Sehen Sie meine Antwort, aber wirklich einfach ist: Helligkeit = 0,2*r + 0,7*g + 0,1*b