jueves, 27 de junio de 2013

Detección de Bordes

Para la primera tarea del curso de verano de Visión Computacional, se nos encargó la detección de bordes de una imagen.

Para llegar a esto primero estuvimos viendo operaciones básicas sobre las imagenes, para lo cual usamos la librería PIL (Python Image Library)

Para instalar esta librería en ubuntu debería ser suficiente la siguiente línea en la consola:

sudo apt-get install python-imaging

________________________________________________________________________
Cabe mencionar que una de las dificultades que se me presentó al trabajar con esta librería fue que el método show() no funcionaba. Esto era porque por default estaba configurado el visor de imagenes xv y hasta donde entendí había algunos conflictos con la instalación. De hecho el archivo Image.py de la librería PIL te menciona que xv ya está obsoleto y que los sistemas más modernos usan imagemagick (en mi computadora este archivo se encuentra en /usr/share/pyshared/PIL/Image.py ).

De ahí fue donde encontré la solución a mi problema: instalar otro visor de imagenes - imagemagick (otra opción era trabajar con pygame o tkinter para abrir las imagenes, pero me ahorré líneas de código al arreglar el método show() ). Para instalarlo solo basta escribir esta línea en consola:

sudo apt-get install imagemagick

Y listo, sin necesidad de mover más archivos, imagemagick abrirá tus imagenes cuando uses el método show().
_______________________________________________________________________

Para lograr la detección de bordes primero fue necesario hacer la imagen a escala de grises. Aquí el código para lograr esto:

-----
----
El método es simple:

Cada pixel de la imagen tiene tres canales: R,G,B. Estos canales tienen valores que van desde 0 a 255. Al recorrer cada pixel se suman estos tres valores y se dividen entre 3 (sacamos promedio). Despues el valor de cada canal se sustituye por este promedio. Eso hace que la imagen se convierta a escala de grises.

Ahora con la imagen en escala de grises es posible hacer la convolucion.

El método de convolución es algo simple. Se crea una matriz (máscara de convolución) de valores que se irá recorriendo por toda la matriz de pixeles.  Esta máscara coloca su centro en cada pixel recorrido.

El pixel en el que estamos colocados, toma el valor de la suma de las multiplicaciones de los valores de la máscara por los valores de los vecinos del pixel donde estamos colocados (y de él mismo).



Este es el código para la convolución:
----

----

El resultado es el siguiente:

Imagen original, gris, y bordes (la imagen random que hicimos en el salón):

Tiempo para esta imagen:



Otra imagen más:





Tiempo para esta imagen:




Y una más (ridículamente grande):



Tiempo para esta imagen:



Y aquí el código completo: