11 de febrero de 2013

Detección de Bordes

Visión Computacional
Tarea 1

Existen varias máscaras que se pueden aplicar para la detección de bordes en una imagen. Al experimentar con varias de ellas, encontré una llamada Operador Laplaciano que fue el que me dio mejor resultado y fue el que utilice para la detección de bordes con mi programa.

$\begin{bmatrix}{0}&&{1}&&{0}\\{1}&&{-4}&&{1}\\{0}&&{1}&&{0}\end{bmatrix}$

Podemos ver que esta máscara es simétrica, por lo que no fue necesario aplicar más de una vez el método de convolución, ya que comúnmente se suelen utilizar por lo menos dos máscaras, una para bordes horizontales y una para bordes verticales.

Utilizando esta máscara podemos ver resultados como el siguiente:


Para que los bordes resultaran contínuos, experimente con la aplicación de algunos filtros simples como el de difuminado y una versión de umbrales, que yo llamo blanco y negro, donde recibe un parámetro que indica el valor del umbral al cual hay que compararse para determinar si el pixel se convierte a blanco o negro.

La desventaja de aplicar estos filtros es que algunos de los bordes menos detallados se pierden, pero es posible arreglarlo cambiando la forma en que los umbrales son aplicados a diferentes escalas de grises en la imagen, pero por ahora he dejado un valor predeterminado en este método de umbrales, ya que logra resaltar las características más sobresalientes de las imágenes en general.

La experimentación fue visual, y los filtros aplicados para resaltar los bordes aveces variaban según la imagen con la que estaba haciendo pruebas, pero el filtro de difuminado y después aplicación de umbrales fue el que logró hacer diferenciar los bordes para la mayoría de las imágenes.

Se realizó una prueba de tiempo de ejecución de la rutina completa para obtener los bordes de la imagen incluyendo el tiempo que tarda el filtro para escala de grises antes de aplicar la máscara, y los filtros de difuminado y umbrales después de aplicar la máscara, así como el tiempo que tarda en aplicar la propia máscara.

Se hizo un promedio del tiempo de 30 repeticiones para diferentes imágenes y diferentes dimensiones.

Ahora veamos la comparativa de la imagen original contra la imagen después de la detección de bordes, y la tabla con los resultados de la prueba de tiempo de ejecución.


Perry



Los resultados de la prueba de tiempo para la imagen perry-el-ornitorrinco.jpg fue la siguiente:

Dimensión Tiempo de ejecución
300x200 2.10296666622
500x400 7.42993968725
700x550 14.6455515027


Snoopy



Los resultados de la prueba de tiempo para la imagen snoopy.jpg fue la siguiente:

Dimensión Tiempo de ejecución
200x100 0.539839204152
300x200 2.12622498671
400x300 5.17025875251


Fundidora



Los resultados de la prueba de tiempo para la imagen fundidora.jpg fue la siguiente:

Dimensión Tiempo de ejecución
300x200 2.14322346449
500x400 7.40442377329
1000x700 28.0735495091


Código


Los filtros que ya había creado anteriormente los coloque en un solo script de python con nombre filters_methods.py, y en el script edges.py lo importo para poder usar el método del filtro deseado.

El programa edges.py recibe como parámetro el nombre del archivo de una imagen, y dos números correspondientes al ancho y alto con que se desea ver la imagen.

Ejemplo:
~$ python edges.py images/snoopy.jpg 400 300

Una vez que se muestra la ventana y después de presionar el botón "Convolution" podremos visualizar lo siguiente.




Referencias:
Matrices de convolución
Matrices para detección de bordes

1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.