Voici le seul algorithme CORRECT pour convertir les images sRGB, telles qu'utilisées dans les navigateurs etc., en niveaux de gris.
Il est nécessaire d'appliquer un inverse de la fonction gamma pour l'espace couleur avant de calculer le produit interne. Ensuite, vous appliquez la fonction gamma à la valeur réduite. Le fait de ne pas intégrer la fonction gamma peut entraîner des erreurs allant jusqu'à 20 %.
Pour le matériel informatique typique, l'espace couleur est sRGB. Les bons chiffres pour sRGB sont approximativement 0,21, 0,72, 0,07. Le gamma pour sRGB est une fonction composite qui se rapproche de l'exponentiation par 1/(2,2). Voici le tout en C++.
// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;
// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
double c = ic/255.0;
if ( c <= 0.04045 )
return c/12.92;
else
return pow(((c+0.055)/(1.055)),2.4);
}
// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
if(v<=0.0031308)
v *= 12.92;
else
v = 1.055*pow(v,1.0/2.4)-0.055;
return int(v*255+0.5); // This is correct in C++. Other languages may not
// require +0.5
}
// GRAY VALUE ("brightness")
int gray(int r, int g, int b) {
return gam_sRGB(
rY*inv_gam_sRGB(r) +
gY*inv_gam_sRGB(g) +
bY*inv_gam_sRGB(b)
);
}
10 votes
La luminosité perçue est ce que je pense rechercher, merci.
2 votes
Il existe un bon article ( Manipulation des couleurs en .NET - Partie 1 ) sur les espaces de couleur et les conversations entre eux, y compris la théorie et le code (C#). Pour la réponse, voir Conversion entre les modèles sujet dans l'article.
4 votes
Je suis membre depuis de nombreuses années, et je n'ai jamais fait cela auparavant. Puis-je vous suggérer de revoir les réponses et de repenser à celle que vous allez accepter ?