La risposta "Accettata" è errata e incompleta
Le uniche risposte accurate sono le risposte @ jive-dadson e @EddingtonsMonkey e nel supporto @ nils-pipenbrinck . Le altre risposte (incluso quello accettato) si collegano o citano fonti errate, irrilevanti, obsolete o rotte.
Brevemente:
- sRGB deve essere LINEARIZZATO prima di applicare i coefficienti.
- La luminanza (L o Y) è lineare come la luce.
- La leggerezza percepita (L *) non è lineare come la percezione umana.
- HSV e HSL non sono nemmeno lontanamente precisi in termini di percezione.
- Lo standard IEC per sRGB specifica una soglia di 0,04045 NON è 0,03928 (proveniente da una bozza iniziale obsoleta).
- Per essere utili (cioè relative alla percezione) , le distanze euclide richiedono uno spazio vettoriale cartesiano percettivamente uniforme come CIELAB. sRGB non è uno.
Quella che segue è una risposta corretta e completa:
Poiché questa discussione appare altamente nei motori di ricerca, sto aggiungendo questa risposta per chiarire le varie idee sbagliate sull'argomento.
La luminosità è un attributo percettivo, non ha una misura diretta.
La luminosità percepita viene misurata da alcuni modelli di visione come CIELAB, qui L * (Lstar) è una misura della leggerezza percettiva ed è non lineare per approssimare la curva di risposta non lineare della visione umana.
La luminanza è una misura lineare della luce, spettralmente ponderata per la visione normale ma non regolata per la percezione non lineare della luminosità.
Luma ( Y´ prime) è un segnale con codifica gamma, ponderato utilizzato in alcune codifiche video. Non deve essere confuso con la luminanza lineare.
Gamma o curva di trasferimento (TRC) è una curva che è spesso simile alla curva percettiva e viene comunemente applicata ai dati delle immagini per l'archiviazione o la trasmissione per ridurre il rumore percepito e / o migliorare l'utilizzo dei dati (e i relativi motivi).
Per determinare la luminosità percepita , prima converti i valori dell'immagine R´G´B´ codificata in gamma in luminanza lineare ( L
o Y
) e poi in luminosità percepita non lineare ( L*
)
PER TROVARE LA LUMINANZA:
... Perché apparentemente si era perso da qualche parte ...
Primo passo:
Converti tutti i valori interi di sRGB a 8 bit in decimale 0,0-1,0
vR = sR / 255;
vG = sG / 255;
vB = sB / 255;
Passo due:
Converti un RGB con codifica gamma in un valore lineare. sRGB (standard per computer) ad esempio richiede una curva di potenza di circa V ^ 2.2, sebbene la trasformazione "accurata" sia:
Dove V´ è il canale R, G o B con codifica gamma di sRGB.
pseudocodice:
function sRGBtoLin(colorChannel) {
// Send this function a decimal sRGB gamma encoded color value
// between 0.0 and 1.0, and it returns a linearized value.
if ( colorChannel <= 0.04045 ) {
return colorChannel / 12.92;
} else {
return pow((( colorChannel + 0.055)/1.055),2.4));
}
}
Terzo passaggio:
Per trovare la luminanza (Y) applicare i coefficienti standard per sRGB:
Pseudocodice usando le funzioni sopra:
Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))
PER TROVARE LA LEGGEREZZA PERCEPITA:
Quarto passaggio:
Prendi la luminanza Y dall'alto e trasformala in L *
pseudocodice:
function YtoLstar(Y) {
// Send this function a luminance value between 0.0 and 1.0,
// and it returns L* which is "perceptual lightness"
if ( Y <= (216/24389) { // The CIE standard states 0.008856 but 216/24389 is the intent for 0.008856451679036
return Y * (24389/27); // The CIE standard states 903.3, but 24389/27 is the intent, making 903.296296296296296
} else {
return pow(Y,(1/3)) * 116 - 16;
}
}
L * è un valore compreso tra 0 (nero) e 100 (bianco) dove 50 è il "medio grigio" percettivo. L * = 50 è l'equivalente di Y = 18,4, ovvero una carta grigia al 18%, che rappresenta il centro di un'esposizione fotografica (zona V di Ansel Adams).
Riferimenti:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Domande frequenti sulla gamma di Charles Poynton