Algoritmo para comprobar la similitud de colores.

82

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

¿Algunas ideas?

EDITAR :

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

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

Como era una aplicación para iPhone trabajé con objetivo-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.

ingrese la descripción de la imagen aquí

Kai Huppmann
fuente
¿Comparar los valores R, G y B no es suficiente?
BlackBear
@Kai: estoy tratando de implementar lo mismo. ¿Seguiste el enfoque YUV o elegiste otro tipo de espacio de color y distancia espacial?
Thariama
3
@Thariama Decidí ir con un subconjunto (muy) pequeño de color verdadero en mi aplicación, para poder manejar la comparación de colores por mi cuenta. Trabajo con unos 50 colores y uso distancias codificadas entre ellos. Sin embargo, de todo lo que leí y probé y probé al usar 2 ^ 24 colores, YUV hizo el mejor trabajo.
Kai Huppmann
@Kai: muchas gracias por informarme sobre su decisión y sus razones. eso significa que está usando RGB y crea un histograma usando 50 colores y acelera su algoritmo usando distancias predefinidas, ¿correcto? ¿Qué lenguaje usaste para implementar tu algoritmo?
Thariama
@Thariama Ponlo como una edición en la pregunta original.
Kai Huppmann

Respuestas:

57

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

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

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

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 económica que se puede calcular mediante fórmulas simples. Pero no es perceptualmente uniforme. Perceptualmente uniforme significa que un cambio de la misma cantidad en un valor de color debería 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).

Ghassen Hamrouni
fuente
3
¡Gracias! Entonces, ¿puedo ir con la distancia espacial euclidiana de los valores Y'UV?
Kai Huppmann
Claro, pero también podrías usar otras distancias.
Ghassen Hamrouni
2
Lo más probable es que desee calcular la distancia euclidiana entre los componentes UV solo porque Y 'es el componente de luminancia.
Ross
17
¿Alguien puede citar una fuente para la afirmación de que la distancia euclidiana en YUV refleja la percepción humana de las diferencias?
Proyecto de ley
4
@ Bill no lo hace. consulte la sección "resultados" aquí: compuphase.com/cmetric.htm
kritzikratzi
23

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

Sin embargo, es bastante costoso computacionalmente 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):

JHolta
fuente
Preferí este método debido al uso del espacio de color CIELAB, gracias.
Sergey Voronezhskiy
¿XYZ a LAB como en "Hunter-Lab"?
Zuks
1
No importa ... Puedo ver que Delta E 1994 usa valores CIE-L * ab
Zuks
14

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 luminancia (Y). En la compresión de video digital, como 4: 2: 0 y 4: 2: 2, se reduce la tasa de bits de croma debido a una percepción relativamente más débil.

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

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

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

Stephen Chung
fuente
14

Hay un excelente escrito 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 C ).

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));
}
strttn
fuente
3

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 buena para colores similares, mostrando que el agua 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 las preguntas frecuentes sobre el color de Charles Poynton :

Los sistemas XYZ y RGB están lejos de exhibir uniformidad de percepción. Encontrar una transformación de XYZ en un espacio de percepción razonablemente uniforme consumió una década o más en el CIE y, al final, no se pudo acordar un sistema único.

xan
fuente
Gracias. Y es un vínculo genial e interesante. Para mi propósito, no es tan importante saber si el rojo está más cerca del verde o del azul, sino que un gris claro está más cerca del blanco que un rojo claro y espero (pero no estoy seguro todavía) que YUV lo haga.
Kai Huppmann
-5

La similitud de color en el cubo RGB se mide mediante 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.

Damon
fuente
6
No, la distancia euclidiana en el espacio RGB no se corresponde con la forma en que el ojo humano percibe las diferencias entre colores. Esta es la razón por la que se crearon espacios de color como Lab.
Proyecto de ley
No. La distancia euclidiana es una forma de medir la distancia en cualquier espacio cartesiano. ¡Mide la distancia, no la similitud! ahora puede elegir un espacio vectorial diferente (como cie o yuv) donde coinciden la distancia euclidiana y el tipo de similitud, o puede usar una medida diferente. pero rgb + euclidiana no dan resultados satisfactorios.
kritzikratzi
También pensé esto, pero luego abro un programa de dibujo con un número limitado de colores (adobe flash, por ejemplo, con 216 paleta predeterminada predeterminada), y pongo esa fórmula a prueba y te decepcionas muy, muy rápidamente, obteniendo amarillos cuando claramente necesita marrón, etc.
Dmitry