24 de mayo de 2013

Procesamiento de Imágenes con PyWavelets

Laboratorio de Visión Computacional
Puntos Extras

Objetivo: Implementar alguna clase de procesamiento de imágenes en Python mediante la Transformada Wavelet usando la herramienta PyWavelets.

Transformada Wavelet


Esta Transformada es eficiente para el análisis local de señales no estacionarias y de rápida transitoriedad y, al igual que la Transformada de Fourier con Ventana, mapea la señal en una representación de tiempo-escala. El aspecto temporal de las señales es preservado.

La diferencia está en que la Transformada Wavelet provee análisis de multiresolución con ventanas dilatadas. El análisis de las frecuencias de mayor rango se realiza usando ventanas angostas y el análisis de las frecuencias de menor rango se hace utilizando ventanas anchas.

Las Wavelets, funciones bases de la Transformada Wavelet, son generadas a partir de una función Wavelet básica, mediante traslaciones y dilataciones. Estas funciones permiten reconstruir la señal original a través de la Transformada Wavelet inversa.

Apliaciones


Dentro de los usos de esta poderosa herramienta podemos nombrar, además del análisis local de señales no estacionarias, el análisis de señales electrocardiográficas, sísmicas, de sonido, de radar, así como también es utilizada para la compresión y procesamiento de imágenes y reconocimiento de patrones.

Instalación de PyWavelets en Ubuntu


Lo primero que tenemos que hacer para poder trabajar con esta herramienta es instalar el paquete necesario para poder importarlo a nuestro script de python.

Se requiere tener instalado Python 2.6 o 2.7 y numpy para poder hacer uso de esta herramienta. Los pasos de instalación son los siguientes.
  1. Descargar desde el repositorio de GitHub el paquete .zip con los archivos fuente listos para instalar, desde el siguiente enlace: https://github.com/nigma/pywt
  2. Abrir un terminal e ir hasta la ruta donde se encuentra la carpeta comprimida.
  3. Descomprimir la carpeta con el nombre pywt-master.zip.
  4. ~$ unzip pywt-master.zip
    
  5. Entrar en el directorio creado.
  6. ~$ cd pywt-master/
    
  7. Ejecutar el archivo setup.py.
  8. ~$ sudo python setup.py install
    
  9. Escribir la contraseña en caso de ser necesario y esperar a la instalación.

Una vez logrado lo anterior podemos empezar a trabajar usando PyWavelets en python. Enseguida veamos un ejemplo de uso de esta herramienta para el procesamiento de imágenes.

Uso de PyWavelets para procesamiento de imágenes


Después de probar con los ejemplos que vienen incluidos en la carpeta comprimida, me causo curiosidad uno de los efectos que se pueden hacer con el uso de Wavelets, ya que este efecto lo había visto antes en una aplicación de iOS para edición de fotos, en donde podías poner una foto tuya como si estuviese pintada sobre un muro, y precisamente en base a esto realice mi programa.

Ejemplo


El script de python recibe desde línea de comandos tres parámetros necesarios y uno opcional. Estos parámetros son la imagen base, la imagen de textura, y el nombre de la imagen de salida, así como de forma opcional escribir como parámetro "sepia" para provocar este efecto en la imagen base de entrada.

Como ejemplo puse la siguiente imagen base de entrada.


La siguiente imagen fue la que use como textura.


Y el resultado de la unión de las dos imágenes es la siguiente.


Un ejemplo más utilizando una foto mía y la siguiente imagen de un muro de ladrillos como textura.


El resultado de la imagen de salida es la siguiente.


Tiempos de procesamiento

Probando con las mismas dos imágenes, se ejecuto el script 20 veces para evaluar el tiempo promedio que tarda el procesamiento de la imagen. Este tiempo no esta contando el tiempo que se tarda en abrir las imágenes ni el guardado de la imagen de salida, sólo es el tiempo que las funciones de PyWavelets necesitan.

Captura de una muestra.


El promedio de tiempo de ejecución para el último ejemplo fue de: 0.311 segundos.

Código



Detección de bordes


Por último les muestro otra de las aplicaciones que tiene PyWavelets. Es la forma en que se pueden obtener los bordes de una imagen. Anteriormente usábamos máscaras de convolución para poder obtener los bordes en una imagen, pero esta es otra forma fácil de hacerlo.

El código es el siguiente.


Y con esto podemos tener resultados como el siguiente.


Faltaría únicamente aplicar binarización para poder resaltar en blanco todos los bordes y dejar en negro todo lo demás.

Referencias:
Filip Wasilewski, "PyWavelets - Discrete Wavelet Transform in Python", 31 de Agosto de 2012. Recuperado el 24 de Mayo de 2013, de http://www.pybytes.com/pywavelets/

UNICEN, "Introducción a la Transformada Wavelet", 2006. Recuperado el 24 de Mayo de 2013, de http://www.exa.unicen.edu.ar/escuelapav/cursos/wavelets/apunte.pdf

1 comentario:

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