jueves, 7 de marzo de 2013

[Lab VC] Actividad 4: Detección de círculos (radio diferentes)

Para esta actividad se debieron programar las rutinas para detectar círculos de diferentes tamaños, es decir, con radios variables, en una imagen. Para ello se utilizó la Transformada de Hough.

En la entrada anterior:


se describió el método utilizado para la detección de círculos a detalle, las bases para esta actividad son las mismas, sin embargo, ahora el radio es variable, por lo que hay que adaptar el código para que haga ésto.

Cuando el radio no es conocido, la solución más simple es comenzar con un radio de cota inferior e ir aumentándolo en cierta cantidad, pasos de 1 o 2.
Posteriormente hay que establecer una cota superior, una cota superior segura generalmente es la longitud de la diagonal mayor de la imagen ya que no tiene sentido buscar por circulos más grandes que ese tamaño.

Fuente: http://www.aishack.in/2010/03/circle-hough-transform/


Podemos limitar un poco más la búsqueda, por ejemplo, a 3/4 del tamaño de la longitud mayor.

Posteriormente, por cada radio tendremos una arreglo de bidimensional de votos, si cada arreglo lo agregamos a una lista terminaremos con un arreglo de tres dimensiones que contendrá los votos por cada radio probado.

Las imágenes utilizadas para la prueba fueron:

Original
Binarizada
Contornos

Los resultados fueron los siguientes:


Como podemos ver en las imágenes, hasta cierto punto el programa sabe dónde se encuentran los círculos ya que detecta y dibuja los contornos dentro de los límites de los mismos, y, por ejemplo en la primea imagen  ignora cualquier otra cosa (caso del triángulo invertido a la derecha). Sin embargo, no detecta correctamente los círculos lanzando basura en cada radio analizado.

Se necesita alguna rutina que limpie esa basura, ya que el problema que he notado es que por cada radio analizado, no importa cuan pequeño sea el radio o que el radio analizado no corresponda a un círculo en específico, siempre me lanza algún resultado, centros de círculos en alguna posición de la imagen  posiblemente porque a pesar de que el radio analizado no corresponde a ningún círculo visible, los pixeles aún así votan, los votos aún así se agrupan y aún así se lanza algún "centro" falso.


Implemente un pequeño algoritmo que hace una segunda agrupación de votos para detectar mejor los círculos y barrer un poco la basura, los resultados obtenidos fueron los siguientes:





Como podemos ver, los resultados son un poco mejores, en la primera imagen por lo menos se ubican los círculos, pero no exactamente en los centros. En la segunda imagen el resultado fue un poco mejor ya que se detectan los centros de 2 de los círculos, por lo menos de los 2 mas grandes. Sin embargo, esta segunda agrupación elimina la posibilidad de detectar la longitud del radio y no puedo dibujar el contorno de los círculos.

Mejoraré un poco el código, pienso que algún tipo de hibridación entre el primero y el segundo puede funcionar

Código


En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 5.

La mayoría de las funciones fueron explicadas en la entrada anterior, ahora solo se modularizó un poco el código y se adaptó a lo nuevo.


Referencias:

1 comentario: