Social Icons

twitterfacebookgoogle plusemail

miércoles, 22 de mayo de 2013

Wavelets con Python


En esta entrada hablaremos de wavelets (onduletas), las onduletas son funciones que
siguen el mismo principio que la transformada de Fourier nadamas que
estos se trasladan y dilatan para obtener datos.

Para más información sobre que son las onduletas pueden entrar a esta
página de Wolfram Alpha.

        http://mathworld.wolfram.com/Wavelet.html

En esta ocasión hablaremos sobre transformadas de onduletas
estacionarías (Stationary Wavelets Transform aka SWT) que es un
algorítmo diseñado para superar cierto ruido que hay al momento de
hacer la traducción de la invariancia de la transformada de onduleta
discreta (Discrete Wavelet Transform aka DWT). La traducción de la
invariancia se logra mediante la eliminación de las muestras
inferiores (downsamplers) y muestras superiores en el DWT y tomando
muestras superiores del filtro de los coeficientes por un factor de 2
(j-1) en cada nivel j del algorítmo.

En comparación del DWT y el SWT es que la salida de cada nivel de SWT
contiene el mismo número de muestras como la entrada, por lo que para
una descomposición de los niveles de N hay una redundancia de N en los
coeficientes de las onduletas.

A continuación podemos ver un diagrama de bloques en el que se muestra
la implementación de SWT.

           
                        Referencia:http://en.wikipedia.org/wiki/Stationary_wavelet_transform

En cada nivel los filtro toman las muestras superiores de la versión
anterior.

             

                        Referencia:http://en.wikipedia.org/wiki/Stationary_wavelet_transform


Para más ejemplos pueden visitar esta página:

http://www.wolfram.com/mathematica/new-in-8/wavelet-analysis/stationary-wavelet-transform-(swt).html


¿Qué aplicaciones tiene SWT?

Nos sirve para eliminar el ruido en una señal y para el reconocimiento de patrones en imágenes.

A continuación usaremos una librería en Python llamada PyWavelets que
nos permite realizar dichas funciones de una manera sencilla para
realizar pruebas de teorías ó proyectos. Primero lo que debemos tener
instalado como requisito son las siguientes librerías:

  • Python 2.6 ó 2.7.
  • Numpy.
  • PIL ( se usará solamente para abrir imagenes ).

Una vez que estamos seguros de tenerlas instaladas vamos a descargar
la librería, hacer eso podemos descargarlo directamente del GitHub:
   
                     https://github.com/nigma/pywt

Luego python setup.py install para instalar la librería ó pueden
instalarlo con pip install PyWavelets ó easy_install PyWavelets.

Una vez instalado lo que podemos hacer es importarlo de la                                                            siguiente manera import pywt.

Ahora lo que haremos será probar un demo en el que muestra distintos
niveles de SWT en este caso usaremos 3 niveles en una imagen que
mostrare a continuación:




Y esto sucede cuando es pasado por el primer nivel.



Segundo nivel.



Tercer nivel.



Como podemos observar a como se iban subiendo los niveles en el
SWT se iba cambiando la resolución de imagen, esto ayuda por un
lado la compresión de imágenes y por otro lado una forma de realizar
un filtro para poder tomar un ciertas regiones de la imagen en donde
realmente no nos importa la forma si no la existencia de las mismas
regiones.

Ahora como podemos ver esto es lo que sucede cuando se llega al
nivel 5 de SWT con la imagen antes presentada.



Para realizar lo anterior simplemente usé el código que se encuentra
dentro de la carpeta de demos en el GitHub del proyecto e hice unas
cuantas modificaciones para cambiar los niveles y poder hacer pruebas
de distintas imágenes diferentes de las que vienen por default. Aquí les
dejó algo del código que utilice y modifiqué.



Fuentes:

     SWT
     http://en.wikipedia.org/wiki/Stationary_wavelet_transform

     PyWavelets
     http://www.pybytes.com/pywavelets/

1 comentarios: