Ich suche nach einer Formel oder einem Algorithmus, um die Helligkeit einer Farbe anhand der RGB-Werte zu bestimmen. Ich weiß, dass es nicht so einfach sein kann, die RGB-Werte zu addieren und höhere Summen zu erzielen, aber ich weiß nicht, wo ich anfangen soll.
387
Antworten:
Meinst du Helligkeit? Wahrgenommene Helligkeit? Luminanz?
(0.2126*R + 0.7152*G + 0.0722*B)
[1](0.299*R + 0.587*G + 0.114*B)
[2]→sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )
sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )
(dank @MatthewHerbst ) [3]quelle
0.299*(R^2)
(weil Potenzierung vor Multiplikation geht)Ich denke, was Sie suchen, ist die RGB -> Luma- Umrechnungsformel.
Photometrische / digitale ITU BT.709 :
Digital ITU BT.601 (verleiht den R- und B-Komponenten mehr Gewicht):
Wenn Sie bereit sind, Genauigkeit gegen Leistung zu tauschen, gibt es zwei Näherungsformeln für diese:
Diese können schnell berechnet werden als
quelle
Blue
+ 3 * Grün) / 6, die zweite ist (3 * Rot +Blue
+ 4 * Grün) >> 3. Zugegeben, in beiden schnellen Näherungen hat Blau das niedrigste Gewicht, aber es ist immer noch da.Y = (R<<1+R+G<<2+B)>>3
Folgendes tun: (das sind nur 3-4 CPU-Zyklen auf ARM), aber ich denke, ein guter Compiler wird diese Optimierung für Sie durchführen.Ich habe die drei Algorithmen in der akzeptierten Antwort verglichen. Ich habe Farben im Zyklus generiert, in dem nur etwa jede 400. Farbe verwendet wurde. Jede Farbe wird durch 2x2 Pixel dargestellt, die Farben werden von dunkel bis hell sortiert (von links nach rechts, von oben nach unten).
1. Bild - Luminanz (relativ)
2. Bild - http://www.w3.org/TR/AERT#color-contrast
3. Bild - HSP-Farbmodell
4. Bild - WCAG 2.0 SC 1.4.3 Formel für relative Luminanz und Kontrastverhältnis (siehe Antwort von @ Synchro hier )
Abhängig von der Anzahl der Farben in einer Reihe kann das Muster manchmal auf dem 1. und 2. Bild erkannt werden. Ich habe nie ein Muster auf dem Bild vom 3. oder 4. Algorithmus entdeckt.
Wenn ich mich entscheiden müsste, würde ich mich für Algorithmus Nummer 3 entscheiden, da er viel einfacher zu implementieren ist und ungefähr 33% schneller als der vierte.
quelle
^2
undsqrt
in der dritten Formel enthalten sind eine schnellere Möglichkeit, lineares RGB von nichtlinearem RGB anstelle von^2.2
und zu approximieren, und^(1/2.2)
das wäre korrekter. Die Verwendung nichtlinearer Eingaben anstelle linearer Eingaben ist leider äußerst häufig.Im Folgenden finden Sie den einzigen RICHTIGEN Algorithmus zum Konvertieren von sRGB-Bildern, wie sie in Browsern usw. verwendet werden, in Graustufen.
Vor der Berechnung des inneren Produkts muss eine Umkehrung der Gammafunktion für den Farbraum angewendet werden. Dann wenden Sie die Gammafunktion auf den reduzierten Wert an. Wenn die Gammafunktion nicht integriert wird, können Fehler von bis zu 20% auftreten.
Für typische Computer ist der Farbraum sRGB. Die richtigen Zahlen für sRGB sind ca. 0,21, 0,72, 0,07. Gamma für sRGB ist eine zusammengesetzte Funktion, die die Exponentiation um 1 / (2.2) approximiert. Hier ist das Ganze in C ++.
quelle
Die Antwort "Akzeptiert" ist falsch und unvollständig
Die einzigen Antworten, die korrekt sind, sind die Antworten @ jive-dadson und @EddingtonsMonkey sowie zur Unterstützung von @ nils-pipenbrinck . Die anderen Antworten (einschließlich der akzeptierten) verweisen auf oder zitieren Quellen, die entweder falsch, irrelevant, veraltet oder fehlerhaft sind.
Kurz:
Was folgt, ist eine korrekte und vollständige Antwort:
Da dieser Thread in Suchmaschinen häufig vorkommt, füge ich diese Antwort hinzu, um die verschiedenen Missverständnisse zu diesem Thema zu klären.
Helligkeit ist ein Wahrnehmungsattribut, es hat kein direktes Maß.
Die wahrgenommene Helligkeit wird von einigen Sehmodellen wie CIELAB gemessen. Hier ist L * (Lstar) ein Maß für die Wahrnehmungshelligkeit und nicht linear, um die nichtlineare Antwortkurve des menschlichen Sehens zu approximieren.
Die Luminanz ist ein lineares Maß für Licht, das für normales Sehen spektral gewichtet, aber für nichtlineare Wahrnehmung von Helligkeit nicht angepasst ist.
Luma ( Y´ prime) ist ein Gamma-codiertes, gewichtetes Signal, das in einigen Videocodierungen verwendet wird. Es ist nicht mit linearer Luminanz zu verwechseln.
Gamma oder Übertragungskurve (TRC) ist eine Kurve, die häufig der Wahrnehmungskurve ähnlich ist und üblicherweise auf Bilddaten zur Speicherung oder Ausstrahlung angewendet wird, um das wahrgenommene Rauschen zu reduzieren und / oder die Datennutzung (und verwandte Gründe) zu verbessern.
Um die wahrgenommene Helligkeit zu bestimmen , konvertieren Sie zuerst Gamma-codierte R´G´B´-Bildwerte in lineare Luminanz (
L
oderY
) und dann in nichtlineare wahrgenommene Helligkeit (L*
)LUMINANZ FINDEN:
... weil es anscheinend irgendwo verloren gegangen ist ...
Schritt eins:
Konvertieren Sie alle sRGB 8-Bit-Ganzzahlwerte in eine Dezimalzahl von 0,0 bis 1,0
Schritt zwei:
Konvertieren Sie ein Gamma-codiertes RGB in einen linearen Wert. sRGB (Computer Standard) erfordert zum Beispiel eine Leistungskurve von ungefähr V ^ 2.2, obwohl die "genaue" Transformation lautet:
Wobei V´ der gamma-codierte R-, G- oder B-Kanal von sRGB ist.
Pseudocode:
Schritt drei:
Um die Luminanz (Y) zu ermitteln, wenden Sie die Standardkoeffizienten für sRGB an:
Pseudocode mit den oben genannten Funktionen:
Wahrgenommene Leichtigkeit zu finden:
Schritt vier:
Nehmen Sie die Luminanz Y von oben und transformieren Sie sie in L *
Pseudocode:
L * ist ein Wert von 0 (schwarz) bis 100 (weiß), wobei 50 das wahrgenommene "mittlere Grau" ist. L * = 50 ist das Äquivalent von Y = 18,4 oder mit anderen Worten eine 18% ige Graukarte, die die Mitte einer fotografischen Belichtung darstellt (Ansel Adams Zone V).
Verweise:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Charles Poyntons Gamma-FAQ
quelle
Luma=rgb2gray(RGB);LAB=rgb2lab(RGB);LAB(:,:,2:3)=0;PerceptualGray=lab2rgb(LAB);
L*a*b*
berücksichtigt eine Reihe von psychophysischen Attributen nicht. Der Helmholtz-Kohlrausch-Effekt ist einer, aber es gibt viele andere. CIELAB ist keineswegs ein "vollständiges" Bildbewertungsmodell. In meinem Beitrag habe ich versucht, die Grundkonzepte so vollständig wie möglich zu behandeln, ohne mich in die sehr tiefen Minutien zu wagen. Das Hunt-Modell, Fairchilds Modelle und andere machen einen vollständigeren Job, sind aber auch wesentlich komplexer.Ich habe diesen Code (in C # geschrieben) gefunden, der die "Helligkeit" einer Farbe hervorragend berechnet. In diesem Szenario versucht der Code zu bestimmen, ob weißer oder schwarzer Text über die Farbe eingefügt werden soll.
quelle
Interessanterweise verwendet diese Formulierung für RGB => HSV nur v = MAX3 (r, g, b). Mit anderen Worten, Sie können das Maximum von (r, g, b) als V im HSV verwenden.
Ich habe nachgesehen und auf Seite 575 von Hearn & Baker wird auf diese Weise auch "Wert" berechnet.
quelle
Anstatt sich in der hier erwähnten zufälligen Auswahl von Formeln zu verlieren, empfehle ich Ihnen, die von W3C-Standards empfohlene Formel zu wählen.
Hier ist eine einfache, aber genaue PHP-Implementierung der Formeln für relative Luminanz und Kontrastverhältnis von WCAG 2.0 SC 1.4.3 . Es werden Werte erstellt, die für die Bewertung der für die WCAG-Konformität erforderlichen Verhältnisse wie auf dieser Seite geeignet sind und als solche für jede Web-App geeignet und geeignet sind. Dies ist trivial, um in andere Sprachen zu portieren.
quelle
Um hinzuzufügen, was alle anderen gesagt haben:
Alle diese Gleichungen funktionieren in der Praxis ein bisschen gut, aber wenn Sie sehr genau sein müssen, müssen Sie zuerst die Farbe in einen linearen Farbraum konvertieren (inverses Bild-Gamma anwenden), den Gewichtsdurchschnitt der Primärfarben berechnen und - wenn Sie möchten Anzeige der Farbe - Nehmen Sie die Luminanz zurück in das Monitor-Gamma.
Der Luminanzunterschied zwischen Ingnoring-Gamma und richtigem Gamma beträgt in den dunklen Grautönen bis zu 20%.
quelle
Ich habe heute eine ähnliche Aufgabe in Javascript gelöst. Ich habe mich für diese
getPerceivedLightness(rgb)
Funktion für eine HEX RGB-Farbe entschieden. Es behandelt den Helmholtz-Kohlrausch-Effekt über die Fairchild- und Perrotta-Formel zur Luminanzkorrektur.quelle
Der HSV-Farbraum sollte den Trick machen. Siehe Wikipedia-Artikel. Abhängig von der Sprache, in der Sie arbeiten, erhalten Sie möglicherweise eine Bibliothekskonvertierung.
H ist der Farbton, der ein numerischer Wert für die Farbe ist (dh rot, grün ...)
S ist die Sättigung der Farbe, dh wie 'intensiv' sie ist
V ist die 'Helligkeit' der Farbe.
quelle
RGB-Luminanzwert = 0,3 R + 0,59 G + 0,11 B.
http://www.scantips.com/lumin.html
Ich denke, der RGB-Farbraum ist in Bezug auf den euklidischen L2-Abstand wahrnehmbar ungleichmäßig. Einheitliche Räume umfassen CIE LAB und LUV.
quelle
Bei der Inverse-Gamma-Formel von Jive Dadson muss die halbe Anpassung entfernt werden, wenn sie in Javascript implementiert wird, dh die Rückgabe von der Funktion gam_sRGB muss int (v * 255) sein. nicht int zurückgeben (v * 255 + .5); Eine halbe Anpassung rundet auf, und dies kann dazu führen, dass bei einer R = G = B, dh einer grauen Farbtriade, ein Wert zu hoch ist. Die Graustufenumwandlung auf einer R = G = B-Triade sollte einen Wert gleich R ergeben. Es ist ein Beweis dafür, dass die Formel gültig ist. Siehe Nine Shades of Greyscale für die Formel in Aktion (ohne die halbe Anpassung).
quelle
Ich frage mich, wie diese RGB-Koeffizienten bestimmt wurden. Ich habe selbst ein Experiment durchgeführt und am Ende Folgendes festgestellt:
Nah, aber offensichtlich anders als die seit langem etablierten ITU-Koeffizienten. Ich frage mich, ob diese Koeffizienten für jeden Beobachter unterschiedlich sein könnten, da wir alle möglicherweise eine unterschiedliche Anzahl von Zapfen und Stäbchen auf der Netzhaut in unseren Augen haben und insbesondere das Verhältnis zwischen den verschiedenen Zapfentypen unterschiedlich sein kann.
Als Referenz:
ITU BT.709:
ITU BT.601:
Ich habe den Test durchgeführt, indem ich schnell einen kleinen grauen Balken auf einem leuchtend roten, hellgrünen und hellblauen Hintergrund verschoben und das Grau angepasst habe, bis es sich so gut wie möglich eingemischt hat. Ich habe diesen Test auch mit anderen Farben wiederholt. Ich habe den Test auf verschiedenen Displays wiederholt, sogar auf einem mit einem festen Gammafaktor von 3,0, aber für mich sieht alles gleich aus. Darüber hinaus sind die ITU-Koeffizienten für meine Augen buchstäblich falsch.
Und ja, ich habe vermutlich ein normales Farbsehen.
quelle
Hier ist ein bisschen C-Code, der die wahrgenommene Luminanz richtig berechnen sollte.
quelle
Bitte definieren Sie die Helligkeit. Wenn Sie suchen, wie nah die Farbe an Weiß ist, können Sie den euklidischen Abstand von (255, 255, 255) verwenden.
quelle
Das 'V' des HSV ist wahrscheinlich das, wonach Sie suchen. MATLAB hat eine rgb2hsv-Funktion und der zuvor zitierte Wikipedia-Artikel ist voller Pseudocode. Wenn eine RGB2HSV-Konvertierung nicht möglich ist, ist die Graustufenversion des Bildes ein weniger genaues Modell.
quelle
Dieser Link erklärt alles ausführlich, einschließlich der Gründe, warum diese Multiplikator-Konstanten vor den R-, G- und B-Werten existieren.
Bearbeiten: Es gibt auch hier eine Erklärung zu einer der Antworten (0,299 * R + 0,587 * G + 0,114 * B)
quelle
Um die Helligkeit einer Farbe mit R zu bestimmen, konvertiere ich die RGB-Systemfarbe in die HSV-Systemfarbe.
In meinem Skript verwende ich den HEX-Systemcode zuvor aus einem anderen Grund, aber Sie können auch mit RGB-Systemcode mit beginnen
rgb2hsv {grDevices}
. Die Dokumentation finden Sie hier .Hier ist dieser Teil meines Codes:
quelle
Aus Gründen der Klarheit müssen die Formeln, die eine Quadratwurzel verwenden, sein
sqrt(coefficient * (colour_value^2))
nicht
sqrt((coefficient * colour_value))^2
Der Beweis dafür liegt in der Umwandlung einer R = G = B-Triade in Graustufen R. Dies gilt nur, wenn Sie den Farbwert quadrieren, nicht den Farbwert mal den Koeffizienten. Siehe Neun Graustufentöne
quelle