web-dev-qa-db-fra.com

Conversion de RVB en niveaux de gris / intensité

Lors de la conversion de RVB en niveaux de gris, il est indiqué que des poids spécifiques aux canaux R, G et B doivent être appliqués. Ces poids sont: 0,2989, 0,5870, 0,1140.

On dit que la raison en est différente de la perception/sensibilité humaine envers ces trois couleurs. Parfois, il est également dit que ce sont les valeurs utilisées pour calculer le signal NTSC.

Cependant, je n'ai pas trouvé de bonne référence pour cela sur le Web. Quelle est la source de ces valeurs?

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

113
ypnos

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

Si vous convertissez des RVB -> niveaux de gris avec des nombres légèrement différents/des méthodes différentes, vous ne verrez pas beaucoup de différence sur un écran d'ordinateur normal dans des conditions d'éclairage normales - essayez-le.

Voici quelques liens supplémentaires sur la couleur en général:

Wikipedia Luma

Bruce Lindbloom Le site Web exceptionnel de ==

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

cambridgeincolor : excellent, bien écrit "tutoriels sur la façon d'acquérir, d'interpréter et de traiter des 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 RVB "linéaires" ou "non linéaires", voici une partie d’une vieille note à ce sujet. Répétez, dans la pratique, vous ne verrez pas beaucoup de différence.


RVB -> ^ gamma -> Y -> L *

En couleur, les valeurs RVB communes, comme en html rgb (10%, 20%, 30%), sont appelées "non linéaires" ou corrigées gamma . Les valeurs "linéaires" sont définies comme

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

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

La luminosité sur un écran cathodique est proportionnelle à RGBlin = RVB ^ gamma, donc 50% de gris sur un tube cathodique 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 légèreté appelée L* de RVB, divisez d'abord R G B par 255 et calculez

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

C'est Y dans l'espace colorimétrique XYZ; c'est une mesure de couleur "luminance". (Les vraies formules ne sont pas exactement x ^ gamma, mais proches; restez avec x ^ gamma pour une première passe.)

Finalement,

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

"... aspire à l'uniformité perceptuelle [et] correspond étroitement à la perception humaine de la légèreté." - Wikipedia espace colorimétrique Lab

79
denis

J'ai trouvé que cette publication faisait référence à une réponse à une question similaire précédente. C'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!

11
ypnos

Voici un peu de code en c pour convertir RGB en niveaux de gris. La pondération réelle utilisée pour la conversion des niveaux de gris en niveaux de gris est 0,3R + 0,6G + 0,11B. ces poids ne sont pas absolument critiques pour que vous puissiez jouer avec eux. Je les ai faits 0,25R + 0,5G + 0,25B. Cela produit une image légèrement plus sombre.

REMARQUE: le code suivant suppose le format de pixel xRGB 32 bits

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
        }
9
twerdster

Voici un article sur la façon dont ces nombres (ou des nombres similaires) ont été dérivés:

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

6
rmmh

Consultez le FAQ sur les couleurs pour plus d'informations à ce sujet. Ces valeurs proviennent de la normalisation des valeurs RVB que nous utilisons dans nos affichages. En fait, selon la FAQ sur les couleurs, les valeurs que vous utilisez sont obsolètes, car elles correspondent aux valeurs utilisées pour le moniteur d'origine NTSC standard et non moderne.

6
Brian Campbell

Quelle est la source de ces valeurs?

Les "sources" des coefficients affichés sont les spécifications NTSC visibles dans ) Rec601 et - Caractéristiques de la télévision .

La "source ultime" sont les expériences de la CIE vers 1931 sur la perception des couleurs par l'homme. La réponse spectrale de la vision humaine n'est pas uniforme. Les expériences ont conduit à pondérer les valeurs du tristimulus en fonction de la perception. Nos cônes L, M et S1 sont sensibles aux longueurs d'onde de la lumière que nous identifions comme "Rouge", "Vert" et "Bleu" (respectivement), où sont dérivées les couleurs primaires tristimulus.2

La lumière linéaire3 Les pondérations spectrales pour sRGB (et Rec709) sont les suivantes:

Rlin * 0,2126 + Glin * 0.7152 + Blin * 0,0722 = Y

Celles-ci sont spécifiques aux espaces de couleurs sRGB et Rec709, destinés à représenter des moniteurs d’ordinateur (sRGB) ou des moniteurs HDTV (Rec709), et sont détaillées dans les documents de l’UIT pour Rec709 ainsi que BT.2380-2 (10/2018)

[~ # ~] notes de bas de page [~ # ~] (1) Les cônes sont les cellules détectant la couleur de l'œil. rétine.
(2) Cependant, les longueurs d'onde de tristimulus choisies ne sont PAS au "pic" de chaque type de cône - les valeurs de tristimulus sont choisies de manière à stimuler davantage sur un type de cône particulier qu'un autre, c'est-à-dire la séparation du stimulus.
(3) Vous devez linéariser vos valeurs sRGB avant d'appliquer les coefficients. Je discute de cela dans une autre réponse ici.

2
Myndex