Algoritmo para comprobar la similitud de colores


Estoy buscando un algoritmo que compare dos colores RGB y genere un valor de su similitud (donde similitud significa "similar con respecto a la percepción humana promedio").

¿Alguna idea?

EDITAR :

Como ya no puedo responder, decidí poner mi "solución" como una edición a la pregunta.

Decidí ir con un (muy) pequeño subconjunto de color verdadero en mi aplicación, para que pueda manejar la comparación de colores por mi cuenta. Trabajo con unos 30 colores y usa distancias rígidas entre ellos.

Como era una aplicación para iPhone trabajé con objective-C y la implementación es más o menos una matriz que representa la tabla a continuación, que muestra las distancias entre los colores.

introduzca la descripción de la imagen aquí

Author: Peter O., 2011-03-22

6 answers

La distancia RGB en el espacio euclidiano no es muy "similar a la percepción humana avarage"

Puede usar YUV espacio de color, tiene en cuenta este factor:

introduzca la descripción de la imagen aquí

También puede utilizar el espacio de color CIE para este propósito.

EDITAR:

Mencionaré que el espacio de color YUV es una aproximación barata que se puede calcular a través de fórmulas simples. Pero no es perceptiblemente uniforme. Perceptualmente uniforme significa que un el cambio de la misma cantidad en un valor de color debe producir un cambio de aproximadamente la misma importancia visual. Si necesita una métrica más precisa y rigurosa, definitivamente debe considerar el espacio de color CIELAB u otro espacio perceptualmente uniforme (incluso si no hay fórmulas simples para la conversión).

 52
Author: Ghassen Hamrouni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-16 01:34:21

Recomendaría usar CIE94 (DeltaE-1994), se dice que es una representación decente de la percepción del color humano. Lo he usado bastante en mis aplicaciones relacionadas con la visión por ordenador, y estoy bastante contento con el resultado.

Sin embargo, es bastante caro computacional realizar una comparación de este tipo:

  1. RGB to XYZ para ambos colores
  2. XYZ to LAB para ambos colores
  3. Diff = DeltaE94(LABColor1,LABColor2)

Fórmulas (pseudocódigo):

 14
Author: JHolta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-08 14:19:42

La percepción humana es más débil en croma que en intensidad.

Por ejemplo, en video comercial, los espacios de color YCbCr/YPbPr (también llamados Y'UV) reducen la resolución de la información de croma pero preservan la luma (Y). En la compresión de vídeo digital como 4: 2:0 y 4:2: 2 reduce la tasa de bits de croma debido a la percepción relativamente más débil.

Creo que se puede calcular una función de distancia dando mayor prioridad sobre luma (Y) y menos prioridad sobre croma.

También, bajo de baja intensidad, la visión humana es prácticamente en blanco y negro. Por lo tanto, la función de prioridad es no lineal en que para baja luma (Y) se pone cada vez menos peso en croma.

Fórmulas más científicas: http://en.wikipedia.org/wiki/Color_difference

 11
Author: Stephen Chung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-22 14:15:08

Hay un excelente artículo sobre el tema de las distancias de color aquí: http://www.compuphase.com/cmetric.htm

En caso de que ese recurso desaparezca, la conclusión del autor es que la mejor aproximación de bajo costo a la distancia entre dos colores RGB se puede lograr usando esta fórmula (en código).

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
Author: strttn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-03 16:43:15

La percepción del color no es euclidiana. Cualquier fórmula de distancia será lo suficientemente buena y terrible al mismo tiempo. Cualquier medida basada en la distancia euclidiana (RGB, HSV, Luv, Lab,...) será lo suficientemente bueno para colores similares, mostrando que aqua está cerca del verde azulado. Pero para valores no cercanos llega a ser arbitrario. Por ejemplo, ¿el rojo está más cerca del verde o del azul?

De Charles Poynton Color FAQ :

Los sistemas XYZ y RGB están lejos de exhibiendo perceptual uniformidad. Encontrar una transformación de XYZ en un espacio razonablemente perceptualmente uniforme consumida una década o más en la CIE y al final ningún sistema podía queda acordado.

 3
Author: xan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-23 02:41:09

La similitud de color en el cubo RGB se mide por la distancia euclidiana (use la fórmula de pitágoras).

EDITAR: Pensándolo bien, esto también debería ser cierto para la mayoría de los otros espacios de color.

 -4
Author: Damon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-22 13:48:32