205 votes

Comment comparer deux couleurs pour leur similarité/différence

Je veux concevoir un programme qui peut m'aider à évaluer entre 5 couleurs prédéfinies laquelle est la plus similaire à une couleur variable, et avec quel pourcentage. Le problème est que je ne sais pas comment faire cela manuellement étape par étape. Donc c'est encore plus difficile de penser à un programme.

Plus de détails : Les couleurs proviennent de photographies de tubes avec du gel de différentes couleurs. J'ai 5 tubes avec des couleurs différentes, chacun représentant l'un des 5 niveaux. Je veux prendre des photos d'autres échantillons et sur l'ordinateur évaluer à quel niveau cet échantillon appartient en comparant les couleurs, et je veux aussi le savoir avec un pourcentage d'approximation. J'aimerais un programme qui fait quelque chose comme ceci : http://www.colortools.net/color_matcher.html

Si vous pouvez me dire quelles étapes suivre, même si ce sont des choses que je dois réfléchir et faire manuellement. Cela serait très utile.

1 votes

J'ai apporté une modification mineure au texte, en changeant un mot en portugais par ce que je pense être l'équivalent anglais correct... Changez-le si je me suis trompé.

14 votes

Il existe un article sur la différence de couleur sur Wikipédia : fr.wikipedia.org/wiki/Différence_de_couleur

5 votes

Cela devrait être intéressant : stevehanov.ca/blog/index.php?id=116 Il explore le calcul de la différence dans trois modèles de couleur différents.

154voto

Liudvikas Bukys Points 3578

Consultez l'article de Wikipedia sur Différence de couleur pour les bons conseils. Fondamentalement, vous voulez calculer une métrique de distance dans un espace couleur multidimensionnel.

Mais le RVB n'est pas "perceptuellement uniforme", donc votre métrique de distance RVB euclidienne suggérée par Vadim ne correspondra pas à la distance perçue par l'homme entre les couleurs. Pour commencer, L*a*b* est censé être un espace couleur perceptuellement uniforme, et la métrique deltaE est couramment utilisée. Mais il existe des espaces de couleurs plus affinés et des formules deltaE plus affinées qui se rapprochent davantage de la perception humaine.

Vous devrez en apprendre davantage sur les espaces colorimétriques et les illuminants pour effectuer les conversions. Mais pour une formule rapide qui est meilleure que la métrique de distance euclidienne RVB, faites simplement ceci:

  • Supposez que vos valeurs RVB sont dans l'espace couleur sRVB
  • Trouvez les formules de conversion de sRVB à L*a*b*
  • Convertissez vos couleurs sRVB en L*a*b*
  • Calculez la deltaE entre vos deux valeurs L*a*b*

Ce n'est pas coûteux en termes de calcul, ce sont juste quelques formules non linéaires et quelques multiplications et additions.

13 votes

+1 pour "deltaE", c'est la méthode de comparaison la plus standardisée et il existe des adaptations de la formule deltaE pour différents cas d'utilisation.

9 votes

Vous pouvez trouver les formules de conversion ici : brucelindbloom.com/index.html?Equations.html

4 votes

Ou, si vous travaillez en Ruby, consultez le color gem qui implémente deltaE parmi d'autres opérations de couleur.

55voto

Vadim Gulyakin Points 663

Juste une idée qui m'est venue à l'esprit (désolé si c'est stupide). Trois composants de couleurs peuvent être considérés comme des coordonnées 3D de points et ensuite vous pourriez calculer la distance entre les points.

Par exemple.

Le Point1 a les valeurs R1 G1 B1
Le Point2 a les valeurs R2 G2 B2

La distance entre les couleurs est

d=sqrt((r2-r1)^2+(g2-g1)^2+(b2-b1)^2)

Le pourcentage est

p=d/sqrt((255)^2+(255)^2+(255)^2)

36 votes

Si nous utilisons l'espace de couleur RGB, la différence entre 2 couleurs n'est pas la même que celle que les humains perçoivent cependant. Mais oui, l'idée de base est la même partout - il suffirait juste de la mapper dans un autre espace colorimétrique (je penserais à Lab).

6 votes

@Voo : Je suis d'accord, HSV/HSL/LAB seraient des espaces de couleurs beaucoup meilleurs que (s)RGB pour la correspondance de similitude basée sur la distance.

5 votes

C'est une bonne façon de vous dire à quel point deux couleurs SONT différentes, mais cela ne dit pas grand-chose sur la façon dont elles seront PERÇUES. Les yeux humains sont loin d'être parfaits : nous sommes plus sensibles au vert qu'au rouge ou au bleu, notre perception de la luminosité est logarithmique, etc. L'OP n'a jamais précisé ce qu'il voulait; mais voir ici pour un algorithme spécialement conçu pour la vue humaine.

24voto

Supr Points 4738

Une valeur de couleur a plus d'une dimension, il n'existe donc pas de moyen intrinsèque de comparer deux couleurs. Vous devez déterminer pour votre cas d'utilisation la signification des couleurs et ainsi la meilleure façon de les comparer.

Vous voudrez probablement comparer les propriétés de teinte, de saturation et/ou de luminosité des couleurs plutôt que les composantes rouge/vert/bleu. Si vous avez du mal à déterminer comment vous voulez les comparer, prenez quelques paires de couleurs d'échantillon et comparez-les mentalement, puis essayez de justifier/exppliquer pourquoi elles sont similaires/différentes.

Une fois que vous savez quelles propriétés/composantes des couleurs vous voulez comparer, vous devez alors déterminer comment extraire ces informations d'une couleur.

Vous devrez probablement convertir la couleur de la représentation RedGreenBlue commune en TeinteSaturationLuminosité, puis calculer quelque chose comme

avghue = (color1.hue + color2.hue)/2
distance = abs(color1.hue-avghue)

Cet exemple vous donnerait une valeur scalaire simple indiquant à quelle distance la couleur de gradient/teinte est des unes des autres.

Voir TSL et TSV sur Wikipedia.

2 votes

De ce que je me souviens de mes cours sur ces sujets, je convertirais l'image dans l'espace colorimétrique Lab et non HSV/HSL. Y a-t-il une raison particulière pour choisir celui-ci?

0 votes

Non. RGB et HSL sont ceux avec lesquels je suis le plus familier, donc j'ai choisi HSL juste pour souligner l'idée que le RVB "par défaut" n'est pas la seule option - cela dépend vraiment de l'application. Merci de m'avoir informé de l'espace colorimétrique Lab.

1 votes

J'ai quand même ajouté +1 parce que le principe de base ici est la "bonne" réponse (convertir dans un espace couleur qui gère uniformément la différence perçue puis faire la comparaison). Je ne suis pas très sûr de l'espace qui serait le meilleur - tous ces espaces couleur différents sont confus à mon avis ;)

24voto

kba Points 10874

Si vous avez deux objets Color c1 et c2, vous pouvez simplement comparer chaque valeur RGB de c1 avec celle de c2.

int diffRed   = Math.abs(c1.getRed()   - c2.getRed());
int diffGreen = Math.abs(c1.getGreen() - c2.getGreen());
int diffBlue  = Math.abs(c1.getBlue()  - c2.getBlue());

Ces valeurs peuvent simplement être divisées par la quantité de saturations de différence (255), et vous obtiendrez la différence entre les deux.

float pctDiffRed   = (float)diffRed   / 255;
float pctDiffGreen = (float)diffGreen / 255;
float pctDiffBlue   = (float)diffBlue  / 255;

Ensuite, vous pouvez simplement trouver la moyenne de la différence de couleur en pourcentage.

(pctDiffRed + pctDiffGreen + pctDiffBlue) / 3 * 100

Cela vous donnerait une différence en pourcentage entre c1 et c2.

1 votes

2 autres petites choses: 1 pctDiffRed = diffRed / 255; vous donnera 0 à moins que vous ne le convertissiez en float quelque part. 2 Vous devrez multiplier par 100 quelque part pour obtenir un pourcentage.

19 votes

Cela peut ne pas donner la meilleure "différence" visible, car l'œil humain perçoit les changements de couleur différemment. Cela étant dit, je suppose que c'est exactement ce qu'elle recherche, car elle cherche probablement une différence tout aussi mesurable plutôt qu'une différence perçue. Je voulais juste le mentionner ici comme quelque chose à prendre en considération au cas où cela serait pertinent.

10voto

Voo Points 11981

Juste une autre réponse, bien que similaire à celle de Supr - juste un espace colorimétrique différent.

Le problème est le suivant : les humains perçoivent la différence de couleur de manière non uniforme et l'espace colorimétrique RGB ignore cela. En conséquence, si vous utilisez l'espace colorimétrique RGB et que vous calculez simplement la distance euclidienne entre 2 couleurs, vous pouvez obtenir une différence qui est mathématiquement tout à fait correcte, mais qui ne correspondrait pas à ce que les humains vous diraient.

Cela peut ne pas être un problème - la différence n'est pas si grande je pense, mais si vous voulez résoudre cela "mieux", vous devriez convertir vos couleurs RGB dans un espace colorimétrique qui a été spécifiquement conçu pour éviter le problème ci-dessus. Il en existe plusieurs, des améliorations par rapport aux modèles antérieurs (puisque cela est basé sur la perception humaine, nous devons mesurer les valeurs "correctes" en fonction des données expérimentales). Il y a l'espace colorimétrique Lab qui, je pense, serait le meilleur bien que cela soit un peu compliqué à convertir. Plus simple serait le CIE XYZ.

Voici un site qui répertorie les formules pour convertir entre différents espaces colorimétriques pour que vous puissiez expérimenter un peu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X