La conversione da RGB a scala di grigi / intensità
-
22-08-2019 - |
Domanda
Durante la conversione da RGB a scala di grigio, si dice che pesi specifici canali R, G e B deve essere applicato. Questi pesi sono:. 0,2989, 0,5870, 0,1140
Si dice che la ragione di questo è diverso percezione umana / sensibilità verso questi tre colori. A volte si dice anche questi sono i valori utilizzati per il calcolo del segnale NTSC.
Tuttavia, non ho trovato un buon riferimento per questo sul web. Qual è la fonte di questi valori?
Soluzione
I numeri specifici in questione sono da CCIR 601 (si veda il link Wikipedia sotto).
Se si converte RGB -> scala di grigi con leggermente diversi numeri / metodi diversi, non si vedrà molta differenza a tutti su uno schermo di computer normale in condizioni di luce normale - provare
.Ecco alcuni link sul colore in generale:
eccezionale sito web 's Bruce Lindbloom
Capitolo 4 a colori nel libro di Colin Ware, "Information Visualization", ISBN 1-55860-819-2; questa lunga link per Ware in books.google. it può o non può lavorare
cambridgeincolor : eccellente, ben scritto "Tutorial su come acquisire, interpretare ed elaborare le fotografie digitali utilizzando un approccio visivamente-oriented che enfatizza concetto su procedura "
In caso di incorrere in vs RGB "lineare" "non lineare", qui è parte di una vecchia nota a me su questo. Ripetere, in pratica non si vede molta differenza.
RGB -> ^ gamma -> Y -> L *
In scienza del colore, i valori comuni RGB, come in html rgb (10%, 20%, 30%), sono chiamati "non lineare" o Gamma corretto . valori "lineari" sono definiti come
Rlin = R^gamma, Glin = G^gamma, Blin = B^gamma
dove gamma è 2.2 per molti PC. Il solito R G B sono talvolta scritto come R 'G' B '(R' = RLIN ^ (1 / gamma)) (Puristi della lingua-click), ma qui io cadere la'.
Luminosità su un display CRT è proporzionale RGBlin = RGB ^ gamma, così grigio al 50% su un CRT è piuttosto scuro: .5 ^ 2,2 = 22% della luminosità massima. (LCD sono più complesse; Inoltre, alcune schede grafiche compensano gamma.)
Per ottenere la misura di leggerezza chiamato L*
da RGB,
prima divisione R G B da 255, e calcolare
Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
Questa è Y
nello spazio di colore XYZ; si tratta di una misura di colore "luminanza".
(Le formule reali non sono esattamente x ^ gamma, ma quasi;
bastone con x ^ gamma per un primo passaggio.)
Infine,
L* = 116 * Y ^ 1/3 - 16
"... aspira a uniformità percettiva [e] partite da vicino la percezione umana di leggerezza." - spazio colore Lab
Altri suggerimenti
ho scoperto che questa pubblicazione fa riferimento in una risposta ad una precedente domanda simile. E 'molto utile:
http://cadik.posvete.cz/color_to_gray_evaluation/
Si mostra 'tonnellate' di diversi metodi per generare immagini in scala di grigi con esiti diversi!
Heres po 'di codice in C per la conversione rgb in scala di grigi. Il vero ponderazione utilizzato per rgb conversione in scala di grigi è 0,3R + 0.6G + 0.11B. questi pesi arent assolutamente fondamentale in modo da poter giocare con loro. Ho fatto loro 0.25R + 0.5G + 0.25B. Produce un'immagine leggermente più scura.
Nota: il codice seguente presuppone formato di pixel a 32 bit xRGB
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
}
Controlla la colori FAQ informazioni su questo. Questi valori provengono dalla standardizzazione dei valori RGB che usiamo nei nostri schermi. In realtà, secondo il colore FAQ, i valori che si sta utilizzando non sono aggiornati, in quanto sono i valori utilizzati per lo standard NTSC originale e non monitor moderni.
Ecco un articolo su come sono stati ottenuti questi numeri (o simili):
Qual è la fonte di questi valori?
La "fonte" dei coefficienti pubblicati sono le specifiche NTSC che può essere visto in REC601 e Caratteristiche di televisione .
La "fonte ultima" sono la CIE circa 1931 esperimenti sulla percezione umana del colore. La risposta spettrale della visione umana non è uniforme. Gli esperimenti hanno portato alla ponderazione dei valori tristimolo basati sulla percezione. Il nostro L, coni M e S 1 sono sensibili alle lunghezze d'onda della luce che identifichiamo come "Rosso", "Verde" e "Blu" (rispettivamente), che è dove i colori primari tristimolo sono derivati . 2
La luce lineare 3 coefficienti spettrali per sRGB (e REC709) sono:
R lin * 0,2126 + G lin * 0,7152 + B lin * 0.0722 = y
Queste sono specifici per gli spazi colore sRGB e REC709, che sono destinati a rappresentare monitor per computer (sRGB) o monitor HDTV (REC709), e sono dettagliati nei documenti ITU per REC709 e anche < 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)
NOTE
(1) I coni sono il colore individuare le cellule della retina dell'occhio.
(2) Tuttavia, le lunghezze d'onda tristimolo scelti non sono al "picco" di ogni tipo cono - valori anziché tristimolo sono scelti in modo che stimolano il particolare cono tipo sostanzialmente più di un altro, cioè la separazione di stimolo
.
(3) È necessario linearizzare i valori sRGB prima di applicare i coefficienti. Discuto questo un'altra risposta qui.
Questi valori variano da persona a persona, in particolare per coloro che sono daltonici.
è tutto questo davvero necessario, la percezione umana e CRT vs LCD varierà, ma l'intensità di R G B non lo fa, perché non L = (R + G + B)/3
e impostare il nuovo RGB a L, L, L?