La réponse «acceptée» est incorrecte et incomplète
Les seules réponses exactes sont les réponses @ jive-dadson et @EddingtonsMonkey , et à l'appui de @ nils-pipenbrinck . Les autres réponses (y compris celles acceptées) sont liées à ou citant des sources qui sont erronées, non pertinentes, obsolètes ou cassées.
Brièvement:
- sRGB doit être LINÉARISÉ avant d'appliquer les coefficients.
- La luminance (L ou Y) est linéaire, tout comme la lumière.
- La légèreté perçue (L *) est non linéaire tout comme la perception humaine.
- HSV et HSL ne sont même pas précis à distance en termes de perception.
- La norme CEI pour sRGB spécifie un seuil de 0,04045 ce n'est PAS 0,03928 (qui provenait d'un premier projet obsolète).
- Pour être utiles (c'est-à-dire par rapport à la perception) , les distances euclidiennes nécessitent un espace vectoriel cartésien perceptuellement uniforme tel que CIELAB. sRGB n'en est pas un.
Ce qui suit est une réponse correcte et complète:
Parce que ce fil apparaît fortement dans les moteurs de recherche, j'ajoute cette réponse pour clarifier les diverses idées fausses sur le sujet.
La luminosité est un attribut perceptuel, elle n'a pas de mesure directe.
La légèreté perçue est mesurée par certains modèles de vision tels que CIELAB, ici L * (Lstar) est une mesure de la légèreté perceptuelle , et est non linéaire pour approximer la courbe de réponse non linéaire de la vision humaine.
La luminance est une mesure linéaire de la lumière, spectralement pondérée pour la vision normale mais non ajustée pour la perception non linéaire de la luminosité.
Luma ( Y´ prime) est un signal pondéré codé gamma utilisé dans certains codages vidéo. Il ne faut pas le confondre avec la luminance linéaire.
La courbe gamma ou de transfert (TRC) est une courbe qui est souvent similaire à la courbe de perception, et est couramment appliquée aux données d'image pour le stockage ou la diffusion afin de réduire le bruit perçu et / ou d'améliorer l'utilisation des données (et les raisons connexes).
Pour déterminer la luminosité perçue , convertissez d'abord les valeurs d'image R´G´B´ codées gamma en luminance linéaire ( L
ou Y
) puis en luminosité perçue non linéaire ( L*
)
POUR TROUVER LA LUMINANCE:
... Parce qu'apparemment il a été perdu quelque part ...
La première étape:
Convertir toutes les valeurs entières sRGB 8 bits en décimal 0,0-1,0
vR = sR / 255;
vG = sG / 255;
vB = sB / 255;
Deuxième étape:
Convertissez un RVB codé gamma en une valeur linéaire. sRGB (standard informatique), par exemple, nécessite une courbe de puissance d'environ V ^ 2,2, bien que la transformation "précise" soit:
Où V´ est le canal R, G ou B codé gamma de sRGB.
Pseudocode:
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));
}
}
Troisième étape:
Pour trouver la luminance (Y), appliquez les coefficients standard pour sRGB:
Pseudocode utilisant les fonctions ci-dessus:
Y = (0.2126 * sRGBtoLin(vR) + 0.7152 * sRGBtoLin(vG) + 0.0722 * sRGBtoLin(vB))
POUR TROUVER LA LÉGÈRETÉ PERÇUE:
Quatrième étape:
Prenez la luminance Y d'en haut et transformez-la en L *
Pseudocode:
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 * est une valeur de 0 (noir) à 100 (blanc) où 50 est le "gris moyen" perceptuel. L * = 50 est l'équivalent de Y = 18,4, c'est-à-dire une carte grise à 18%, représentant le milieu d'une exposition photographique (zone Ansel Adams V).
Références:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
FAQ Gamma de Charles Poynton