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.

enter image description here

71
demandé sur Peter O. 2011-03-22 16:31:02

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:

enter image description here

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).

52
répondu Ghassen Hamrouni 2015-08-16 01:34:21

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:

  1. RGB to XYZ pour les deux couleurs
  2. XYZ to LAB pour les deux couleurs
  3. Diff = DeltaE94(LABColor1,LABColor2)

formules (pseudo-code):

14
répondu JHolta 2014-09-08 14:19:42

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

11
répondu Stephen Chung 2011-03-22 14:15:08

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));
}
4
répondu strttn 2016-12-03 16:43:15

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.

3
répondu xan 2011-03-23 02:41:09

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.

-4
répondu Damon 2011-03-22 13:48:32