¿Cuál es la forma más precisa de determinar el color de un objeto?


33

He escrito un programa de computadora que puede detectar monedas en una imagen estática (.jpeg, .png, etc.) usando algunas técnicas estándar para la visión por computadora (Desenfoque gaussiano, umbral, Transformación de Hough, etc.). Utilizando las proporciones de las monedas recogidas de una imagen dada, puedo establecer con certeza qué monedas son cuáles. Sin embargo, deseo agregar a mis niveles de confianza y también determinar si una moneda que deduzco que es de tipo A (a partir de relaciones de radio) también es del color correcto [u] r. El problema es que para monedas británicas et al. (cobre, plata, oro), los colores respectivos (especialmente de cobre a oro) son muy similares.

Tengo una rutina que extrae el color medio de una moneda dada en términos del "espacio de color" RedGreenBlue (RGB) y las rutinas para convertir este color en "espacio de color" HueSaturationBrightness (HSB o HSV).

No es muy agradable trabajar con RGB al intentar diferenciar entre los tres colores de monedas (vea la imagen adjunta [básica] para ver un ejemplo). Tengo los siguientes rangos y valores típicos para los colores de los diferentes tipos de monedas:

Nota: el valor típico aquí es uno seleccionado usando una media 'en cuanto a píxeles' de una imagen real.

**Copper RGB/HSB:** typicalRGB = (153, 117, 89)/(26, 0.42, 0.60).

**Silver RGB/HSB:** typicalRGB = (174, 176, 180)/(220, 0.03, 0.71).

**Gold RGB/HSB:** typicalRGB = (220, 205, 160)/(45, 0.27, 0.86) 

Primero intenté usar la 'distancia euclidiana' entre un color de moneda promedio dado (usando RGB) y los valores típicos para cada tipo de moneda dado anteriormente tratando los valores RGB como un vector; para el cobre tendríamos:

Dcopper=((RtypeRcopper)2+(GtypeGcopper)2+(BtypeBcopper)2)

donde el valor más pequeño de la diferencia ( ) nos dirá qué tipo de moneda es más probable que sea. Este método ha demostrado ser muy inexacto.D

También he intentado solo comparar el tono de las monedas con los valores típicos de los tipos proporcionados anteriormente. Aunque en teoría esto proporciona un "espacio de color" mucho mejor para lidiar con los niveles variables de brillo y saturación de las imágenes, tampoco fue lo suficientemente preciso.

Pregunta: ¿Cuál es el mejor método para determinar un tipo de monedas basado en el color (de una imagen estática)?

Muchas gracias por tu tiempo.

Colores típicos de monedas

Editar 1

Nota: He probado todas las ideas que se analizan a continuación y no he logrado casi nada. La variación en las condiciones de iluminación (incluso dentro de la misma imagen) hace que este problema sea muy difícil y debe tenerse en cuenta.

Edición 2 (Resumen del resultado)

Gracias por sus respuestas. Investigaciones propias (incluyendo sus respuestas y comentarios) han resaltado cuán difícil es tratar este problema en el caso genérico de iluminación arbitraria, cámara arbitraria (dispositivo móvil), fluctuación en el color de la moneda (incluso para la misma especie / tipo) Primero examiné el reconocimiento del color de la piel (un campo de investigación muy activo) como punto de partida y todavía hay numerosos problemas incluso con el reconocimiento del color de la piel solo para los caucásicos (consulte este documento para una revisión de las técnicas actuales), y el hecho de que este problema contiene tres objetos de color distintos, todos los cuales pueden tener cromacias continuas y variables, hacen que este tema de la visión por computadora sea muy difícil de clasificar y tratar en consecuencia (de hecho, podría hacer un buen doctorado en él) !).

Miré en el Método de restricción de gama desde la muy útil publicación de DW a continuación. Esto fue a primera vista muy prometedor como un paso de preprocesamiento para transformar la imagen y los objetos de monedas separados en colores que son independientes de las condiciones de iluminación. Sin embargo, incluso esta técnica no funciona a la perfección (e implica una biblioteca de imágenes / histogramas para mapeos, en los que no quiero entrar) y tampoco lo hacen las metodologías mucho más complejas de la arquitectura de redes neuronales. De hecho, este documento establece en abstracto que:

"current machine colour constancy algorithms are not good enough for colour-based 
 object recognition.".

Eso no quiere decir que no haya muchos documentos más actualizados sobre este tema, pero no puedo encontrarlos y no parece ser un área de investigación muy activa en este momento.

La respuesta de AVB también fue útil y he examinado L A B * brevemente.

"The nonlinear relations for L*, a*, and b* are intended to mimic the nonlinear
response of the eye. Furthermore, uniform changes of components in the L*a*b* colour
space aim to correspond to uniform changes in perceived colour, so the relative 
perceptual differences between any two colours in L*a*b* can be approximated by 
treating each colour as a point in a three dimensional space."

Por lo que he leído, la transformación a este espacio de color para las imágenes dependientes de mi dispositivo será difícil, pero analizaré esto en detalle (con miras a algún tipo de implementación) cuando tenga un poco más de tiempo.

No estoy conteniendo la respiración para encontrar una solución concreta a este problema y, después del intento con L A B *, estaré descuidando el color de la moneda y buscando asegurar mis algoritmos de detección geométrica actuales (Transformación Elíptica Hough precisa, etc.).

Gracias a todos. Y como nota final a esta pregunta, aquí está la misma imagen con un nuevo algoritmo de detección geométrica, que no tiene reconocimiento de color:

ingrese la descripción de la imagen aquí


1
¿Las imágenes siempre tendrán el mismo color de fondo? ¿O puede introducir algún otro objeto 'estándar de color' en la imagen? Si es así, tiene una manera de ajustarse para diferentes luces. Si no es así, podría ser difícil ...
para

2
Obviamente no es solo una luz de color. Estoy bastante seguro de que la luz solar, la luz fluorescente y la luz incandescente tienen colores que son lo suficientemente diferentes como para estropear la coincidencia de colores HSB, a pesar de que nuestros ojos de alguna manera se ajustan para que no percibamos que las cosas cambian de color.
Peter Shor

2
(+1) La pregunta es interesante y desafiante. Siento que necesita un poco de refinamiento para tener una buena oportunidad de obtener una buena respuesta. Como se dijo actualmente, raya en estar mal planteado. Para una solución práctica, deberá proporcionar algunos detalles más sobre la gama de entornos en los que desea poder realizar esta clasificación. ¿De qué color son posibles los fondos? ¿Siempre la misma cantidad de monedas? ¿Siempre tendrás una imagen en color? Buena iluminación ambiental? Conocer este tipo de características puede proporcionar orientación hacia una solución.
cardenal

2
Creo que el problema que enfrenta es el de la "constancia de color". Otros términos de búsqueda serían "descontar el iluminante" o "descontar el fondo". Es un problema no resuelto en la ciencia de la visión.
caracal

1
¡Ojalá pudiera hacer +1 nuevamente para el buen seguimiento! Cosas muy interesantes
Matt Parker

Respuestas:


6

Dos cosas, para empezar.

Uno, definitivamente no funciona en RGB. Su valor predeterminado debe ser el espacio de color Lab (también conocido como CIE L * a * b *). Descartar L. A partir de su imagen que se parece a la ade coordenadas que da la mayoría de la información, pero es probable que debe hacer un análisis de componentes principales en ay by el trabajo a lo largo del primer componente (lo más importante), sólo para mantener las cosas simples. Si esto no funciona, puede intentar cambiar a un modelo 2D.

Solo para tener una idea de ello, en alas tres monedas amarillentas tienen ETS por debajo de 6, y los medios de 137 ("oro"), 154 y 162, deben distinguirse.

En segundo lugar, el problema de la iluminación. Aquí tendrá que definir cuidadosamente su problema. Si desea distinguir los colores cercanos bajo cualquier iluminación y en cualquier contexto, no puede, no así, de todos modos. Si solo le preocupan las variaciones locales en el brillo, Lab se ocupará principalmente de esto. Si desea poder trabajar tanto con luz diurna como con luz incandescente, ¿puede garantizar un fondo blanco uniforme, como en su imagen de ejemplo? En general, ¿cuáles son sus condiciones de iluminación?

Además, su imagen fue tomada con una cámara bastante barata, por lo que parece. Probablemente tiene algún tipo de función de balance de blancos automático, que desordena los colores bastante mal, apáguelo si puede. También parece que la imagen se codificó en YCbCr en algún momento (sucede mucho si se trata de una cámara de video) o en una variante similar de JPG; la información de color está severamente submuestreada. En su caso, en realidad podría ser bueno, significa que la cámara le ha hecho un poco de ruido en los canales de color. Por otro lado, probablemente significa que en algún momento la información del color también se cuantificó más fuerte que el brillo, eso no es tan bueno. Lo principal aquí es: la cámara importa, y lo que hagas debe depender de la cámara que vas a usar.

Si algo aquí no tiene sentido, deje un comentario.


Gracias por tu respuesta. No puedo asegurar nada de lo anterior. Esto es para una aplicación móvil que cuenta monedas (una cantidad arbitraria de monedas) con un clic de un botón (¡y es muy rápido!). Por lo tanto, la iluminación puede variar enormemente y tampoco hay un fondo consistente. Creo que clasificar los tipos de monedas por color de esta manera (como usted señala) no es posible. Sin embargo, me gusta su respuesta de usar L A B * y creo que es la mejor respuesta ofrecida. A la luz de esto, tienes la respuesta y la recompensa. Gracias de nuevo.
MoonKnight

6

En el espíritu de la lluvia de ideas, compartiré algunas ideas que podrías probar:

  1. Prueba Hue más? Parece que Hue te dio un muy buen discriminador entre plata y cobre / oro, aunque no entre cobre y oro, al menos en el único ejemplo que mostraste aquí. ¿Ha examinado el uso del Hue con mayor detalle para ver si podría ser una característica viable para distinguir la plata del cobre / oro?

    Podría comenzar reuniendo un montón de imágenes de ejemplo, que ha etiquetado manualmente, y calculando el tono de cada moneda en cada imagen. Entonces puede intentar histogramarlos, para ver si Hue parece una forma plausible de discriminar. También podría intentar mirar el Tono promedio de cada moneda, por un puñado de ejemplos como el que presentó aquí. También puede probar Saturación, ya que parecía que también podría ser útil.

    Si esto falla, es posible que desee editar su pregunta para mostrar lo que ha intentado y dar algunos ejemplos para ilustrar de manera concisa por qué esto es difícil o dónde falla.

  2. Otros espacios de color? Del mismo modo, puede intentar transformar la cromacidad rg y luego experimentar para ver si el resultado es útil para distinguir la plata del cobre / oro. Es posible que esto pueda ayudar a ajustar la variación de iluminación, por lo que podría valer la pena intentarlo.

  3. ¿Verifica las diferencias relativas entre monedas, en lugar de mirar cada moneda de forma aislada? Entiendo que, a partir de las proporciones de tamaños de monedas (radios), tiene una hipótesis inicial para el tipo de cada moneda. Si tienes monedas, este es un vector. Le sugiero que pruebe esta hipótesis compuesta completa de una sola vez, en lugar de probar veces su hipótesis para cada moneda por sí sola.n nnnn

    ¿Por qué podría ayudar esto? Bueno, puede permitirle aprovechar los tonos relativos de las monedas entre sí, que deberían estar más cerca de la invariante con respecto a la iluminación (suponiendo una iluminación relativamente uniforme) que el tono individual de cada moneda. Por ejemplo, para cada par de monedas, puede calcular la diferencia de sus matices y verificar si esto corresponde a lo que esperaría dar su hipótesis sobre sus dos identidades. O bien, podría generar un -vector con los tonos predichos para las monedas; calcule un vector con los tonos observados para las monedas; agrupe cada uno; y verifique que haya una correspondencia uno a uno entre los tonos. O, dados los vectoresp n n o n p , o T o T ( p ) o iT ( p i ) Tnpnnonp,o , podría probar si existe una transformación simple tal que , es decir, cumple para cada i. Puede que tenga que experimentar con diferentes posibilidades para la clase de que permite. Una clase de ejemplo es el conjunto de funciones , donde la constante abarca todas las posibilidades.ToT(p)oiT(pi)TT(x)=x+c(mod360)c

  4. ¿Comparar con imágenes de referencia? En lugar de usar el color de la moneda, podría considerar intentar hacer coincidir lo que está impreso en la moneda. Por ejemplo, supongamos que ha detectado una moneda en la imagen y supone que es una moneda de una libra. Usted podría tomar una imagen de referencia de una moneda de una libra y probar si parece coincidir .CRRC

    Deberá tener en cuenta las diferencias de postura. Permítanme comenzar asumiendo que tiene una imagen frontal de la moneda, como en su imagen de ejemplo. Entonces, lo principal que debe tener en cuenta es la rotación: no sabe a priori cuánto gira. Un enfoque simple podría ser la de barrer sobre una gama de posibles rotación ángulos , rotate por , y comprobar si parece coincidir . Para probar una coincidencia, puede usar una métrica de diferencia simple basada en píxeles: es decir, para cada coordenada , calcule (la diferencia entre el valor de píxel enCθRθRθC(x,y)D(x,y)=Rθ(x,y)C(x,y)Rθy el valor del píxel en ); luego use una norma (suma de cuadrados) o algo así para combinar todos los valores de diferencia en una sola métrica de qué tan cerca tiene una coincidencia (es decir, ) Deberá usar un incremento de paso lo suficientemente pequeño como para que la diferencia de píxeles funcione. Por ejemplo, en su imagen de ejemplo, la moneda de una libra tiene un radio de aproximadamente 127 píxeles; si barre los valores de , aumentando en grados en cada paso, entonces solo necesitará probar aproximadamente 1460 valores de rotación diferentes, y el error en la circunferencia de la moneda en la aproximación más cercana a la verdaderaCL2(x,y)D(x,y)2θ0.25θ debe ser como máximo un cuarto de píxel, que es lo suficientemente pequeño como para que la diferencia de píxeles funcione correctamente.

    Es posible que desee experimentar con múltiples variaciones de esta idea. Por ejemplo, podría trabajar con una versión en escala de grises de la imagen; el RGB completo, y use una norma sobre las tres diferencias R, G, B; HSB completo, y use una norma sobre las tres diferencias H, S, B; o trabaje solo con el plano Tono, Saturación o Brillo. Además, otra posibilidad sería ejecutar primero un detector de bordes en y , luego hacer coincidir la imagen resultante de los bordes.L2L2RC

    Para mayor robustez, es posible que tenga varias imágenes de referencia diferentes para cada moneda (de hecho, cada lado de cada moneda), y pruebe todas las imágenes de referencia para encontrar la mejor coincidencia.

    Si las imágenes de las monedas no se toman directamente de frente, entonces, como primer paso, es posible que desee calcular la elipse que representa el perímetro de la moneda en la imagen e inferir el ángulo en el que se ve la moneda. Esto le permitirá calcular cómo se vería en ese ángulo, antes de realizar la coincidencia.CR

  5. ¿Comprueba cómo varía el color en función de la distancia desde el centro? Aquí hay un posible paso intermedio entre "el color medio de la moneda" (un número único, es decir, 0-dimensional) y "la imagen completa de la moneda" (una imagen bidimensional). Para cada moneda, puede calcular un vector unidimensional o función , donde representa el color medio de los píxeles a una distancia aproximadamente del centro de la moneda. Luego, podría intentar hacer coincidir el vector para una moneda en su imagen con el vector para una imagen de referencia de esa moneda.ff(r)rfCCfRR

    Esto podría permitirle corregir las diferencias de iluminación. Por ejemplo, es posible que pueda trabajar en escala de grises o en un solo plano de bits (p. Ej., Tono, Saturación o Brillo). O bien, es posible que primero pueda normalizar la función restando la media: , donde es el color medio de la moneda, luego intente hacer coincidir con .fg(r)=f(r)μμgCgR

    Lo bueno de este enfoque es que no es necesario inferir cuánto se rotó la moneda: la función es invariante a la rotación.f

    Si desea experimentar con esta idea, calcularía la función para una variedad de imágenes de ejemplo diferentes y las graficaría. Entonces debería poder inspeccionarlos visualmente para ver si la función parece tener una forma relativamente consistente, independientemente de la iluminación. Es posible que necesite probar esto para múltiples posibilidades diferentes (escala de grises, cada uno de los planos de bits HSB, etc.).fC

    Si la moneda podría no haber sido fotografiada directamente de frente, pero posiblemente desde un ángulo, primero deberá trazar la elipse del perímetro de para deducir el ángulo desde el cual fue fotografiada y luego corregirla en el cálculo de .CCf

  6. Mire los algoritmos de visión para la constancia del color. La comunidad de visión por computadora ha estudiado la constancia del color , el problema de corregir una fuente de iluminación desconocida; ver, por ejemplo, este resumen . Puede explorar algunos de los algoritmos derivados de este problema; intentan inferir la fuente de iluminación y luego corregirla, para derivar la imagen que habría obtenido si la imagen hubiera sido tomada con la fuente de iluminación de referencia.

  7. Busque en la indexación de color constante de color. La idea básica de CCCI , según tengo entendido, es cancelar primero la fuente de iluminación desconocida reemplazando el valor R de cada píxel con la relación entre su valor R y uno de los valores R de su vecino; y de manera similar para los planos G y B. La idea es que (con suerte) estas relaciones ahora deberían ser en su mayoría independientes de la fuente de iluminación. Luego, una vez que tenga estas proporciones, calcule un histograma de las proporciones presentes en la imagen y use esto como una firma de la imagen. Ahora, si desea comparar la imagen de la moneda con una imagen de referencia , puede comparar sus firmas para ver si parecen coincidir. En su caso, es posible que también deba ajustar el ángulo si la imagen de la monedaCRC no se tomó de frente, pero parece que podría ayudar a reducir la dependencia de la fuente de iluminación.

No sé si alguno de estos tiene posibilidades de funcionar, pero son algunas ideas que puedes probar.


3

Interesante problema y buen trabajo.

Intente usar valores de color medianos en lugar de medios. Esto será más robusto frente a valores atípicos debido al brillo y la saturación. Intente usar solo uno de los componentes RGB en lugar de los tres. Elija el componente que mejor distinga los colores. Podría intentar trazar histogramas de los valores de píxel (por ejemplo, uno de los componentes RGB) para darle una idea de las propiedades de la distribución de píxeles. Esto podría sugerir una solución que no es inmediatamente obvia. Intente trazar los componentes RGB en el espacio 3D para ver si siguen algún patrón, por ejemplo, pueden estar cerca de una línea que indica que una combinación lineal de los componentes RGB puede ser un mejor clasificador que uno individual.


Buen grito con la mediana, de hecho, también he codificado esto y esto también es pobre en términos de establecer el color correcto. Con el enfoque de histograma, soy consciente del gasto computacional; ¡Tan pronto como empiece a recorrer los píxeles en 2D, incurriré en cargos! Sin embargo, podría valer la pena poner algo como esto (como usted señala) para establecer correlaciones. Produje todo tipo de gráficos para los componentes RGB y debido a las condiciones de iluminación variables (una consecuencia de tomar fotografías en diferentes ubicaciones) los valores RGB pueden superponerse en gran medida para los tres tipos de monedas.
MoonKnight

También he buscado ajustar un modelo para estimar una probabilidad posterior de que un punto de espacio de color pertenezca a un determinado tipo de moneda. También he analizado el modelado de mezclas gaussianas, pero todavía no he llegado muy lejos con esto. También me han informado sobre otro enfoque (algo arbitrario, pero más simple), y es usar algo como la interpolación del vecino más cercano. Gracias por tu tiempo.
MoonKnight

1
En una pista completamente diferente, otra diferencia entre las monedas es el diseño en la parte frontal / posterior (aunque algunas pueden tener el mismo diseño en un lado) ¿Qué pasa con la correlación cruzada del conjunto de patrones de diseño con los píxeles de la moneda (o el uso de información mutua)? para ayudar a determinar qué moneda estás mirando. Con una combinación de proporciones, color de píxel y esta coincidencia de diseño, probablemente podrá reducir la tasa de descubrimiento falso.
martino

He pensado en esto, pero esto está pidiendo demasiado del software de reconocimiento actual y sería un trabajo enorme escribir desde cero (OCR ??). También hay una gran variación en los gráficos de tales monedas que hacen que tal implementación sea una pesadilla de mantenimiento. Voy a tener una obra de teatro más tarde, informaré lo que encuentre. Gracias de nuevo.
MoonKnight

¿Por qué el voto negativo? Si hay un problema con la respuesta, sería útil señalarlo. No puedo ver uno
Martino
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.