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





No hay comentarios:

Publicar un comentario