28 de mayo de 2013

Compresión de Imágenes

Teoría de la Información y Métodos de Codificación
Tarea 6

Para la última tarea se nos pidió hacer un programa que lograra comprimir imágenes. Este programa no debería de usar funciones explícitas para compresión de imágenes, pero era posible usar paquetes para el manejo de las mismas, así como paquetes adicionales como el de Transformadas de Wavelet.

Ya que había estado usando un poco PyWavelets en otra tarea, me decidí por seguir usando esta herramienta para tratar con imágenes, y en este caso usar la transformada haar para comprimirlas.

Realicé un programa que toma como entrada una imagen en formato PNG, la cuál pasa por una función la cuál aplica las funciones necesarias para comprimirla, y esta es comprimida usando varios umbrales. El valor del umbral mientras más pequeño sea, la imagen no se comprimirá mucho, pero la calidad seguirá siendo casi la misma. Si el valor del umbral es grande, la imagen se logra comprimir mucho más, pero ésta pierde calidad.

Prueba 1


Primero tenemos la imagen original la cual se paso como parámetro desde la terminal. Esta imagen tiene un tamaño de 512x384 pixeles, y un tamaño de archivo de 104.5 KB.


Al ejecutar el programa se puede ir viendo el porcentaje de compresión por cada prueba con diferentes umbrales. AL final de la ejecución se muestra la gráfica de estos datos y se imprime el tiempo promedio de ejecución por cada prueba.


Podemos ver que el tiempo promedio para esta imagen fue de 0.4547. En la siguiente imagen podemos ver la gráfica del porcentaje de compresión logrado con el valor que se dio como umbral.


Mientras mayor sea el umbral, mayor la compresión de la imagen, pero este llega a un punto en el que la compresión ya no cambia tan drásticamente como al inicio.

En las siguientes dos imágenes se puede observar la imagen original en comparación con una de las imágenes resultantes con un umbral indicado en el nombre de la imagen que se ve en el título de la ventana. Abriendo la imagen en pantalla completa es posible notar la pérdida en la calidad de la imagen cuando el umbral aplicado fue mayor.

En la parte inferior de cada imagen es posible ver el tamaño en KBs de la imagen.



Prueba 2


Se realizó la misma prueba pero con una imagen de mayor tamaño en dimensiones y peso. Esta imagen es de 1024x769 pixeles con un tamaño de archivo de 234.7 KB.


Podemos observar que al ser una imagen de mayor resolución, se logro llegar a un porcentaje de compresión mayor que en la imagen anterior.


Y como es de esperarse el tiempo de ejecución aumento aproximadamente cuatro veces en relación con la prueba anterior.


En seguida tenemos también dos comparativas de la imagen original con una de las imágenes comprimidas con un cierto umbral.



Algo que se puede notar para imágenes de dimensiones como la anterior, es que la pérdida en la calidad de la imagen es menos notoria.

Código


El código completo es el siguiente. Esta incluido lo necesario para mostrar al final de la ejecución la gráfica de porcentaje contra valor de umbral.


APIs consultadas:
Discrete Wavelet Transform (DWT)
Python Imaging Library (PIL)

Referencias:
Gleb V. Tcheslavski, "Basic Image Compression Methods", 2008. [En línea]. Disponible en: http://ee.lamar.edu/gleb/dip/08-2%20-%20Image%20compression.pdf

Panrong Xiao, "Image Compression by Wavelet Transform", 2001. [En línea]. Disponible en: http://dc.etsu.edu/cgi/viewcontent.cgi?article=1108&context=etd

3 comentarios:

  1. El reporte está muy completo y van 8 pts por ello. En el código me hubiera gustado tener comentarios y alguna contribución original. Van 5 pts por ello.

    ResponderEliminar
  2. Estoy intentando encontrar a Alguien quese llama Ramon Gonzalez REIMON que vive por azuqueca. Quiero crear un grupo de I+D junto con otras personas para poder crear una empresa.

    ResponderEliminar
    Respuestas
    1. Hola Diego, yo soy de México, al parecer no soy el Ramón que buscas. Saludos.

      Eliminar

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