2009-11-12 14 views
16

Tengo un color (RGB) que se lee desde un sensor. También tengo una lista de colores "conocidos", cada uno emparejado con un nombre de cadena.¿Cuál es el mejor algoritmo para encontrar el color más cercano en una matriz a otro color?

¿Cuál sería la mejor manera (es decir, comportarse como un ser humano eligiendo colores) para sacar el nombre del color más cercano de esta lista?

He intentado una distancia cartesiana más corta con RGB, pero eso hace que el gris se vuelva más verde que negro o blanco.

+1

Creo que esto puede ayudar (problema muy similar): http://stackoverflow.com/questions/1678457/best-algorithm-for-matching-colours/1678498#1678498 – Rooke

Respuesta

19

En lugar de utilizar RGB, intente utilizar un modelo de color HSL (Hue, Saturation, Lightness) or HSV (Hue, Saturation and Value). Luego experimente con diferentes elementos de sesgo, p. el tono es más importante que la luminancia cuando se calcula la distancia.

+0

@ AlbertRenshaw: No estoy seguro de qué información que su comentario debe transmitir ... –

+4

Además, si ayuda a alguien más ... Encontré los mejores resultados en mi aplicación al darle a HUE una importancia de 47.5%, SATURACIÓN una importancia de 28.75% y BRILLO una importancia de 23.75%. –

+0

@AlbertRenshaw: ¿en qué idioma/plataforma? Mi suposición es Objective-C ... pero la pregunta no tiene absolutamente ninguna indicación de la plataforma involucrada. –

3

Creo que si se tratan colores como coordenadas RGB en 3 espacios y se calcula la distancia desde la muestra hasta valores conocidos, se puede determinar la coincidencia más cercana. Probablemente también intentaría escalar R G B según la sensibilidad del ojo (es decir, Y = 0.3 * R + 0.59 * G + 0.11 * B) obtendría el mejor resultado

+3

El único problema con el uso de RGB y la búsqueda de la magnitud entre dos colores es que la magnitud puede ser la misma para dos colores igualmente distantes, pero en direcciones opuestas del color que se compara. Por ejemplo (para simplificar, esto no tiene en cuenta la escala de sensibilidad visual): si el RGB es 0xFF0000 y se compara con 0x00FF00 y 0x0000FF, las magnitudes son las mismas, pero ¿el verde está más cerca del rojo que del azul? –

7

Jon Skeet tiene razón. Necesita utilizar un sistema con Hue como componente en lugar de RGB si le preocupa que el componente de color del partido difiera demasiado. HSL o HSV funcionarán bien para este propósito.

Luego, tiene que juguetear con la fórmula de distancia para aumentar el tono hasta que esté satisfecho con los resultados. Tenga en cuenta que encontrará que el problema es esencialmente insoluble a menos que tenga una gran cantidad de colores para combinar o que sus colores de entrada estén confinados a un pequeño rango de valores posibles. Esto se debe a que, aunque parezca que puedes fijar cualquier color que quieras a uno de 8 (rojo, naranja, verde, azul, violeta, blanco y negro) o uno de 16, en realidad encontrarás que tu algoritmo siempre encontrará lo que parecen ser obviamente coincidencias incorrectas porque con 3 ejes de movimiento (matiz, saturación, valor o rojo, verde, azul), hay muchos más colores "básicos" de lo que podrías pensar a primera vista.

+1

La idea es que el sensor encuentre el color "más cercano" dentro de una lista de colores. La aplicación de este problema es un robot que debe detectar splodges de 4 colores predeterminados sobre un fondo blanco. – Eric

+2

Depende de lo que "más cercano" signifique. El color verde estuvo más cerca del gris debido a un error RMS RMS en el código original. Entonces, ¿estaba mal? Dado que dices que sí, claramente estás imponiendo algún otro tipo de idea de lo más cercano basado en la percepción del color. Y te digo que te darás cuenta de que no estás muy contento con los resultados hasta que tengas algo así como 64 colores bien elegidos para que coincida. Al menos para el ojo humano. Su código presentado debería funcionar para comparar a 4 manchas predeterminadas, suponiendo que las manchas no se parecen mucho entre sí. –

Cuestiones relacionadas