martes, 28 de mayo de 2013

Compresión de Imagenes

En esta entrada aplicaremos Wavelets para la compresión de imágenes.

Primero que nada debemos de tener en cuenta del porque debemos comprimir imagenes ya que al hacer esto reducimos la redundancia de los datos de imagen con el fin de poder almacenar o transmitir datos en una forma eficiente.


Los métodos de compresión de datos se clasifican en:

  • Lossless: que es la compresión sin pérdida de información
  • Lossy: que es la compresión con pérdida de información.


Lossless


Los métodos sin compresión sin pérdida de información se caracterizan porque la tasa de compresión que proporciona está limitada por la magnitud de información de la señal original.


Lossy

Los métodos de compresión con pérdida de información logran alcanzar unas tasas de compresión más elevadas a cambio de sufrir una pérdida de información sobre la imagen original.

Transformada de Wavelets

La transformada wavelet consiste en comparar la señal con ciertas funciones wavelet, las cuales se obtienen a partir de las wavelet madre. La comparación permite obtener unos coeficientes que son susceptibles de interpretación y posterior manipulación. En cualquier caso, un requisito básico es la posibilidad de invertir la transformada, recuperando la señal a partir de esos coeficientes wavelet calculados.



En este caso trabajaremos con la Transformada de Wavelets Discreta  (DWT). Se utilizará esta transformada para obtener una nueva representación de la imagen, más apropiada para el proceso de compresión.


El análisis wavelet permite descomponer la señal en aproximaciones y detalles. La DWT aplicada a imágenes proporciona una matriz de coeficientes, conocidos como coeficientes wavelet que son cuatro:
  • aproximaciones
  • detalles horizontales
  • detalles verticales
  • detalles diagonales
El coeficiente de aproximación contiene la mayor parte de energía de la imagen, se refiere a que tiene la información más importante, mientras que los detalles tienen valores próximos a cero.





Utilizaremos la transformada Haar en un análisis de 2 dimensiones, el diagrama siguiente son los pasos para obtener los 4 coeficientes.




Los pasos para la compresión de imagenes son los siguientes:

Imagen de entrada:





1.- Convertir la imagen de entrada en escala de grises (es un método ya utilizado anteriormente donde se suma el valor del r,g y b de cada pixel y se saca su promedio y se asigna el mismo valor a cada r,g,b):










2.- El tercer paso es generar un array de la imagen a escala de grises (la nueva imagen la que se hizo más pequeña, el array es creado del mismo tamaño de la imagen ancho por alto):


3.- Después llamamos a la función coeficientes, que es la función que aplica la DWT (Transformada Discreta de Wavelet) .


4.- Ahora lo que haremos es de cada coeficiente crear su imagen para ver los resultados:
La función set_pixel lo que hace es crear la imagen, pero como cuando se hizo la prueba de imprimir los array que devolvieron los coeficientes se vio que regresaban números negativos y mayores a 255:



Lo que se optó fue que los valores menores a 0 darles un valor de 0 y mayor a 255 dejarles el valor de 255:

5.- Las imagenes se crean:

Coeficiente de aproximación:







Coeficiente detalles horizontales:



Coeficiente detalles verticales:


Coeficiente detalles diagonales:




6.- Después para obtener la imagen comprimir la imagen, solo utilizamos la Transformada Inversa Discreta de Wavelet, pasandole los coeficientes tal cual se obtuvieron y obtenemos la imagen antes de comprimir:






Recuerden que esto solo es la primera compresión pero se pueden realizar mas basandose en el coeficiente de aproximación.



Pruebas:

Aplicando Nivel de Compresión 1:

Imagen de entrada:





Imagen a escala de grises:




 Coeficiente de aproximación:





Coeficiente detalles horizontal:




Coeficiente detalles verticales:



Coeficiente detalles diagonales:




Imagen comprimida:



Diferencias entre la imagen comprimida y la original(imagen en escala de grises):





También vemos los tiempos que se tardó en realizar el primer nivel de la compresión:  




Otra prueba:


Aplicando Nivel de Compresión 1:

Imagen de entrada:





Imagen a escala de grises:




 Coeficiente de aproximación:





Coeficiente detalles horizontal:




Coeficiente detalles verticales:



Coeficiente detalles diagonales:




Imagen comprimida:




Diferencias entre la imagen comprimida y la original(imagen en escala de grises):





También vemos los tiempos que se tardó en realizar el primer nivel de la compresión:  






Referencias:

nigma (2012) pywt. [online] Available at: https://github.com/nigma/pywt/tree/master/demo [Accessed: 24 May 2013].
Wasilewski, F. (2006) DWT and IDWT — PyWavelets Documentation. [online] Available at: http://www.pybytes.com/pywavelets/regression/dwt-idwt.html [Accessed: 24 May 2013].

1 comentario:

  1. Pues, el reporte no está muy claro. En particular en el último ejemplo casi no se logra compresión... Van 5 pts por el reporte.

    No encontré el código completo; revisé la entrada varias veces buscando por una liga. El método es uno que ya existe y no veo que le hayas modificado algo notable. Van 4 pts por el código.

    ResponderEliminar