martes, 26 de febrero de 2013

Clase - Detección de Lineas

Para esta semana, se trabajo para detectar lineas horizontales y verticales en alguna imagen.

Las lineas se muestran en Color Rojo, con un tono para lineas horizontales y otro tono en lineas verticales.

Pero primero que nada, una explicación de lo que se hará:

Transformada de Hough

El algoritmo de la transformada de Hough usa una matriz, llamada acumulador, cuya dimensión es igual al número de parámetros desconocidos del problema. 

Por ejemplo, para detectar la existencia de una recta de la forma y = m*x+n, la dimensión del acumulador sería dos, ya sea su representación en coordenadas cartesianas (m,n) o en coordenadas polares (\rho,\theta), son desconocidos. 


Esto se logra buscando todas las posibles combinaciones de valores para parámetros que describen la figura (los posibles valores se obtienen a partir del acumulador). 


Si es así, se calculan los parámetros de esa figura, y después se busca la posición en el acumulador correspondiente a la figura definida, y se incrementa el valor que hay en esa posición.

Las dos dimensiones del acumulador corresponden a los valores cuantificados para (\rho,\theta).

Para construir el acumulador es necesario discretizar los parámetros que describen la figura. Cada celda del acumulador representa una figura cuyos parámetros se pueden obtener a partir de la posición de la celda.

Por cada punto en la imagen, se buscan todas las posibles figuras a las que puede pertenecer ese punto. 

Las figuras se pueden detectar buscando las posiciones del acumulador con mayor valor (máximos locales en el espacio del acumulador). 

La forma más sencilla de encontrar estos picos es aplicando alguna forma de umbral, pero distintas técnicas podrían dar mejores resultados en distintas circunstancias, determinando donde se encuentran las figuras y cuantas hay.

Por los errores que se pueden cometer detectando bordes, existirán imperfecciones en el espacio acumulador, lo que puede hacer que no sea trivial en encontrar los picos correctos y por tanto las figuras apropiadas.

Aquí se muestra un pseudo-código:
1:    cargar imagen
2:    detectar los bordes en la imagen
3:    por cada punto en la imagen:
4:       si el punto (x,y) esta en un borde:
5:          por todos los posibles ángulos \theta:
6:             calcular \rho para el punto (x,y) con un ángulo \theta
7:             incrementar la posición (\rho,\theta) en el acumulador
8:    buscar las posiciones con los mayores valores en el acumulador
9:    devolver las rectas cuyos valores son los mayores en el acumulador.

Imágenes:



Para detectar lineas, el código es el siguiente:

Código:

Problemas con el código :(

 Los Resultados son los siguientes:

Resultados: 

:(

Repositorio:

1 comentario:

  1. Si pudiera haber visto algo además de "import", tendrías más que un punto.

    ResponderEliminar