Conversion de RVB en échelle de gris / intensité

lors de la conversion de RVB en échelle de gris, il est dit que des poids spécifiques aux canaux R, G, et B doivent être appliqués. Ces poids sont: 0.2989, 0.5870, 0.1140.

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

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

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

105
demandé sur Community 2009-03-26 22:39:07

7 réponses

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

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

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

Wikipedia Luma

Bruce Lindbloom 's outstanding web site

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

cambridgeincolor : excellent, bien écrit "tutoriels sur l'acquisition, l'interprétation et le traitement des photographies numériques utiliser une approche visuelle qui le concept met l'accent sur la procédure "

si vous rencontrez "linear" vs" nonlinear " RGB, voici une partie d'un ancien note à moi-même. Répéter, dans la pratique, vous ne verrez pas beaucoup de différence.


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

en science des couleurs, les valeurs RVB communes, comme en html RVB (10%, 20%, 30% ), sont appelés "non-linéaire" ou Gamma corrigé . "Linéaire" les valeurs sont définies comme

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

où gamma est de 2,2 pour de nombreux PC. Les r g b habituels sont parfois écrits comme R 'G' B' (R' = Rlin ^ (1 / gamma)) (les puristes de la langue de la souris), mais ici, je vais laisser tomber le".

la luminosité sur un écran CRT est proportionnelle à RGBlin = RGB ^ gamma, donc 50% de gris sur un CRT est assez sombre: .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 RGB, diviser d'abord R G B par 255, et calculer

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

C'est Y dans L'espace couleur XYZ; c'est une mesure de"luminance" de couleur. (Les vraies formules ne sont pas exactement X ^ gamma, mais proche; bâton avec x^gamma pour un premier passage.)

enfin, L* = 116 * Y ^ 1/3-16 "... aspire à l'uniformité perceptuelle ... correspond étroitement à la perception humaine de la légèreté." -- Wikipedia espace couleur Lab

69
répondu denis 2014-02-14 10:49:40

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

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

il montre 'des tonnes' de différentes méthodes pour générer des images en échelle de gris avec des résultats différents!

10
répondu ypnos 2017-08-13 06:41:59

hérite d'un code en c pour convertir rgb en grayscale. La pondération réelle utilisée pour la conversion de RVB en grayscale est de 0,3 R+0,6 G+0,11 B. ces poids ne sont pas absolument critique donc vous pouvez jouer avec eux. Je les ai fait 0.25 R + 0.5 G+0.25 B. Il produit une image légèrement plus sombre.

NOTE: le code suivant suppose xrgb 32bit format pixel

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
répondu twerdster 2011-01-30 00:18:18

consultez le FAQ couleur pour des informations à ce sujet. Ces valeurs proviennent de la standardisation des valeurs RVB que nous utilisons dans nos affichages. En fait, selon la FAQ couleur, les valeurs que vous utilisez sont dépassées, car ce sont les valeurs utilisées pour la norme NTSC originale et non les moniteurs modernes.

6
répondu Brian Campbell 2009-03-26 19:51:20

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

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

6
répondu rmmh 2017-04-10 23:38:26

ces valeurs varient d'une personne à l'autre, en particulier pour les personnes qui sont daltoniennes.

-1
répondu Bob Pickle 2016-08-18 01:04:03

est tout cela vraiment nécessaire, la perception humaine et CRT vs LCD va varier, mais l'intensité de R G B ne, pourquoi pas L = (R + G + B)/3 et mettre le nouveau RGB À L, L, l?

-2
répondu user1668969 2018-03-13 13:45:05