La formule pour déterminer la luminosité de la couleur de RVB
Je suis à la recherche d'une sorte de formule ou d'un algorithme pour déterminer la luminosité d'une couleur donnée, les valeurs RVB. Je sais qu'il ne peut pas être aussi simple que d'ajouter les valeurs RVB ensemble et avoir des sommes élevées être plus clair, mais je suis un peu à une perte quant à où commencer.
- La luminosité perçue est ce que je pense, je suis à la recherche, je vous remercie.
- Il y a un bon article (Manipulation des couleurs dans .NET - Partie 1) sur les espaces de couleurs et de conversations entre eux, y compris à la fois la théorie et le code (C#). Pour la réponse, regardez Conversion entre les modèles sujet dans l'article.
- J'ai été membre pendant beaucoup d'années, et je n'ai jamais fait cela avant. Puis-je suggérer que vous passez en revue les réponses et pense qu'il acceptera?
Vous devez vous connecter pour publier un commentaire.
Voulez-vous dire de la luminosité? La 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 )
(grâce à @MatthewHerbst) [3]0.299*(R^2)
(parce que l'exponentiation va devant la multiplication)Je pense que ce que vous cherchez est le RGB -> Luma formule de conversion.
Photométrique/numérique L'UIT BT.709:
Numérique L'UIT BT.601 (donne plus de poids à la R et B composants):
Si vous êtes prêt à l'exactitude des opérations commerciales de performance, il y a deux approximation des formules comme celle-ci:
Ces peut être calculée rapidement
Blue
+ 3*Vert)/6, 2e (3*Rouge +Blue
+ 4*Vert)>>3. accordé, à la fois rapide des approximations, Bleu 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 de CPU sur les BRAS) mais je pense que un bon compilateur va faire que l'optimisation pour vous.J'ai fait la comparaison des trois algorithmes dans la accepté de répondre. J'ai généré les couleurs dans le cycle où seulement environ tous les 400e de la couleur a été utilisée. Chaque couleur est représentée par 2x2 pixels, les couleurs sont classés du plus foncé au plus clair (de gauche à droite, de haut en bas).
1ère photo - La Luminance (relative)
2ème photo - http://www.w3.org/TR/AERT#color-contrast
3ème photo - HSP Modèle de Couleur
4ème photo - WCAG 2.0 SC 1.4.3 relative de la luminance et rapport de contraste formule (voir @Synchro de l' réponse)
Modèle peut parfois être repéré sur la 1ère et la 2ème photo en fonction du nombre de couleurs dans une rangée. Je n'ai jamais repéré de n'importe quel motif sur l'image de 3e ou 4e algorithme.
Si j'avais à choisir, j'irais avec l'algorithme de numéro 3 depuis son beaucoup plus facile à mettre en œuvre et de ses environ 33% plus rapide que la 4ème.
^2
etsqrt
inclus dans la troisième formule est un moyen plus rapide de l'approximation linéaire RVB de non-linéaires RGB au lieu de la^2.2
et^(1/2.2)
ce qui serait plus juste. L'aide non-linéaire des entrées au lieu de linéaire est extrêmement courante malheureusement.Ci-dessous est le seul algorithme CORRECT pour la conversion de sRGB images, tel qu'utilisé dans les navigateurs, etc., en niveaux de gris.
Il est nécessaire d'appliquer l'inverse de la fonction gamma pour l'espace de couleur avant de calculer le produit scalaire. Ensuite, vous appliquez la fonction gamma pour la réduction de la valeur. L'échec à intégrer la fonction gamma peut entraîner des erreurs jusqu'à 20%.
Pour ordinateur ordinaire des choses, l'espace de couleurs sRGB. Les bons chiffres pour sRGB sont env. 0.21, 0.72, de 0,07. Gamma pour sRGB est une fonction composite qui se rapproche de l'exponentiation par 1/(2.2). Voici le tout en C++.
gray
fonction effectue un gamma de compression par la suite, mais la luminance est lui-même le non compressé de la valeur de gris, donc si vous voulez calculer la luminosité, puis quitter l'appel àgam_sRGB
. Si vous voulez convertir les couleurs afin de les afficher en noir et blanc, alors vous devriez le laisser dans.Il est intéressant de noter, cette formulation pour le RVB=>HSV utilise simplement v=MAX3(r,g,b). En d'autres termes, vous pouvez utiliser le maximum de (r,g,b) comme le V dans le HSV.
J'ai vérifié et sur la page 575 de Hearn & Baker c'est la manière de calculer la "Valeur" ainsi.
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 est d'essayer de déterminer s'il faut mettre le blanc ou le noir du texte sur la couleur.
D'ajouter que tous les autres ont dit:
Toutes ces équations travail plutôt bien dans la pratique, mais si vous avez besoin d'être très précise, vous devez d'abord convertir les couleurs de l'espace colorimétrique linéaire (appliquer une image inverse-gamma), le poids moyen des couleurs primaires et - si vous souhaitez afficher les couleurs
prendre la luminance de retour dans le gamma du moniteur.
La différence de luminance entre ingnoring gamma et faire bonne gamma est jusqu'à 20% dans le noir gris.
Plutôt que de se perdre parmi la sélection aléatoire des formules mentionnées ici, je vous suggère d'aller pour la formule recommandée par les normes W3C.
Ici est une simple, mais exacte PHP de mise en œuvre de la WCAG 2.0 SC 1.4.3 relative de la luminance et rapport de contraste formules. Il produit des valeurs qui sont appropriés pour évaluer les rapports requis pour la conformité WCAG, comme sur cette page, et en tant que tel est approprié pour toute application web. C'est trivial de port à d'autres langues.
//Correct for sRGB
. Au moins, c'est presque la même opération que vous avez définiinv_gam_sRGB
. Donc, je pense que c'est correct.Le HSV palette devrait faire l'affaire, voir le article de wikipédia selon la langue que vous utilisez, vous pouvez obtenir une bibliothèque de conversion .
H est la teinte qui est une valeur numérique pour la couleur (c'est à dire le rouge, le vert...)
S est la saturation de la couleur, c'est à dire comment "intense" il est
V est la luminosité de la couleur.
RVB valeur de Luminance = 0.3 R + 0,59 G + 0.11 B
http://www.scantips.com/lumin.html
Je pense que l'espace de couleurs RVB avec perspicacité non-uniforme à l'égard de la L2 distance euclidienne.
Uniforme des espaces comprennent CIE LAB et LUV.
L'inverse-gamma formule par Jive dadson lili de grandpré a besoin d'avoir la demi-ajuster supprimé lors de la mise en œuvre en Javascript, c'est à dire le retour de la fonction gam_sRGB doit être de retour int(v*255); pas de retour de type int(v*255+.5); Demi-ajuster les tournées, et cela peut provoquer une valeur trop élevée sur un R=G=B c'est à dire de couleur gris triade. La conversion en niveaux de gris sur un R=G=B triade doit 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 demi-ajuster).
Voici un peu de code C qui doit calculer correctement perçue de luminance.
Je me demande comment ceux rvb coefficients ont été déterminés. J'ai fait l'expérience moi-même et j'ai fini avec les éléments suivants:
Proche, mais, mais évidemment différent de l'établi de longue date de l'UIT coefficients. Je me demande si ces coefficients peut être différent pour chaque observateur, parce que nous avons tous peuvent avoir un nombre différent de cônes et bâtonnets de la rétine de nos yeux, et surtout le rapport entre les différents types de cônes peuvent différer.
Pour référence:
DE L'UIT BT.709:
DE L'UIT BT.601:
J'ai fait le test en se déplaçant rapidement une petite barre grise sur un rouge vif, vert vif et bleu vif de fond, et en ajustant le gris jusqu'à ce qu'il confondait tout autant que possible. J'ai aussi répété que le test avec d'autres nuances. J'ai refait le test sur les différents écrans, même avec un fixe gamma facteur de 3.0, mais il semble tout à fait la même chose pour moi. De plus, l'UIT coefficients sont littéralement mal pour mes yeux.
Et oui, j'ai sans doute une vision de couleur normale.
Veuillez définir la luminosité. Si vous êtes à la recherche pour combien de proches et blanc à la couleur, vous pouvez utiliser La Distance Euclidienne de (255, 255, 255)
Le 'V' de HSV est probablement ce que vous cherchez. MATLAB est un rgb2hsv fonction et le déjà cité l'article de wikipédia est plein de pseudo-code. Si un RGB2HSV la conversion n'est pas possible, à moins précises modèle serait la version en niveaux de gris de l'image.
Ce lien explique tout en détail, notamment pourquoi ces multiplicateur des constantes existent avant le R, G et B les valeurs.
Edit: Il a une explication à l'une des réponses ici aussi (0.299*R + 0.587*G + 0.114*B)
Pour déterminer la luminosité d'une couleur avec R, - je convertir le système RVB de la couleur dans le HSV système de couleur.
Dans mon script, j'utilise le système HEX code avant pour d'autres raisons, mais vous pouvez commencer aussi avec le système RGB code avec
rgb2hsv {grDevices}
. La documentation est ici.Ici est cette partie de mon code:
Pour plus de clarté, les formules qui utilisent une racine carrée besoin d'être
sqrt(coefficient * (colour_value^2))
pas
sqrt((coefficient * colour_value))^2
La preuve de cela réside dans la conversion d'un R=G=B triade de niveaux de gris R. Qui n'est vrai que si tu place la valeur de couleur, pas la couleur de la valeur temps de coefficient. Voir Neuf Nuances de Gris
La "Accepté" la Réponse est Incorrecte et Incomplète
Les seules réponses exactes sont les @jive-dadson lili de grandpré et @EddingtonsMonkey des réponses, et de soutenir @nils-pipenbrinck. Les autres réponses (y compris les acceptée) sont des liens vers ou en citant des sources qui sont soit mauvais, non pertinentes, obsolètes ou cassé.
Brièvement:
Ce qui suit est correcte et complète réponse:
Parce que ce fil apparaît fortement dans les moteurs de recherche, je suis l'ajout de cette réponse à clarifier les différentes idées fausses sur le sujet.
Luminosité est un attribut perceptif, il ne dispose pas d'une mesure directe.
Luminosité perçue est mesurée par une certaine vision de modèles tels que CIELAB, ici L* (Lstar) est une mesure de de perception de la légèreté, et est non-linéaire à rapprocher de la vision humaine non-linéaire de la courbe de réponse.
Luminance est une mesure linéaire de la lumière, le spectre pondéré pour une vision normale, mais pas ajustés pour la non-perception linéaire de légèreté.
Luma (Y premier) est un gamma codé, pondérée du signal utilisé dans certains encodages vidéo. Il n'est pas à confondre avec la luminance linéaire.
Gamma ou de la courbe de transfert (TRC) est une courbe qui est souvent similaire à la perception de la courbe, et est généralement appliqué à des données d'image pour le stockage ou la diffusion de réduire le bruit perçu et/ou d'améliorer l'utilisation des données (et les raisons).
Pour déterminer la luminosité perçue, d'abord convertir gamma codée en RGB de l'image des valeurs de luminance linéaire (
L
ouY
) et puis pour les non-linéaire de la luminosité perçue (L*
)POUR TROUVER LUMINANCE:
...Parce que, apparemment, il était perdu quelque part...
Première Étape:
Convertir tous les sRGB 8 bits entier des valeurs à virgule 0.0-1.0
Étape Deux:
Convertir un gamma codée en RGB pour un linéaire de la valeur. en sRGB (standard informatique), par exemple, nécessite une courbe de puissance d'environ V^2.2, bien que les "précise" de la transformation est:
Où V est la gamma-codé R, G ou B canal du sRGB.
Pseudo:
Étape Trois:
Pour trouver la Luminance (Y) l'application de la norme coefficients pour sRGB:
Pseudo-code ci-dessus en utilisant les fonctions:
POUR TROUVER LUMINOSITÉ PERÇUE:
Étape Quatre:
Prendre de luminance Y à partir de ci-dessus, et de se transformer en L*
Pseudo:
L* est une valeur de 0 (noir) à 100 (blanc) où 50 est la perception "gris moyen". L* = 50 est équivalent à Y = 18.4, ou, en d'autres mots, un de 18% de la carte grise, soit au moyen d'une photographie de l'exposition (Ansel Adams (zone V).
Références:
IEC 61966-2-1:1999 Standard
Wikipedia sRGB
Wikipedia CIELAB
Wikipedia CIEXYZ
Charles de Poynton Gamma FAQ