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
Muy bien; 5 pts.
ResponderEliminar