565 Stimmen

Formel zur Bestimmung der wahrgenommenen Helligkeit der RGB-Farbe

Ich suche nach einer Art Formel oder Algorithmus, um die Helligkeit einer Farbe anhand der RGB-Werte zu bestimmen. Ich weiß, dass es nicht so einfach ist, die RGB-Werte zusammenzuzählen und höhere Summen heller zu machen, aber ich bin irgendwie ratlos, wo ich anfangen soll.

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.

15voto

Synchro Punkte 32385

Statt in der zufälligen Auswahl der hier erwähnten Formeln verloren zu gehen, empfehle ich Ihnen, die von den W3C-Standards empfohlene Formel zu verwenden.

Hier ist eine einfache, aber genaue PHP-Implementierung der WCAG 2.0 SC 1.4.3 relativen Helligkeit und Kontrastverhältnis Formeln. Es liefert Werte, die zur Bewertung der für die WCAG-Konformität erforderlichen Verhältnisse geeignet sind, wie auf dieser Seite, und ist daher für jede Web-App geeignet und angemessen. Dies ist trivial in andere Sprachen zu portieren.

/**
 * Berechnen Sie die relative Helligkeit im sRGB-Farbraum zur Verwendung in der WCAG 2.0-Konformität
 * @link http://www.w3.org/TR/WCAG20/#relativeluminancedef
 * @param string $col Eine 3- oder 6-stellige hexadezimale Farbzeichenfolge
 * @return float
 * @author Marcus Bointon 
 */
function relativeluminance($col) {
    //Entfernen Sie das führende #
    $col = trim($col, '#');
    //Konvertieren Sie 3-stellig in 6-stellig
    if (strlen($col) == 3) {
        $col = $col[0] . $col[0] . $col[1] . $col[1] . $col[2] . $col[2];
    }
    //Hexadezimal in den 0-1-Bereich umrechnen
    $components = array(
        'r' => hexdec(substr($col, 0, 2)) / 255,
        'g' => hexdec(substr($col, 2, 2)) / 255,
        'b' => hexdec(substr($col, 4, 2)) / 255
    );
    //Korrektur für sRGB
    foreach($components as $c => $v) {
        if ($v <= 0.04045) {
            $components[$c] = $v / 12.92;
        } else {
            $components[$c] = pow((($v + 0.055) / 1.055), 2.4);
        }
    }
    //Relative Helligkeit mit ITU-R-BT. 709-Koeffizienten berechnen
    return ($components['r'] * 0.2126) + ($components['g'] * 0.7152) + ($components['b'] * 0.0722);
}

/**
 * Kontrastverhältnis gemäß WCAG 2.0-Formel berechnen
 * Gibt einen Wert zwischen 1 (kein Kontrast) und 21 (maximaler Kontrast) zurück
 * @link http://www.w3.org/TR/WCAG20/#contrast-ratiodef
 * @param string $c1 Eine 3- oder 6-stellige hexadezimale Farbzeichenfolge
 * @param string $c2 Eine 3- oder 6-stellige hexadezimale Farbzeichenfolge
 * @return float
 * @author Marcus Bointon 
 */
function contrastratio($c1, $c2) {
    $y1 = relativeluminance($c1);
    $y2 = relativeluminance($c2);
    //Anordnen, sodass $y1 am hellsten ist
    if ($y1 < $y2) {
        $y3 = $y1;
        $y1 = $y2;
        $y2 = $y3;
    }
    return ($y1 + 0.05) / ($y2 + 0.05);
}

3 Stimmen

Die W3C-Formel ist auf mehreren Ebenen inkorrekt. Sie berücksichtigt nicht die menschliche Wahrnehmung, sondern verwendet einen "einfachen" Kontrast basierend auf Luminanz, der linear ist und nicht überhaupt perceptuell einheitlich ist. Unter anderem scheint es, dass sie sich auf einige Standards aus dem Jahr 1988 (!!!) stützen, die heute nicht relevant sind (diese Standards beruhten auf monochromen Monitoren wie grün/schwarz und bezogen sich auf den Gesamtkontrast von an bis aus, ohne Graustufen oder Farben zu berücksichtigen).

2 Stimmen

Das ist kompletter Unsinn. Luma ist speziell wahrnehmungsabhängig - deshalb hat es unterschiedliche Koeffizienten für Rot, Grün und Blau. Das Alter hat nichts damit zu tun - der ausgezeichnete CIE Lab wahrnehmungsabhängige Farbraum stammt aus dem Jahr 1976. Der W3C-Raum ist nicht so gut, jedoch ist es eine gute praktische Näherung, die einfach zu berechnen ist. Wenn Sie etwas Konstruktives anzubieten haben, posten Sie das anstatt leerer Kritik.

2 Stimmen

@Syncro nein, Luma ist ein GAMMA-KODIERTES (Y´) Teil einiger Videocodierungen (wie z.B. NTSC's YIQ). Luminanz, d.h. Y wie in CIEXYZ, ist LINIEAR und überhaupt nicht wahrnehmbar. Das W3C verwendet lineare Luminanz und einfachen Kontrast, der den Kontrast im mittleren Bereich nicht korrekt definiert (es liegt weit daneben). Ich schreibe gerade einen Artikel darüber, ich werde den Link posten, wenn er fertig ist. Ja, CIELAB ist ausgezeichnet, aber das W3C VERWENDET ES NICHT. Das veraltete Dokument, auf das ich mich beziehe, ist ANSI-HFES-100-1988 und nicht geeignet für Farbkontraste auf dem Bildschirm.

13voto

Nils Pipenbrinck Punkte 80152

Um das hinzuzufügen, was alle anderen gesagt haben:

All diese Gleichungen funktionieren in der Praxis ganz gut, aber wenn Sie sehr präzise sein müssen, müssen Sie die Farbe zunächst in den linearen Farbraum konvertieren (umgekehrte Bildgamma anwenden), den gewichteten Durchschnitt der Primärfarben berechnen und - falls Sie die Farbe anzeigen möchten - die Helligkeit wieder in den Monitor-Gamma überführen.

Der Helligkeitsunterschied zwischen der Vernachlässigung von Gamma und der korrekten Gammanutzung beträgt bis zu 20 % bei dunklem Grau.

11voto

Kal Punkte 1513

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

ITU-R BT.601 Farbhelligkeitsverläufe

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:

ITU-R BT.601 Farbhelligkeitsverläufe (hohe Auflösung)

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

ITU-R BT.709 Farbhelligkeitsverläufe

Oh Junge. Offensichtlich nicht dafür gedacht, mit rohen sRGB-Werten verwendet zu werden! Und doch machen das genau die meisten Leute!

ITU-R BT.709 Farbhelligkeitsverläufe (hohe Auflösung)

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.

11voto

sitesbyjoe Punkte 1841

Ich habe diesen Code (geschrieben in C#) gefunden, der hervorragend die "Helligkeit" einer Farbe berechnet. In diesem Szenario versucht der Code zu bestimmen, ob weißer oder schwarzer Text über der Farbe platziert werden soll.

10voto

bobobobo Punkte 61051

Interessanterweise verwendet diese Formulierung für RGB => HSV einfach v=MAX3(r,g,b). Mit anderen Worten, du kannst das Maximum von (r,g,b) als V in HSV verwenden.

Ich habe überprüft und auf Seite 575 von Hearn & Baker berechnen sie "Value" auch auf diese Weise.

Von Hearn & Baker Seite 319

1 Stimmen

Nur zur Info: Der Link ist ungültig. Archivversion hier - web.archive.org/web/20150906055359/http://…

3 Stimmen

HSV ist nicht wahrnehmungsgleichmäßig (und es kommt nicht einmal in die Nähe). Es wird nur als "praktische" Möglichkeit zur Anpassung der Farbe verwendet, aber es ist nicht relevant für die Wahrnehmung und das V hat keine Beziehung zum wahren Wert von L oder Y (CIE-Luminanz).

1 Stimmen

Bedeutet das, dass #FF0000 genauso hell ist wie #FFFFFF?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X