Betrachten Sie dies als Ergänzung zu Myndex's ausgezeichnete Antwort. Wie er (und andere) erklären, sind die Algorithmen zur Berechnung der relativen Helligkeit (und der wahrgenommenen Helligkeit) einer RGB-Farbe darauf ausgelegt, mit linearen RGB-Werten zu arbeiten. Sie können sie nicht einfach auf rohe sRGB-Werte anwenden und hoffen, die gleichen Ergebnisse zu erhalten.
Nun, das klingt alles in der Theorie großartig, aber ich brauchte wirklich, um die Beweise selbst zu sehen, also, inspiriert von Petr Hurtaks Farbverläufen, machte ich meine eigenen. Sie zeigen die beiden häufigsten Algorithmen (ITU-R Empfehlung BT.601 und BT.709) und zeigen deutlich, warum Sie Ihre Berechnungen mit linearen Werten (nicht gamma-korrigierten) durchführen sollten.
Zunächst hier sind die Ergebnisse des älteren ITU BT.601 Algorithmus. Der auf der linken Seite verwendet rohe sRGB-Werte. Der auf der rechten Seite verwendet lineare Werte.
ITU-R BT.601 Farbhelligkeitsverläufe
0,299 R + 0,587 G + 0,114 B
Bei dieser Auflösung können Sie sehen, dass viele benachbarte Pixel auf der linken Seite nicht einmal annähernd die gleiche Helligkeit haben - im oberen Teil gibt es helle rote Pixel neben sehr dunklen. Bei höherer Auflösung beginnen unerwünschte Muster aufzutreten:
Der lineare hat damit nicht zu kämpfen, aber es gibt ziemlich viel Rauschen dort. Vergleichen wir es mit der ITU-R Empfehlung BT.709…
ITU-R BT.709 Farbhelligkeitsverläufe
0,2126 R + 0,7152 G + 0,0722 B
Oh Junge. Offensichtlich nicht dafür gedacht, mit rohen sRGB-Werten verwendet zu werden! Und doch machen das genau die meisten Leute!
Bei hoher Auflösung können Sie wirklich sehen, wie effektiv dieser Algorithmus ist, wenn man lineare Werte verwendet. Er hat bei weitem nicht so viel Rauschen wie der frühere. Obwohl keiner dieser Algorithmen perfekt ist, ist dieser so gut wie es nur geht.
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