[imagen obtenida de:"http://what-when-how.com/wp-content/uploads/2011/06/tmp2053_thumb1.jpg"]
El algoritmo
El método utilizado para detectar círculos es muy parecido al que utilice en publicaciones pasadas para detectar lineas, solo que en esta ocasión se utilizan los gradientes para calcular el ángulo con el fin de tomar ese punto como si fuera parte de un círculo y utilizar el ángulo para generar un punto a una distancia $r$ de dicho punto, es decir se calcula un posible centro para cada punto. esto se hace de la siguiente forma:
Primero calculé el gradiente para cada pixel utilizando los gradientes en $x$y en $y$ tal como se hizo en tareas pasadas.
$g = \sqrt{ g_{x}^{2} + g_{y}^{2} }$
Una vez hecho esto se utilizan dichos valores para calcular:
$cos\left ( \theta \right ) = \frac{gx}{g}$
$sin\left ( \theta \right ) = \frac{gy}{g}$
Con esto podemos calcular los posibles centros de círculo para cada pixel de la siguiente manera:
$x_{c} = x-rcos\left ( \theta \right )$
$y_{x} = y - rsin\left ( \theta \right ) $
Código
Resultado
El contorno del círculo se muestra con tonos de amarillo generados aleatoriamente, en el centro con verde el punto central y una etiqueta para cada círculo. El centro se mueve por que para poder lograr abarcar mayor contorno del círculo con el algoritmo discreticé en múltiplos de un número por lo cual el centro suele moverse un poco a la esquina superior izquierda del círculo.
|
|
|
|
Referencias:
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/circulos.pdf






Bien; faltó imprimir la lista igual que a Cecy & Emmanuel. 5 pts anyhow. Pon la lista en la próxima tarea.
ResponderBorrar