martes, 5 de marzo de 2013

[VC] Tarea 4: Detección de círculos (radio conocido)


Para ésta tarea se debieron programar las rutinas para detectar circulos con radio conocido y preestablecido un una imágen. Para ello se utilizó la Transformada de Hough.


Para la detección de bordes es necesario:
  • Aplicar máscaras mediante el método de convolución discreta.

Los pasos necesarios son muy parecidos a la detección de lineas, éstos son:
  • Elegir las máscaras a aplicar, en mi caso elegí 2 máscaras de Sobel
  • Aplicar las máscaras utilizando convolución discreta (2D)
    • Aplicar por separado para obtener 2 gradientes Gx y Gy
    • Obtener G con la fórmula
$$ G=\sqrt{Gx^{2} + Gy^{2}} $$
  • A partir de las matrices de gradientes obtenidas, calcular los ángulos para seno y coseno con las fórmulas:
$ \cos\theta = Gx/G $
$ \sin\theta = Gy/G $
  • Hayar las coordenadas del centro del circulo aplicando las formulas
$x_{c} = x - r \cos\theta$
$y_{c} = y - r \sin\theta$
  • Hacer esto por cada pixel para obtener las coordenadas centro a partir de un radio establecido.
  • Declarar un acumulador de votos, que puede ser un arreglo del mismo tamaño de la imágen en pixeles. El acumulador de votos recoge los potenciales centros de circulos de acuerdo al número de votaciónes de los pixeles que lo rodean.
  • Agrupar los votos que ésten demasiado cerca, que el pixel con mayores votos se coma a los pixeles con menores votos para reducir el ruido y centros falsos.
  • Los pixeles con mayores votos son los centros, implementar las rutinas necesarias para descartar falsas alarmas no detectadas en el proceso anterior.
  • A partir de los centros, dibujar el contorno de los círculos encontrados, marcar su centro, etiquetar cada círculo y obtener el diámetro total.

Las imágenes necesitan tratarse antes de pasar por el proceso de detección de círculos:
  • Binarizar la imágen
  • Obtener su contorno
El radio es un parámetro de la simulación y se mide utilizando cualquier software de edición de imágenes, simplemente se mide cuantos pixeles hay de contorno a contorno en el centro, asi obtenemos el diámetro, diámetro entre dos nos da el radio estimado en pixeles.

Las imágenes utilizadas para el ejercicio fueron las siguientes:


Datos Original Binarizada Contornos
Radio=72px
Radio=46px
Radio=41px

Después las imágenes pasan por el proceso donde se detectan los círculos  los contornos se pintan de color amarillo y los centros se marcan con un punto verde y se les coloca una etiqueta. Así mismo, en la terminal, se imprime el ID del círculo y la longitud de su diámetro  el porcentaje del diámetro se calcula a partir de la diagonal máxima de la imagen.

Los resultados fueron


Como podemos ver, los círculos se detectan muy bien, puede haber pocos círculos, muchos círculos o círculos incompletos.
El único bug visible es un centro ligeramente desplazado en la última imágen, pero creo es más cuestión de ajustes de los parámetros de procesamiento que un error en si.


Código

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

El dibujo en el canvas se hace con la siguiente función

1 comentario: