Umwandeln von RGB in Graustufen / Intensität
-
22-08-2019 - |
Frage
Wenn von RGB Umwandlung in Graustufen, es wird gesagt, dass spezifische Gewichte Kanäle R, G und B sollen angewandt werden. Diese Gewichte sind. 0,2989, 0,5870, 0,1140
Es wird gesagt, dass der Grund für diese unterschiedliche ist die menschliche Wahrnehmung / Sensibilität gegenüber diesen drei Farben. Manchmal ist es auch gesagt, das sind die Werte verwendet NTSC-Signal zu berechnen.
Allerdings habe ich nicht eine gute Referenz für diese im Web finden. Was ist die Quelle dieser Werte?
Lösung
Die spezifischen Zahlen in der Frage sind von CCIR 601 (siehe Wikipedia Link unten).
Wenn Sie konvertieren RGB -> Graustufen mit leicht unterschiedlichen Zahlen / verschiedenen Methoden, Sie werden überhaupt nicht viel Unterschied auf einem normalen Computer-Bildschirm sehen unter normalen Lichtverhältnissen - probieren Sie es
.Hier sind einige weitere Links auf Farbe im Allgemeinen:
Bruce Lindbloom ‚herausragende Website
Kapitel 4 auf Farbe im Buch von Colin Ware "Information Visualization", ISBN 1-55860-819-2; Diese lange Verbindung zu Ware in books.google. com kann oder auch nicht funktionieren
cambridgeincolor : ausgezeichnet, gut geschrieben „Anleitungen, wie zu erwerben, interpretieren und verarbeiten digitale Fotos mit einem optisch orientierten Ansatz, Konzept über Verfahren "
betontWenn Sie laufen in "linear" vs "nicht-linear" RGB, hier ist ein Teil einer alten Notiz mich zu diesem Thema. Wiederholen, in der Praxis werden Sie nicht viel Unterschied.
RGB -> ^ gamma -> Y -> L *
In der Farbwissenschaft, die gemeinsamen RGB-Werte, wie in html rgb (10%, 20%, 30%), werden als „nicht-lineare“ oder Gamma korrigiert . "Linear" Werte sind definiert als
Rlin = R^gamma, Glin = G^gamma, Blin = B^gamma
Dabei gilt Gamma 2.2 für viele PCs. Die übliche R G B werden manchmal als R 'G' B '(R' = RLIN ^ (1 / gamma)) geschrieben (Puristen zungen klicken), aber hier werde ich fallen die‘.
Helligkeit auf einer CRT-Anzeige, ist proportional zu RGBlin = RGB ^ gamma, so 50% Grau auf einem CRT ist ziemlich dunkel: 0,5 ^ 2,2 = 22% der maximalen Helligkeit. (LCD-Displays sind komplexer; Darüber hinaus kompensieren einige Grafikkarten für Gamma.)
Um das Maß der Leichtigkeit genannt L*
von RGB zu erhalten,
erste divide R G B durch 255 und berechnen
Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
Dies ist Y
in XYZ-Farbraum; es ist ein Maß für die Farbe „Luminanz“.
(Die realen Formeln sind nicht gerade x ^ gamma, aber in der Nähe;
Stick mit x ^ gamma für einen ersten Durchlauf.)
Schließlich
L* = 116 * Y ^ 1/3 - 16
„... strebt Wahrnehmungs Einheitlichkeit [und] ehesten entspricht die menschliche Wahrnehmung von Leichtigkeit.“ - Wikipedia Lab-Farbraum
Andere Tipps
Ich fand, dass diese Publikation in einer Antwort auf eine vorhergehende Frage verwiesen. Es ist sehr hilfreich:
http://cadik.posvete.cz/color_to_gray_evaluation/
Es zeigt ‚Tonnen‘ von verschiedenen Methoden Graustufen-Bilder mit unterschiedlichen Ergebnissen zu generieren!
Heres einige Code in C zu konvertieren rgb in Graustufen. Die eigentliche Gewichtung für rgb in Graustufen Konvertierung verwendet wird 0,3R + 0,6G + 0,11 B. diese Gewichte Arent absolut kritisch, so können Sie mit ihnen spielen. Ich habe sie 0.25R + 0,5G + 0.25B gemacht. Es erzeugt ein etwas dunklere Bild.
Hinweis: Der folgende Code geht davon aus xRGB 32bit Pixelformat
unsigned int *pntrBWImage=(unsigned int*)..data pointer..; //assumes 4*width*height bytes with 32 bits i.e. 4 bytes per pixel
unsigned int fourBytes;
unsigned char r,g,b;
for (int index=0;index<width*height;index++)
{
fourBytes=pntrBWImage[index];//caches 4 bytes at a time
r=(fourBytes>>16);
g=(fourBytes>>8);
b=fourBytes;
I_Out[index] = (r >>2)+ (g>>1) + (b>>2); //This runs in 0.00065s on my pc and produces slightly darker results
//I_Out[index]=((unsigned int)(r+g+b))/3; //This runs in 0.0011s on my pc and produces a pure average
}
Überprüfen Sie die Farbe FAQ out für Informationen zu diesem Thema. Diese Werte stammen aus der Standardisierung von RGB-Werten, die wir in unserer Displays verwenden. Eigentlich nach der Farbe FAQ, die Werte, die Sie verwenden, sind veraltet, da sie die Werte für den ursprünglichen NTSC-Standard verwendet, und nicht moderne Monitore.
Hier ist ein Papier auf, wie diese Zahlen (oder ähnliche) wurden abgeleitet:
Was ist die Quelle dieser Werte?
Die „Quelle“ der entsandten Koeffizienten sind die NTSC-Spezifikationen, die in REC601 und Eigenschaften von Fernsehen .
Die „ultimative Quelle“ sind die CIE circa 1931 Versuche an menschlichen Farbwahrnehmung. Die spektrale Empfindlichkeit des menschlichen Sehvermögens ist nicht einheitlich. Experimente führten zur Gewichtung der Tristimuluswerte basierend auf Wahrnehmung. Unsere L, M und S-Zapfen 1 sind empfindlich auf die Lichtwellenlängen wir als „Rot“, „Grün“ und „Blau“ (jeweils) zu identifizieren, das ist, wo die tristimulus Primärfarben abgeleitet . 2
Die lineare Licht 3 spektrale Gewichtungen für sRGB (und REC709) sind:
R lin * 0.2126 + G lin 0,7152 * + B lin * 0,0722 = Y
Diese sind spezifisch für den sRGB und REC709 Farbräume, die dazu bestimmt sind zu vertreten Computermonitore (sRGB) oder HDTV-Monitore (REC709) und sind in den ITU-Dokumente REC709 und auch < a href = "https://www.itu.int/dms_pub/itu-r/opb/rep/R-REP-BT.2380-2-2018-PDF-E.pdf" rel = "nofollow noreferrer"> BT ,2380-2 (10/2018)
FUßNOTEN
(1) Zapfen sind die Farbzellen der Netzhaut des Auges zu erkennen.
(2) jedoch die gewählten Tristimulus-Wellenlängen sind nicht auf der „peak“ eines jeden Typs cone - statt Tristimuluswerte so gewählt sind, dass sie auf bestimmte cone stimulieren Typ wesentlich mehr als der andere, das heißt Trennung von Stimulus
.
(3) Sie benötigen sRGB-Werte linearisieren, bevor die Koeffizienten anzuwenden. Ich diskutiere diese in einer anderen Antwort hier.
Diese Werte variieren von Person zu Person, vor allem für Menschen, die farbenblind sind.
ist all dies wirklich notwendig, die menschliche Wahrnehmung und CRT vs LCD variieren, aber die R G B Intensität nicht, warum nicht L = (R + G + B)/3
und stellen Sie den neuen RGB zu L, L, L?