lunes, 25 de febrero de 2013

Visión Computacional Detección de Líneas

Bienvenidos compañeros y personas que nos visitan, en esta ocasión hablaremos como encontrar las líneas de una imagen. Bueno empecemos

La forma de una línea  recta se puede representar con la siguiente ecuación matemática :





Ahora para sacar los diferentes rho de cada pixel es necesario obtener los ángulos de cada uno de los pixeles. Estos ángulos nos indicaran que tipo de dirección tiene, ya sea izquierda , derecha, arriba , abajo o ningún lado. Para obtener estos ángulos es necesario saber los gradientes de la imagen tanto en x como y.

Quedando así la siguiente ecuación:

atan = arco tangente

Y para sacar gradiente en x  y gradiente en "y", es necesario utilizar máscaras, en este caso se utilizó la máscara de sobel, en anteriores post se habla sobre identificación de bordes y como hacerlo.

Por último con respecto a esta parte, en caso de que gx = 0 y la sumatoria de ||gx|| + ||gy|| sea igual a cero, se considera que no tiene ninguna dirección en especifico y en caso que no sea hacia se asigno un valor pi.
Aquí la parte del código que hace todo esto:

Termina

Aclaración: Se trabajo con dos imágenes la final y una imagen con bordes,  se utilizó la imagen de bordes para hacer mas rápido el proceso de rho y solo usar los pixeles de los bordes. Al igual que se saltaron los bordes de la imagen para no generar mucho ruido.


Posteriormente se verificó la frecuencia de aparición de los diferentes ángulos y su respectivo rho. Ya casi al final del  proceso se realiza algún sistema que indica si existe muchas repeticiones de un mismo ángulo esto, nos dice si pertenece a una línea.

Aquí el código de obtención de frecuencias y la selección:

Termina
Y para finalizar solo comparamos los diferentes rho con los rho acpetados y los pintamos de color rojo
Código de pintar
Termina


Aclaración: No se espera que salgan bien las imágenes ya que siempre existirán  errores como la selección o el calculo de rho

En mi ejemplo solo función para identificar lineas horizontales :C

Aquí unas imágenes

Primera prueba:
Imagen inicial:



Imagen final:

Tiempo que tardo 3.37s  Solo se tomo los pixeles de los bordes
Segunda Prueba:

Aquí la imagen final
Tiempo 1.38 con las mismas condiciones de la anterior
Como vemos en esta imagen se detecta las linea de la izquierda pero también varios puntos de lineas de los mismos números del lado izquierdo. 


Código completo:

El código fue hecho en base a una referencia de un código escrito por la doctora Satu Elisa Schaeffer
:

1 comentario: