Je veux concevoir un programme qui puisse m'aider à évaluer entre 5 couleurs prédéfinies laquelle est la plus similaire à une couleur variable, et avec quel pourcentage. Le fait est que je ne sais pas comment faire cela manuellement étape par étape. Il est donc encore plus difficile de penser à un programme.
Plus de détails: Les couleurs sont issues de photographies de tubes avec gel qui ont des couleurs différentes. J'ai 5 tubes de couleurs différentes, chacun représentant 1 des 5 niveaux. Je veux prendre des photos d'autres échantillons et évaluer sur l'ordinateur à quel niveau appartient cet échantillon en comparant les couleurs, et je veux savoir cela avec un pourcentage d'approximation également. Je voudrais un programme qui fait quelque chose comme ceci: http://www.colortools.net/color_matcher.html
Si vous pouvez me dire quelles mesures prendre, même si ce sont des choses que je dois penser et faire manuellement. Ce serait très utile.
Réponses:
Voir l'article de Wikipedia sur la différence de couleur pour les bonnes pistes. Fondamentalement, vous souhaitez calculer une métrique de distance dans un espace colorimétrique multidimensionnel. Mais RVB n'est pas "perceptuellement uniforme", donc votre mesure 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 destiné à être un espace colorimétrique perceptuellement uniforme, et la métrique deltaE est couramment utilisée. Mais il existe des espaces de couleurs plus raffinés et des formules deltaE plus raffinées qui se rapprochent de la perception humaine.
Vous devrez en savoir plus sur les espaces couleurs et les illuminants pour effectuer les conversions. Mais pour une formule rapide qui est meilleure que la métrique RVB euclidienne, faites simplement ceci: supposez que vos valeurs RVB sont dans l'espace colorimétrique sRGB, trouvez les formules de conversion sRGB en L a b *, convertissez vos couleurs sRGB en L a b *, et calculez deltaE entre vos deux valeurs L a b *. Ce n'est pas cher en calcul, ce ne sont que des formules non linéaires et des multiplications et des ajouts.
la source
color
gem qui implémente deltaE parmi d'autres opérations de couleur.Juste une idée qui m'est venue à l'esprit (désolé si stupide). Trois composants de couleurs peuvent être considérés comme des coordonnées 3D de points, puis vous pouvez calculer la distance entre les points.
FE
La distance entre les couleurs est
Le pourcentage est
la source
en fait, j'ai emprunté le même chemin il y a quelques mois. il n'y a pas de réponse parfaite à la question (qui a été posée ici quelques fois) mais il y en a une plus sophistiquée que la réponse sqrt (rr) etc et plus facile à implémenter directement avec RVB sans passer à toutes sortes d'espaces colorimétriques alternatifs. J'ai trouvé cette formule ici qui est une approximation peu coûteuse de la formule réelle assez compliquée (par le CIE qui est le W3C de la couleur, puisque ce n'est pas une quête terminée, vous pouvez y trouver des équations de différence de couleur plus anciennes et plus simples). bonne chance
Edit: Pour la postérité, voici le code C pertinent:
la source
Une valeur de couleur a plus d'une dimension, il n'y a donc aucun 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.
Il est fort probable que vous souhaitiez comparer les propriétés de teinte, de saturation et / ou de luminosité des couleurs par opposition aux composants rouge / vert / bleu. Si vous avez du mal à comprendre comment vous voulez les comparer, prenez quelques paires d'échantillons de couleurs et comparez-les mentalement, puis essayez de vous justifier / vous expliquer pourquoi elles sont similaires / différentes.
Une fois que vous savez quelles propriétés / composants des couleurs vous souhaitez comparer, vous devez déterminer comment extraire ces informations d'une couleur.
Très probablement, vous aurez juste besoin de convertir la couleur de la représentation commune RedGreenBlue en HueSaturationLightness, puis calculer quelque chose comme
Cet exemple vous donnerait une valeur scalaire simple indiquant la distance entre le dégradé / la teinte des couleurs.
Voir HSL et HSV sur Wikipedia .
la source
Si vous avez deux
Color
objetsc1
etc2
, vous pouvez simplement comparer chaque valeur RVB dec1
avec celle dec2
.Ces valeurs, vous pouvez simplement diviser par la quantité de saturations de différence (255), et vous obtiendrez la différence entre les deux.
Après quoi, vous pouvez simplement trouver la différence de couleur moyenne en pourcentage.
Ce qui vous donnerait une différence de pourcentage entre
c1
etc2
.la source
pctDiffRed = diffRed / 255;
va vous donner 0 à moins que vous ne lanciez quelque part sur un flotteur. <b> 2 </b> Vous devrez multiplier par 100 quelque part pour obtenir un pourcentage.L'une des meilleures méthodes pour comparer deux couleurs par perception humaine est la CIE76. La différence s'appelle Delta-E. Lorsqu'il est inférieur à 1, l'œil humain ne peut pas reconnaître la différence.
Il existe une merveilleuse classe d'utilitaires de couleur ColorUtils (code ci-dessous), qui comprend des méthodes de comparaison CIE76. Il est écrit par Daniel Strebel, Université de Zurich.
De ColorUtils.class, j'utilise la méthode:
r1, g1, b1 - valeurs RVB de la première couleur
r2, g2, b2 - valeurs RVB de la deuxième couleur que vous souhaitez comparer
Si vous travaillez avec Android, vous pouvez obtenir ces valeurs comme ceci:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class par Daniel Strebel, Université de Zurich:
la source
Juste une autre réponse, bien que similaire à celle de Supr - juste un espace colorimétrique différent.
Le fait est que les humains ne perçoivent pas la différence de couleur de manière uniforme et l'espace colorimétrique RVB l'ignore. En conséquence, si vous utilisez l'espace colorimétrique RVB et que vous calculez simplement la distance euclidienne entre 2 couleurs, vous pouvez obtenir une différence qui est mathématiquement absolument correcte, mais qui ne coïnciderait pas avec ce que les humains vous diraient.
Ce n'est peut-être pas un problème - la différence n'est pas si grande que je pense, mais si vous voulez résoudre ce «mieux», vous devez convertir vos couleurs RVB en un espace colorimétrique spécialement conçu pour éviter le problème ci-dessus. Il y en a plusieurs, des améliorations par rapport aux modèles précédents (puisque cela est basé sur la perception humaine, nous devons mesurer les valeurs "correctes" basées sur des données expérimentales). Il y a l' espace colorimétrique Lab qui, à mon avis, serait le meilleur, bien qu'un peu compliqué à convertir. Plus simple serait le CIE XYZ .
Voici un site qui répertorie les formules à convertir entre différents espaces colorimétriques afin que vous puissiez expérimenter un peu.
la source
Toutes les méthodes ci-dessous donnent une échelle de 0 à 100.
la source
Le meilleur moyen est deltaE. DeltaE est un nombre qui montre la différence des couleurs. Si deltae <1, la différence ne peut pas être reconnue par les yeux humains. J'ai écrit un code en canvas et js pour convertir rgb en lab, puis calculer delta e. Sur cet exemple, le code reconnaît des pixels qui ont une couleur différente avec une couleur de base que j'ai enregistrée en tant que LAB1. et puis si c'est différent rend ces pixels rouges. Vous pouvez augmenter ou réduire la sensibilité de la différence de couleur par incréments ou diminuer la plage acceptable de delta e. Dans cet exemple, j'ai attribué 10 pour deltaE dans la ligne que j'ai écrite (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
la source
1/3
et les16/116
deux évaluent0
, ce qui n'est certainement pas ce que vous voulez. Votre algorithme est probablement correct, mais votre code ne l'est certainement pas.Une méthode simple qui n'utilise que RVB est
J'utilise celui-ci depuis un moment maintenant, et il fonctionne assez bien pour la plupart des cas.
la source
1/3
Je l'ai utilisé dans mon Android et cela semble satisfaisant bien que l'espace RVB ne soit pas recommandé:
Ensuite, j'ai utilisé ce qui suit pour obtenir un pourcentage de similitude:
Cela fonctionne assez bien.
la source
J'ai essayé diverses méthodes comme l'espace colorimétrique LAB, les comparaisons HSV et j'ai trouvé que la luminosité fonctionne plutôt bien à cette fin.
Voici la version Python
Te donnera
la source
ImageColor
? modifier j'ai trouvé, c'estfrom PIL import ImageColor
Je suppose que vous voulez analyser une image entière à la fin, n'est-ce pas? Vous pouvez donc vérifier la différence la plus petite / la plus élevée par rapport à la matrice de couleur d'identité.
La plupart des opérations mathématiques de traitement des graphiques utilisent des matrices, car les algorithmes possibles les utilisant sont souvent plus rapides que les calculs classiques de distance et de comparisme point par point. (par exemple pour les opérations utilisant DirectX, OpenGL, ...)
Je pense donc que vous devriez commencer ici:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... et comme Beska l'a déjà commenté ci-dessus:
Ce qui signifie également que votre algorithme dépend de votre définition de "similaire à" si vous traitez des images.
la source
Version Kotlin avec combien de pour cent voulez-vous correspondre.
Appel de méthode avec argument optionnel pour cent
Corps de la méthode
la source
Vous devrez convertir toutes les couleurs RVB dans l'espace colorimétrique Lab pour pouvoir les comparer de la manière dont les humains les voient. Sinon, vous obtiendrez des couleurs RVB qui «correspondent» de manière très étrange.
Le lien wikipedia sur les différences de couleur vous donne une introduction aux différents algorithmes de différence d'espace colorimétrique Lab qui ont été définis au fil des ans. Le plus simple qui vérifie simplement la distance euclidienne de deux couleurs de laboratoire, fonctionne mais présente quelques défauts.
Il existe une implémentation Java de l'algorithme CIEDE2000 plus sophistiqué dans le projet OpenIMAJ . Fournissez-lui vos deux ensembles de couleurs Lab et cela vous donnera une valeur de distance unique.
la source
La seule «bonne» façon de comparer les couleurs est de le faire avec deltaE dans CIELab ou CIELuv.
Mais pour beaucoup d'applications, je pense que c'est une assez bonne approximation:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Je pense qu'une distance de Manhattan pondérée a beaucoup plus de sens lorsque l'on compare les couleurs. N'oubliez pas que les couleurs primaires ne sont que dans notre tête. Ils n'ont aucune signification physique. CIELab et CIELuv sont modélisés statistiquement à partir de notre perception de la couleur.
la source
Pour rapide et sale, vous pouvez faire
en utilisant la division entière pour quantifier les couleurs.
la source
Réponse Swift 5
J'ai trouvé ce fil parce que j'avais besoin d'une version Swift de cette question. Comme personne n'a répondu avec la solution, voici la mienne:
Usage:
J'ai défini une différence de moins de 10% pour renvoyer des couleurs similaires, mais vous pouvez le personnaliser vous-même.
la source
Android pour l'API ColorUtils RGBToHSL: j'avais deux couleurs argb int (color1, color2) et je voulais obtenir la distance / différence entre les deux couleurs. Voici ce que j'ai fait;
Ensuite, j'ai utilisé le code ci-dessous pour trouver la distance entre les deux couleurs.
la source