Para esta actividad se debieron programar las rutinas para detectar elipses y círculos de diferentes tamaños en una imagen. Para ello se utilizó la Transformada de Hough y el método de la cuerda-tangente.
Teoría
$\begin{bmatrix}-1 & 0 & 1\\-2 & 0 & 2\\-1 & 0 & 1\end{bmatrix}$ $\begin{bmatrix} 1 & 2 & 1\\ 0 & 0 & 0\\ -1 & -2 & -1\end{bmatrix}$
Teoría
Los pasos necesarios son:
- Tomar la imagen original y aplicar detección de bordes, cuidar que los bordes sean lo suficientemente continuos.
- Elegir las máscaras a aplicar, sigo trabajando con 2 máscaras de Sobel
- Aplicar las máscaras utilizando convolución discreta (2D)
- Aplicar por separado para obtener 2 gradientes Gx y Gy
- Recorrer la lista de puntos de los bordes y elegir 2 puntos, aplicar alguna regla para evitar elegir dos puntos muy cercanos; así mismo, aplicar una regla para la selección de los puntos, puede ser al azar o recorrer la lista de pixeles de bordes en orden e ir armando los pares respetando la primer regla.
- Elegir una gradiente para cada punto de acuerdo a sus coordenadas:
- A partir de las matrices de gradientes obtenidas, calcular el ángulo para cada pixel de acuerdo a la formula:
Después girar el ángulo con el siguiente ajuste:
$$ \theta = \left (\theta - \frac{pi}{2} \right )(-1) $$
- Dibujar la recta tangente para cada punto, para mi caso particular utilicé una fórmula donde solo de necesita un punto y el ángulo, así como un largo arbitrario el cual lo definí con la longitud de la diagonal máxima de la imágen. La fórmula regresa los puntos donde comienza (xA,yA) y finaliza (xB, yB) la línea tangente (que es todo lo que necesitamos), tomando en cuenta que las coordenadas del pixel seleccionado son su coordenadas de origen. La fórmula es:
- Identificar si las rectas tangentes se cruzan o no, si es así, detectar el punto de cruce.
- Calcular el punto medio a partir de los puntos del borde que tocan las rectas tangentes.
- Dibujar una linea entre el punto de cruce de las lineas tangentes y el punto medio.
- Alargar dicha linea y someter a votación los pixeles que cruza dicha linea.
- Agrupar los votos y definir el centro candidato.
- Calcular los semidiametros del elipse a partir del centro candidato.
- Aplicar la ecuación del elipse para dibujar el contorno del elipse.
Práctica
Las imagenes utilizadas para las pruebas fueron las siguientes:
Original | ||
---|---|---|
Binarizada | ||
Contornos |
Para la prueba realice una corrida exhaustiva, buscando casi todas las combinaciones de pares de puntos para comparar las tangentes, respetando los umbrales correspondientes.
Esta es una imágen que muestra un paso intermedio del proceso, las lineas azules son las tangentes, los puntos verdes son el origen de las tangentes, punto medio y punto de cruce de las tangentes, los puntos rojos son los pixeles sometidos a votacion:
La idea es repetir el paso mostrado en la imagen suficientes veces como para que el centro del elipse sea el mas votado.
Resultados
Los resultados de las pruebas fueron los siguientes
Como se puede ver en los resultados, algunas veces los centros de los elipses son detectados lejos del centro real, desplazados; esto afecta también el dibujo de los semidiámetros,
Pienso que falta un ajuste en el método de votación y de agrupación de votos.
Se imprimen en pantalla los ID de los elipses junto con el listado que incluye los tamaños de los semidiametros en pixeles y su porcentaje vs. el tamaño de la diagonal mayor de la imagen.
Código
En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 6.
Referencias:
Esto es completamente adecuado para el propósito de la tarea, aunque los centros no estén bien refinados aún. 5 pts.
ResponderEliminar