Algorithme pour vérifier la similarité des couleurs
je cherche un algorithme qui compare deux couleurs RVB et génère une valeur de leur similarité (où la similarité signifie"similaire par rapport à la perception humaine moyenne").
des idées?
MODIFIER :
comme je ne peux plus répondre, j'ai décidé de mettre ma "solution" en édition à la question.
j'ai décidé d'aller avec un (très) petit sous-ensemble de la vraie couleur dans mon app, de sorte que je peux gérer la comparaison des couleurs par ma propre. Je travaille avec environ 30 couleurs et utilise des distances codées en dur entre eux.
Puisqu'il s'agissait d'une application iPhone j'ai travaillé avec objectif-C et l'implémentation est plus ou moins une matrice représentant le tableau ci-dessous, qui montre les distances entre les couleurs.
6 réponses
RGB distance dans l'espace euclidien n'est pas très "semblable à avarage la perception de l'homme"
vous pouvez utiliser YUV l'espace de couleur, il prend en compte ce facteur:
vous pouvez également utiliser l'espace de couleur CIE à cette fin.
EDIT:
je mentionnerai que YUV l'espace de couleur est une approximation peu coûteuse qui peut être calculée via des formules simples. Mais il n'est pas perceptuellement uniforme. Perceptuellement uniforme signifie qu'un changement de la même quantité dans une couleur de la valeur doit produire un changement d'environ la même importance visuelle. Si vous avez besoin d'une métrique plus précise et rigoureuse, vous devez certainement considérer L'espace de couleur CIELAB ou un autre espace de perception uniforme (même s'il n'y a pas de formules simples pour la conversion).
je recommande d'utiliser CIE94 (DeltaE-1994), il est dit d'être une représentation décente de la perception de la couleur humaine. Je l'ai utilisé assez souvent dans Mes applications liées à la vision par ordinateur, et je suis plutôt satisfait du résultat.
Il est cependant plutôt de calcul coûteux d'effectuer une telle comparaison:
-
RGB to XYZ
pour les deux couleurs -
XYZ to LAB
pour les deux couleurs -
Diff = DeltaE94(LABColor1,LABColor2)
formules (pseudo-code):
- formules de conversion des couleurs: http://www.easyrgb.com/?X=MATH
- formules Delta-E: http://www.easyrgb.com/index.php?X=DELT
la perception humaine est plus faible en chroma que l'intensité.
par exemple, dans la vidéo commerciale, les espaces de couleurs YCbCr/YPbPr (aussi appelé Y'UV) réduisent la résolution de l'info chroma mais préservent le luma (Y). Dans la compression vidéo numérique telle que 4: 2:0 et 4:2: 2 réduit le débit chromatique en raison de la perception relativement plus faible.
je crois que vous pouvez calculer une fonction de distance donnant une priorité plus élevée que luma (Y) et moins de priorité plus de chroma.
de plus, sous faible intensité, la vision humaine est pratiquement en noir et blanc. Par conséquent, la fonction de priorité est non linéaire dans ce que pour faible luma (Y) vous mettez de moins en moins de poids sur chroma.
autres formules scientifiques: http://en.wikipedia.org/wiki/Color_difference
il y a un excellent article sur le sujet des distances de couleur ici: http://www.compuphase.com/cmetric.htm
dans le cas où cette ressource disparaît, la conclusion de l'auteur est que la meilleure approximation à faible coût de la distance entre deux couleurs RVB peut être obtenue en utilisant cette formule (en code).
typedef struct {
unsigned char r, g, b;
} RGB;
double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
la perception des couleurs n'est pas euclidienne. N'importe quelle formule de distance sera à la fois bonne et terrible en même temps. Toute mesure basée sur la distance euclidienne (RGB, HSV, Luv, Lab, ...) sera assez bon pour des couleurs similaires, montrant aqua étant proche de teal. Mais pour les valeurs non proches, cela devient arbitraire. Par exemple, le rouge est-il plus proche du vert ou du bleu?
De Charles de Poynton "151930920 de Couleur" FAQ :
le Les systèmes XYZ et RGB sont loin présentant uniformité perceptuelle. Trouver une transformation de XYZ En raisonnablement perceptuellement uniforme de l'espace consommé une décennie ou plus à la CIE et au bout du compte, aucun système ne pouvait être d'accord.
la similitude de couleur dans le cube RGB est mesurée par la distance euclidienne (utiliser la formule de Pythagore).
EDIT: en y repensant, cela devrait être vrai aussi pour la plupart des autres espaces de couleur.