lunes, 6 de mayo de 2013

Separación por color II

El siguiente paso en el desarrollo de nuestra aplicación ha sido el estudio y la transformación de las componentes RGB del color obtenido de la cámara a otros espacios de color (HSV, XYZ, YCrCb, Luv, YUV, etc.) para ver si en estos las variaciones de alguna de las coordenadas era determinista para poder diferenciar entre los dos tipos de color en los que se ha enfocado nuestro estudio: oro y cobre.

Los resultados obtenidos eran mejores en unos espacios de color que en otros, pero ninguno ha sido concluyente. A continuación se pasa a explicar brevemente las características principales de los espacios de color más relevantes dentro de todos los utilizados:

HSV


Un color representado en este espacio queda determinado por tres componentes: 
  • H: Hue (Matiz): Representa cada color mediante un ángulo.
  • S: Saturation (Saturación): Representa distancia al eje de brillo negro-blanco.
  • V: Value (Valor): Representa la altura en el eje blanco-negro.
El problema de este espacio con respecto a nuestra aplicación es que los colores oro y cobre están bastante juntos en la circunferencia, aún así podrían ser mucho mas estables y diferenciables que los valores de las componentes RGB. Después de tomar valores de varias monedas, observamos que tampoco cumplía los objetivos.

CIE XYZ


La matriz de transformación del espacio de color RGB a XYZ depende del punto blanco considerado. En nuestro caso se ha tomado como referencia el punto blanco D65, por lo que el respectivo cambio se realiza mediante la siguiente operación:


Este espacio de color se ha utilizado como transformación intermedia del espacio RGB a otros creados por  la Comision Internacional de la Iluminación (CIE), como el que se explica a continuación.

CIE Luv


Las tres componentes que se representan en este espacio de color son las siguientes:
  • L*: Luminosidad del color. Valores altos indican una mayor cercanía al blanco y valores en torno a 0 se corresponden con el color negro.
  • u*: Uniformidad del color.
  • v*: Brillo: Representa la altura en el eje blanco-negro.
Al contrario que los espacios anteriormente descritos, la transformación en este caso no es lineal. Las ecuaciones que definen dicha transformación son las siguientes:


\begin{align}
L^* &= \begin{cases}
  \left(\frac{29}{3}\right)^3 Y / Y_n,&   Y / Y_n \le \left(\frac{6}{29}\right)^3 \\
  116 \left( Y / Y_n \right)^{1/3} - 16,&  Y / Y_n  >   \left(\frac{6}{29}\right)^3      
\end{cases}\\
u^* &= 13 L^*\cdot (u^\prime - u_n^\prime) \\
v^* &= 13 L^*\cdot (v^\prime - v_n^\prime)
\end{align}

donde un y vn se corresponden con las coordenadas del llamado "Punto blanco" y Yn es su luminancia. En este caso se ha tomado como punto blanco: un = 0.2009vn = 0.4610. Además:


La peculiaridad de este espacio de color (y lo que le hace interesante para nuestra aplicación) es que provoca una percepción del color más lineal, es decir, se busca que un cambio de la misma cantidad en un valor de color provoque un cambio de la misma importancia visual.

En este caso, se utilizó la componente u* para intentar diferenciar los colores sin obtener tampoco unos resultados adecuados ya que, aunque obteniendo unos mejores resultados, la separación entre ellos no era lo suficientemente grande como para establecer un umbral determinado.



viernes, 3 de mayo de 2013

Separación por color I

Como se comentó en entradas anteriores, las relaciones de radios entre monedas del mismo color son únicas  y, teóricamente, deterministas. Pero antes de poder desarrollar los algoritmos necesarios para hacer este tipo de diferenciación, es necesario separar dentro de una imagen las monedas de color oro y las de color cobre.

En primer lugar es necesario obtener los colores del centro de las monedas, para obtener unos mejores resultados (colores mas fiables), se ha hecho la media de un cuadrado de 16 píxeles de área. Aunque puede parecer casi trivial en realidad no lo es tanto, el procedimiento a seguir es:
  • Crear un cuadrado con centro el de la elipse; en Opencv los cuadrados se definen a partir del vértice superior izquierdo, por lo que será necesario comprobar que al situar su centro este no se encuentre fuera de la esquina superior izquierda de la pantalla: posiciones inferiores a (1, 1), ya que se obtendría un error de NullPointerException.
  • Lo mismo ocurre al definir la medida de los lados, pero en este caso hay que tener en cuenta el número de filas y de columnas que forman la imagen para que la zona a la que se va a acceder quede totalmente incluida en el área de la pantalla.
  • Finalmente, se obtiene una submatriz de la matriz original (imagen al completo) y se hace la media de las componentes RGB de todos los píxeles.
Una vez se tienen los colores, hay que pensar en un método para distinguir el oro del cobre. Para ello se puede aprovechar el siguiente hecho: el color amarillo es la suma a partes iguales de los colores primarios rojo y verde; y el color cobre tendrá mucha más componente roja. Por lo tanto, para las monedas de oro la relación R/G ~ 1 y para las de cobre R/G > 1.

Una vez implementado, nos dimos cuenta de que en la práctica no se obtienen unos resultados concluyentes, ya que las relaciones que obteníamos eran muy parecidas entre ellas y no había manera de separar las monedas. Después de intentar numerosas relaciones basándonos en la misma idea, se probó utilizando la siguiente fórmula: relación = exp(R / 0.4*G). De esta manera, las variaciones en el exponente se verán reflejadas en una variación aún mayor en la relación.

Aun obteniendo unos mejores resultados, tampoco se obtuvieron unos resultados concluyentes, ya que el umbral de separación entre los colores dependería mucho de la luminosidad del ambiente, por no mencionar los posibles reflejos y sombras de las monedas. Llegados a este punto, se pensó una manera de hacer el color independiente de la luminosidad, es decir, normalizar cada componente dividiendo por el sumatorio de las otras tres y volviendo a multiplicar por 255 para volver a tener valores dentro del intervalo original [0, 255] y poder aplicar la relación explicada anteriormente. Tampoco se obtuvieron buenos resultados.


Figura 1: Espacio de color RGB