Conversion RVB en niveaux de gris / intensité


129

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

On dit que la raison en est une perception / sensibilité humaine différente envers ces trois couleurs. Parfois, on dit aussi 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 ces questions précédentes: ici et ici .


26
Oui. 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 vaille la peine.
Neil N

1
De nombreux programmeurs ne se soucient pas et ne calculent pas les images "fausses" en niveaux de gris, mais je le fais.
ypnos

6
Je conviens que c'est lié au codage - un problème intéressant et pertinent si vous codez des graphiques. +1 car j'aimerais connaître la réponse moi
Cruachan

6
RVB est lié à la programmation. C'est aussi lié à la programmation que l'analyse des chaînes de date. Comme la conversion du texte "vrai" en une valeur booléenne.
Neil N

Réponses:


87

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

Si vous convertissez 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:

Wikipédia Luma

Site Web exceptionnel de Bruce Lindbloom

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 fonctionner ou non

cambridgeincolor : excellents "tutoriels bien rédigés sur la façon d'acquérir, d'interpréter et de traiter des photographies numériques en utilisant une approche visuellement orientée 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 pour moi-même à ce sujet. Répétez, en pratique, vous ne verrez pas beaucoup de différence.


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

En science de la couleur, les valeurs RVB courantes, comme dans html rgb (10%, 20%, 30%), sont dites "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 de 2,2 pour de nombreux PC. Les RVB habituels sont parfois écrits sous la forme R 'G' B '(R' = Rlin ^ (1 / gamma)) (clic-langue des puristes) mais ici je laisse tomber le '.

La luminosité sur un écran CRT est proportionnelle à RGBlin = RGB ^ gamma, donc 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 luminosité appelée à L*partir de RVB, divisez d'abord RVB par 255 et calculez

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

C'est Ydans l'espace colorimétrique XYZ; c'est une mesure de la "luminance" de la couleur. (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é." - Espace colorimétrique Wikipedia Lab


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

14

J'ai trouvé que cette publication faisait référence dans 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!


9

Voici du code en c pour convertir RVB en niveaux de gris. La pondération réelle utilisée pour la conversion RVB en niveaux de gris est 0,3R + 0,6G + 0,11B. ces poids ne sont pas absolument essentiels 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
        }

2
0,3 0,6 0,11 ne pas ajouter à 1. Wikipédia semble suggérer 0,30 0,59 0,11.
damix911

C'est vrai, mais le seul résultat de ne pas ajouter 1 sera un très léger changement d'intensité. La méthode proposée de 0,25,0,5,0,25 ajoute à 1 mais peu importe si elle ne l'a pas fait. C'est une optimisation, donc renoncer à un peu de précision est un compromis raisonnable.
twerdster

2
@twerdster Aucun des ensembles de coefficients n'est correct. .3, .6, .11 est l'ancienne norme NTSC, et non sRGB / Rec709 (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 simplement utiliser les nombres que vous voulez pour plus de commodité et espérer être précis. Vous devez linéariser sRGB, puis appliquer les coefficients corrects.
Myndex

Si vous êtes dans une situation où fracture est trop cher, une approximation qui utilise une multiplication simple avec des changements et ajoute est: 0.11111111 * ((G + (G<<1) + R) <<1) + B). Cela équivaut à (2*R+6*G+B) / 9)ou 0.222 R + 0.666 G + 0.111 B. Avant de passer à la production, comparez à une formule précise pour divers cas de test.
ToolmakerSteve


6

Consultez la FAQ Couleur pour plus d'informations à ce sujet. Ces valeurs proviennent de la standardisation des valeurs RVB que nous utilisons dans nos écrans. En fait, selon la FAQ Color, les valeurs que vous utilisez sont obsolètes, car ce sont les valeurs utilisées pour la norme NTSC d'origine et non pour les moniteurs modernes.


3

Quelle est la source de ces valeurs?

La «source» des coefficients affichés sont les spécifications NTSC qui peuvent être vues 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 humaine des couleurs. La réponse spectrale de la vision humaine n'est pas uniforme. Des expériences ont conduit à une pondération des valeurs trichromatiques en fonction de la perception. Nos cônes L, M et S 1 sont sensibles aux longueurs d'onde lumineuses que nous identifions comme "Rouge", "Vert" et "Bleu" (respectivement), d'où proviennent les couleurs primaires trichromatiques. 2

Les pondérations spectrales de la lumière linéaire 3 pour sRGB (et Rec709) sont:

R lin * 0,2126 + G lin * 0,7152 + B lin * 0,0722 = Y

Ceux-ci sont spécifiques aux espaces de couleurs sRGB et Rec709, qui sont destinés à représenter des moniteurs d'ordinateur (sRGB) ou des moniteurs HDTV (Rec709), et sont détaillés dans les documents ITU pour Rec709 et BT.2380-2 (10/2018)

NOTES (1) Les cônes sont les cellules de détection de couleur de la rétine de l'œil.
(2) Cependant, les longueurs d'onde tristimulus choisies ne sont PAS au "pic" de chaque type de cône - au lieu de cela, les valeurs tristimulus sont choisies de telle sorte qu'elles stimulent sensiblement plus 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. J'en discute dans une autre réponse ici.


-2

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


-4

est tout cela vraiment nécessaire, la perception humaine et CRT vs LCD varieront, mais l'intensité RVB ne le fait pas, pourquoi pas L = (R + G + B)/3et régler le nouveau RVB sur L, L, L?


3
Le simple fait de faire la moyenne des trois primaires R, V, B les traite comme perceptuellement égaux, ce qui n'est pas le cas pour le système de vision humain.
Bill Feth
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.