martes, 16 de abril de 2013

Detección de elipses

Lo primero que se hizo es identificar píxeles de borde de un objeto, para esto se identificaron los bordes usando el filtro laplaciano, después utilizando BFS se guardo en una lista todos los bordes de cada objeto identificado.
La siguiente función es la que recorre la imagen encontrando los bordes continuos y guardando un elemento que contiene una lista de los bordes continuos.



Enseguida lo que hice es eligir pares de píxeles, verificando después de llamar esta función que sean puntos no paralelos.



Lo siguiente fue calcular la tangente, la tangente la saqué solamente del punto que se eligió aleatoriamente en el paso anterior, es por eso que quise programar de manera diferente la gradiente para evitar el usar matrices de numpy, etc, ya que no nos interesan todos los puntos de la imagen solo el del punto de borde aleatorio.
Hasta aquí es esto lo que obtengo al correr el programa:

los puntos verdes son los elegidos al azar



Y luego calculé las intersecciones de las dos rectas dibujadas, para esto use la formula que viene en Wikipedia. Y se puede ver de la siguiente manera:

http://en.wikipedia.org/wiki/Line-line_intersection



punto azul es la intersección

Y luego el punto medio con la formula: ym = (punto_1_y+punto_2_y)/2, xm = (punto_1_x+punto_2_x)/2. Y se puede ver de la siguiente manera:

El punto amarillo es el punto medio

El punto amarillo es el punto medio


Después saque la pendiente de el punto de cruce (azul) con el punto medio(amarillo),

El código es:



Y alargue la línea hacia adentro del elipse para poder ir votando hasta que se llegue a un píxel que ya no sea figura.


Para alargar la línea utilicé la ecuación punto pendiente en donde como variables conocidad tengo la "x1" a la que solamente aumente de uno en uno para obtener continua la línea, la "x0" que es el punto medio al iniciar y después se va actualizando  también tengo la "m" que es la pendiente, y tengo la "y0" que es el punto medio al iniciar y que también se va actualizando, entonces lo único que se hace es despejar la y1.

En esa misma función agregue los votos a una matriz, que van desde el punto medio hasta el pixel que ya no pertenece al objeto.

El código es el siguiente:



Entonces ahora llame a varios puntos por imagen para poder obtener los pixeles más votados, y aquel pixel que es el más votado, es el que resulta ser el centro del elipse, el centro de masa me daba valores no muy buenos ya que aparecían entre el top de píxeles más votados algunos alejados del centro y provocaba que el centro real se moviera un poco.
Este es el resultado:

Centro encontrado en naranja, con 200 pares de puntos aleatorios



Centro naranja encontrado con 1000 pares de puntos aleatorios


El punto naranja es el centro encontrado





Después de tener ya el centro que fue el candidato ganador, se calculó la distancia mínima y máxima como del centro a los puntos que se generaron aleatorios que ayudaron a votar, entonces estos son los semi-diámetros y se calculan el angulo.
Los puntos rojos son los máximos y mínimos encontrados


Teniendo estos datos, ahora se crea la ecuación del elipse




Casi circulo








Después chequé que porcentaje del borde detectado con el primer filtro que apliqué laplaciano coincide en cierto porcentaje con puntos del elipse que yo dibujé entonces si es elipse si no no es,
Y ahora si con las indicaciones de

  • punto azul en el centro
  • etiqueta del elipse
  • colores anaranjados para pintar el elipse
  • porcentaje de las diagonales







Código completo:


Referencias

Elipses

Ecuación elipse

1 comentario: