152 votes

Conversion de RVB en échelle de gris/intensité

Lors de la conversion de RGB en niveaux de gris, on dit qu'il faut appliquer des pondérations spécifiques aux canaux R, G et B. Ces poids sont : 0.2989, 0.5870, 0.1140.

On dit que la raison en est la différence de perception/sensibilité humaine envers ces trois couleurs. On dit aussi parfois que ce sont les valeurs utilisées pour calculer le signal NTSC.

Cependant, je n'ai pas trouvé de bonne référence à ce sujet sur le web. Quelle est la source de ces valeurs ?

Voir aussi ces questions précédentes : ici et ici .

27 votes

Oui, c'est vrai. Je fais de la programmation sur les valeurs RVB tout le temps. Il est très important d'appliquer des valeurs du "monde réel" à ces calculs si vous voulez que votre application ait de la valeur.

1 votes

De nombreux programmeurs peuvent ne pas s'en soucier et calculer des images en niveaux de gris "erronées", mais moi, je le fais.

6 votes

Je suis d'accord pour dire que c'est lié au codage - c'est un problème intéressant et pertinent si vous codifiez des graphiques. +1 car j'aimerais bien connaître la réponse moi-même.

102voto

denis Points 7316

Les chiffres spécifiques de la question proviennent du CCIR 601 (voir le lien Wikipedia ci-dessous).

Si vous convertissez RGB -> grayscale avec des chiffres légèrement différents / des méthodes différentes, vous ne verrez pas de différence du tout sur un écran d'ordinateur normal dans des conditions d'éclairage normales - essayez-le.

Voici d'autres liens sur la couleur en général :

Wikipedia Luma

Bruce Lindbloom Le remarquable site web de l'association

chapitre 4 sur la couleur dans le livre de Colin Ware, "Information Visualization", isbn 1-55860-819-2 ; ce long lien vers Ware dans livres.google.com peut ou ne peut pas fonctionner

cambridgeincolor : excellent, bien écrit "tutoriels sur la façon d'acquérir, d'interpréter et de traiter les photographies numériques en utilisant une approche visuelle qui met l'accent sur le concept plutôt que sur la procédure".

Si vous rencontrez des problèmes de RVB "linéaire" ou "non linéaire", voici une partie d'une vieille note que j'ai écrite à ce sujet. Je le répète, en pratique vous ne verrez pas beaucoup de différence.


RGB -> ^gamma -> Y -> L*

En science des couleurs, les valeurs RVB courantes, comme dans html rgb( 10%, 20%, 30% ), sont appelées "non linéaires" ou Correction gamma . Les valeurs "linéaires" sont définies comme suit

Rlin = R^gamma,  Glin = G^gamma,  Blin = B^gamma

où gamma est égal à 2,2 pour de nombreux PC. Les R G B habituels sont parfois écrits comme R' G' B' (R' = Rlin ^ (1/gamma)) (clic de langue des puristes) mais ici je laisse tomber le '.

La luminosité d'un écran CRT est proportionnelle à RGBlin = RGB ^ gamma, Ainsi, 50 % de gris sur un CRT est assez sombre : 0,5 ^ 2,2 = 22 % de la luminosité maximale. (Les écrans LCD sont plus complexes ; de plus, certaines cartes graphiques compensent le gamma).

Pour obtenir la mesure de la légèreté appelée L* à partir de RGB, divise d'abord R G B par 255, et calcule

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma

C'est Y dans l'espace couleur XYZ ; il s'agit d'une mesure de la "luminance" des couleurs. (Les formules réelles ne sont pas exactement x^gamma, mais proches ; s'en tenir à x^gamma pour une première passe).

Enfin,

L* = 116 * Y ^ 1/3 - 16

"... aspire à l'uniformité perceptive [et] correspond étroitement à la perception humaine de la légèreté". -- Wikipedia Espace couleur du laboratoire

9 votes

Y = 0,2126 * R + 0,7152 * G + 0,0722 * B - Wikipedia ( fr.wikipedia.org/wiki/Grayscale )

0 votes

Bonjour, puis-je obtenir une image panchromatique équivalente en affichant l'image couleur RVB comme une image en niveaux de gris ? Ou bien le componnet d'intensité d'une image au format HIS convertie à partir de RGB peut-il représenter une image panchromatique ?

0 votes

@emberbillow, il y a beaucoup de Il existe plusieurs façons de convertir la couleur en niveaux de gris, dont certaines fonctionneront peut-être assez bien, mais pas toujours. Quel programme utilisez-vous, avez-vous lu sa documentation ? Vous pourriez simplement essayer et voir sur plusieurs de vos photos. votre images de test.

17voto

ypnos Points 21940

J'ai trouvé que cette publication était référencée dans une réponse à une précédente question similaire. Elle est très utile :

http://cadik.posvete.cz/color_to_gray_evaluation/

Il montre des "tonnes" de méthodes différentes pour générer des images en niveaux de gris avec des résultats différents !

10voto

twerdster Points 3065

Voici un code en C pour convertir le RVB en niveaux de gris. La pondération réelle utilisée pour la conversion de rgb en niveaux de gris est 0.3R+0.6G+0.11B. Ces poids ne sont pas absolument critiques donc vous pouvez jouer avec eux. Je les ai faites 0.25R+0.5G+0.25B. Cela produit une image légèrement plus sombre.

REMARQUE : Le code suivant suppose un format de pixel xRGB 32bit.

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
        }

2 votes

0,3 0,6 0,11 ne font pas 1. Wikipedia semble suggérer 0,30 0,59 0,11.

0 votes

C'est vrai, mais le seul résultat de la non addition à 1 sera un très léger changement d'intensité. La méthode proposée de 0,25, 0,5, 0,25 s'ajoute à 1 mais cela n'aurait pas d'importance si ce n'était pas le cas. Il s'agit d'une optimisation, donc renoncer à un tout petit peu de précision est un compromis raisonnable.

4 votes

@twerdster Aucun des deux ensembles de coefficients n'est correct. .3, .6, .11 est l'ancien standard NTSC, pas sRGB/Rec709 (ce qui est ce que le web et la plupart des ordinateurs utilisent). Et votre 0,25,0,5,0,25 n'est pas un compromis raisonnable - B ne représente que 7% de la luminance, vous vous trompez de 347%. Les coefficients pour sRGB/r709 (après linéarisation) : Rlin * 0,2126 + Glin * 0,7152 + Blin * 0,0722 = Y Ces pondérations spectrales sont dérivées de la perception spectrale humaine. Vous ne pouvez pas vous contenter d'entrer les chiffres que vous voulez par commodité et espérer être précis. Vous devez linéariser sRGB, puis appliquer les coefficients corrects.

8voto

rmmh Points 4361

Voici un article qui explique comment ces chiffres (ou des chiffres similaires) ont été obtenus :

https://web.archive.org/web/20160303201512/http://www.cis.rit.edu/mcsl/research/broadbent/CIE1931_RGB.pdf

6voto

Brian Campbell Points 101107

Consultez le FAQ sur les couleurs pour obtenir des informations à ce sujet. Ces valeurs proviennent de la normalisation des valeurs RVB que nous utilisons dans nos écrans. En fait, selon la FAQ sur la couleur, les valeurs que vous utilisez sont dépassées, car il s'agit des valeurs utilisées pour la norme NTSC originale et non pour les moniteurs modernes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X