web-dev-qa-db-fra.com

Algorithme pour vérifier la similitude des couleurs

Je recherche un algorithme qui compare deux couleurs RVB et génère une valeur de leur similitude (où similitude 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" comme une modification à la question.

J'ai décidé d'utiliser un (très) petit sous-ensemble de couleurs vraies dans mon application, afin de pouvoir gérer la comparaison des couleurs par moi-même. Je travaille avec environ 30 couleurs et j'utilise des distances codées en dur entre elles.

Comme c'était une application iPhone, j'ai travaillé avec objective-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

75
Kai Huppmann

La distance RVB dans l'espace euclidien n'est pas très "similaire à la perception humaine moyenne"

Vous pouvez utiliser YUV espace colorimétrique, il prend en compte ce facteur:

enter image description here

Vous pouvez également utiliser l'espace colorimétrique CIE à cet effet.

MODIFIER:

Je mentionnerai que l'espace colorimétrique YUV est une approximation peu coûteuse qui peut être calculée via des formules simples. Mais ce n'est pas perceptuellement uniforme. Uniformité perceptuelle signifie qu'un changement de la même quantité dans une valeur de couleur devrait 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 absolument considérer l'espace colorimétrique CIELAB ou un autre espace perceptuellement uniforme (même s'il n'y a pas de formules simples pour la conversion).

54
Ghassen Hamrouni

Je recommanderais d'utiliser CIE94 (DeltaE-1994), on dit que c'est une représentation décente de la perception des couleurs humaines. Je l'ai beaucoup utilisé dans mes applications liées à la vision par ordinateur, et je suis plutôt satisfait du résultat.

Il est cependant assez coûteux en calcul 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 (pseudocode):

16
JHolta

La perception humaine est plus faible en chrominance qu'en intensité.

Par exemple, dans la vidéo commerciale, les espaces colorimétriques YCbCr/YPbPr (également appelés Y'UV) réduisent la résolution des informations de chrominance mais préservent la luma (Y). Dans la compression vidéo numérique telle que 4: 2: 0 et 4: 2: 2 réduit le débit binaire de chrominance en raison d'une perception relativement plus faible.

Je crois que vous pouvez calculer une fonction de distance donnant une priorité plus élevée à la luma (Y) et moins prioritaire à la chrominance.

De plus, sous une faible intensité, la vision humaine est pratiquement en noir et blanc. Par conséquent, la fonction de priorité est non linéaire en ce que pour une faible luma (Y), vous accordez de moins en moins de poids à la chrominance.

Formules plus scientifiques: http://en.wikipedia.org/wiki/Color_difference

12
Stephen Chung

Il y a une excellente écriture 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 (dans le 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));
}
8
strttn

La perception des couleurs n'est pas euclidienne. Toute formule de distance sera à la fois assez bonne et terrible. Toute mesure basée sur la distance euclidienne (RGB, HSV, Luv, Lab, ...) sera assez bonne pour des couleurs similaires, montrant l'aqua proche de la sarcelle. Mais pour les valeurs non proches, cela devient arbitraire. Par exemple, le rouge est-il plus proche du vert ou du bleu?

D'après Charles Poynton FAQ couleur :

Les systèmes XYZ et RGB sont loin de présenter une uniformité de perception. Trouver une transformation de XYZ en un espace raisonnablement perceptuellement uniforme a consommé une décennie ou plus à la CIE et à la fin aucun système unique n'a pu être convenu.

3
xan