Je cherche une sorte de formule ou d'algorithme pour déterminer la luminosité d'une couleur compte tenu des valeurs RVB. Je sais que cela ne peut pas être aussi simple que d'ajouter les valeurs RVB ensemble et que les sommes plus élevées soient plus lumineuses, mais je ne sais pas par où commencer.
387
Réponses:
Voulez-vous dire la luminosité? Luminosité perçue? Luminance?
(0.2126*R + 0.7152*G + 0.0722*B)
[1](0.299*R + 0.587*G + 0.114*B)
[2]→sqrt( 0.241*R^2 + 0.691*G^2 + 0.068*B^2 )
sqrt( 0.299*R^2 + 0.587*G^2 + 0.114*B^2 )
(merci à @MatthewHerbst ) [3]la source
0.299*(R^2)
(car l'exponentiation va avant la multiplication)Je pense que ce que vous recherchez est la formule de conversion RVB -> Luma .
Photométrique / numérique ITU BT.709 :
Digital ITU BT.601 (donne plus de poids aux composants R et B):
Si vous êtes prêt à échanger l'exactitude contre des performances, il existe deux formules d'approximation pour celle-ci:
Ceux-ci peuvent être calculés rapidement comme
la source
Blue
+ 3 * vert) / 6, le deuxième est (3 * rouge +Blue
+ 4 * vert) >> 3. d'accord, dans les deux approximations rapides, Blue a le poids le plus bas, mais il est toujours là.Y = (R<<1+R+G<<2+B)>>3
(c'est seulement 3-4 cycles CPU sur ARM) mais je suppose qu'un bon compilateur fera cette optimisation pour vous.J'ai fait une comparaison des trois algorithmes dans la réponse acceptée. J'ai généré des couleurs en cycle où seulement environ chaque 400e couleur a été utilisée. Chaque couleur est représentée par 2x2 pixels, les couleurs sont triées du plus foncé au plus clair (de gauche à droite, de haut en bas).
1ère photo - Luminance (relative)
2e photo - http://www.w3.org/TR/AERT#color-contrast
3e photo - Modèle couleur HSP
4ème image - WCAG 2.0 SC 1.4.3 formule de luminance relative et de rapport de contraste (voir @ Synchro's réponse de ici )
Le motif peut parfois être repéré sur la 1ère et la 2ème image en fonction du nombre de couleurs sur une ligne. Je n'ai jamais repéré de motif sur l'image du 3e ou du 4e algorithme.
Si je devais choisir, j'irais avec l'algorithme numéro 3 car il est beaucoup plus facile à mettre en œuvre et environ 33% plus rapide que le 4ème.
la source
^2
etsqrt
inclus dans la troisième formule sont un moyen plus rapide d'approximer RGB linéaire à partir de RGB non linéaire au lieu de^2.2
et^(1/2.2)
ce serait plus correct. Malheureusement, l'utilisation d'entrées non linéaires plutôt que linéaires est extrêmement courante.Vous trouverez ci-dessous 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 une inverse de la fonction gamma pour l'espace colorimétrique avant de calculer le produit intérieur. 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 pouvant atteindre 20%.
Pour les trucs informatiques typiques, l'espace colorimétrique est sRGB. Les bons numéros pour sRGB sont d'env. 0,21, 0,72, 0,07. Le gamma pour sRGB est une fonction composite qui rapproche l'exponentiation de 1 / (2,2). Voici le tout en C ++.
la source
La réponse «acceptée» est incorrecte et incomplète
Les seules réponses exactes sont les réponses @ jive-dadson et @EddingtonsMonkey , et à l'appui de @ nils-pipenbrinck . Les autres réponses (y compris celles acceptées) sont liées à ou citant des sources qui sont erronées, non pertinentes, obsolètes ou cassées.
Brièvement:
Ce qui suit est une réponse correcte et complète:
Parce que ce fil apparaît fortement dans les moteurs de recherche, j'ajoute cette réponse pour clarifier les diverses idées fausses sur le sujet.
La luminosité est un attribut perceptuel, elle n'a pas de mesure directe.
La légèreté perçue est mesurée par certains modèles de vision tels que CIELAB, ici L * (Lstar) est une mesure de la légèreté perceptuelle , et est non linéaire pour approximer la courbe de réponse non linéaire de la vision humaine.
La luminance est une mesure linéaire de la lumière, spectralement pondérée pour la vision normale mais non ajustée pour la perception non linéaire de la luminosité.
Luma ( Y´ prime) est un signal pondéré codé gamma utilisé dans certains codages vidéo. Il ne faut pas le confondre avec la luminance linéaire.
La courbe gamma ou de transfert (TRC) est une courbe qui est souvent similaire à la courbe de perception, et est couramment appliquée aux données d'image pour le stockage ou la diffusion afin de réduire le bruit perçu et / ou d'améliorer l'utilisation des données (et les raisons connexes).
Pour déterminer la luminosité perçue , convertissez d'abord les valeurs d'image R´G´B´ codées gamma en luminance linéaire (
L
ouY
) puis en luminosité perçue non linéaire (L*
)POUR TROUVER LA LUMINANCE:
... Parce qu'apparemment il a été perdu quelque part ...
La première étape:
Convertir toutes les valeurs entières sRGB 8 bits en décimal 0,0-1,0
Deuxième étape:
Convertissez un RVB codé gamma en une valeur linéaire. sRGB (standard informatique), par exemple, nécessite une courbe de puissance d'environ V ^ 2,2, bien que la transformation "précise" soit:
Où V´ est le canal R, G ou B codé gamma de sRGB.
Pseudocode:
Troisième étape:
Pour trouver la luminance (Y), appliquez les coefficients standard pour sRGB:
Pseudocode utilisant les fonctions ci-dessus:
POUR TROUVER LA LÉGÈRETÉ PERÇUE:
Quatrième étape:
Prenez la luminance Y d'en haut et transformez-la en L *
Pseudocode:
L * est une valeur de 0 (noir) à 100 (blanc) où 50 est le "gris moyen" perceptuel. L * = 50 est l'équivalent de Y = 18,4, c'est-à-dire une carte grise à 18%, représentant le milieu d'une exposition photographique (zone Ansel Adams V).
Références:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
FAQ Gamma de Charles Poynton
la source
Luma=rgb2gray(RGB);LAB=rgb2lab(RGB);LAB(:,:,2:3)=0;PerceptualGray=lab2rgb(LAB);
L*a*b*
ne prend pas en compte un certain nombre d'attributs psychophysiques. L'effet Helmholtz-Kohlrausch en est un, mais il y en a beaucoup d'autres. CIELAB n'est en aucun cas un modèle d'évaluation d'image "complet". Dans mon article, j'essayais de couvrir les concepts de base aussi complètement que possible sans s'aventurer dans les minuties très profondes. Le modèle Hunt, les modèles Fairchild et d'autres font un travail plus complet, mais sont également beaucoup plus complexes.J'ai trouvé ce code (écrit en C #) qui fait un excellent travail de calcul de la "luminosité" d'une couleur. Dans ce scénario, le code tente de déterminer s'il faut mettre du texte blanc ou noir sur la couleur.
la source
Fait intéressant, cette formulation pour RGB => HSV utilise simplement v = MAX3 (r, g, b). En d'autres termes, vous pouvez utiliser le maximum de (r, g, b) comme V dans HSV.
J'ai vérifié et à la page 575 de Hearn & Baker, c'est ainsi qu'ils calculent également la "valeur".
la source
Plutôt que de vous perdre parmi la sélection aléatoire de formules mentionnées ici, je vous suggère d'opter pour la formule recommandée par les normes W3C.
Voici une implémentation PHP simple mais exacte des formules de luminance relative et de rapport de contraste WCAG 2.0 SC 1.4.3 . Il produit des valeurs qui sont appropriées pour évaluer les ratios requis pour la conformité WCAG, comme sur cette page , et en tant que tel est approprié et approprié pour toute application Web. C'est trivial à porter dans d'autres langues.
la source
Pour ajouter ce que tous les autres ont dit:
Toutes ces équations fonctionnent un peu bien dans la pratique, mais si vous devez être très précis, vous devez d'abord convertir la couleur en espace colorimétrique linéaire (appliquer le gamma d'image inverse), faire la moyenne de poids des couleurs primaires et - si vous voulez afficher la couleur - ramenez la luminance dans le gamma du moniteur.
La différence de luminance entre la création d'un gamma et la réalisation d'un gamma correct peut atteindre 20% dans les gris foncés.
la source
Je résolvais une tâche similaire aujourd'hui en javascript. J'ai choisi cette
getPerceivedLightness(rgb)
fonction pour une couleur HEX RGB. Il traite de l'effet Helmholtz-Kohlrausch via la formule Fairchild et Perrotta pour la correction de la luminance.la source
L'espace colorimétrique HSV devrait faire l'affaire, voir l' article wikipedia selon la langue dans laquelle vous travaillez, vous pouvez obtenir une conversion de bibliothèque.
H est la teinte qui est une valeur numérique pour la couleur (c'est-à-dire rouge, vert ...)
S est la saturation de la couleur, c'est-à-dire son intensité
V est la «luminosité» de la couleur.
la source
Valeur de luminance RVB = 0,3 R + 0,59 G + 0,11 B
http://www.scantips.com/lumin.html
Je pense que l'espace colorimétrique RVB est perceptiblement non uniforme par rapport à la distance euclidienne L2. Les espaces uniformes incluent CIE LAB et LUV.
la source
La formule de gamma inverse de Jive Dadson doit avoir le demi-ajustement supprimé lorsqu'elle est implémentée en Javascript, c'est-à-dire que le retour de la fonction gam_sRGB doit être return int (v * 255); ne renvoie pas int (v * 255 + .5); Un demi-ajustement arrondit vers le haut, ce qui peut entraîner une valeur trop élevée sur un trièdre R = G = B, c'est-à-dire gris. La conversion en niveaux de gris sur une triade R = G = B devrait produire une valeur égale à R; c'est une preuve que la formule est valide. Voir Neuf nuances de gris pour la formule en action (sans le demi-réglage).
la source
Je me demande comment ces coefficients RVB ont été déterminés. J'ai fait une expérience moi-même et je me suis retrouvé avec ce qui suit:
Proche mais évidemment différent des coefficients UIT établis de longue date. Je me demande si ces coefficients pourraient être différents pour chaque observateur, car nous pouvons tous avoir une quantité différente de cônes et de bâtonnets sur la rétine à nos yeux, et en particulier le rapport entre les différents types de cônes peut différer.
Pour référence:
UIT BT.709:
UIT BT.601:
J'ai fait le test en déplaçant rapidement une petite barre grise sur un fond rouge vif, vert vif et bleu vif, et en ajustant le gris jusqu'à ce qu'il se mélange autant que possible. J'ai également répété ce test avec d'autres teintes. J'ai répété le test sur différents écrans, même un avec un facteur gamma fixe de 3,0, mais tout me semble identique. De plus, les coefficients ITU sont littéralement mauvais à mes yeux.
Et oui, j'ai probablement une vision des couleurs normale.
la source
Voici un peu de code C qui devrait calculer correctement la luminance perçue.
la source
Veuillez définir la luminosité. Si vous cherchez à quel point la couleur est proche du blanc, vous pouvez utiliser Distance euclidienne de (255, 255, 255)
la source
Le «V» de HSV est probablement ce que vous recherchez. MATLAB a une fonction rgb2hsv et l'article de wikipedia cité précédemment est plein de pseudocode. Si une conversion RGB2HSV n'est pas possible, un modèle moins précis serait la version en niveaux de gris de l'image.
la source
Ce lien explique tout en détail, y compris pourquoi ces constantes multiplicatrices existent avant les valeurs R, G et B.
Edit: Il a une explication à l'une des réponses ici aussi (0,299 * R + 0,587 * G + 0,114 * B)
la source
Pour déterminer la luminosité d'une couleur avec R, je convertis la couleur du système RVB en couleur du système HSV.
Dans mon script, j'utilise le code système HEX avant pour une autre raison, mais vous pouvez également commencer avec le code système RVB avec
rgb2hsv {grDevices}
. La documentation est ici .Voici cette partie de mon code:
la source
Pour plus de clarté, les formules qui utilisent une racine carrée doivent être
sqrt(coefficient * (colour_value^2))
ne pas
sqrt((coefficient * colour_value))^2
La preuve en est la conversion d'une triade R = G = B en échelle de gris R. Cela ne sera vrai que si vous ajustez la valeur de la couleur, pas la valeur de la couleur multipliée par le coefficient. Voir neuf nuances de gris
la source