viernes, 24 de mayo de 2013

Wavelets Compresión de Imagenes

La entrada de esta semana para laboratorio de Visión computacional consiste en wavelets(onduletas).

Transformada de Wavelet

La transformada de wavelet consiste en comparar la señal con ciertas funciones wavelet, las cuales se obtienen a partir de las wavelet madre. Al realizar las comparaciones obtenemos lo que son los coeficientes.  En la transformada de wavelet se utiliza el DWT(Transformada de Wavelet Discreta). El DWT consiste en escalas y posiciones basadas en potencias de dos. El análisis de wavelets nos permite el poder descomponer la señal en aproximaciones y detalles, a lo que bien se le puede considerar un filtro, que si bien nos generara el doble de datos esto se puede solucionar con diezmado. 

Descomposición de Imágenes


Si se aplica DWT a una imagen lo que se obtiene son cuatro tipos de coeficientes:

  • cA: Coeficiente de aproximación. (LL)
  • cH: Coeficiente de detalles horizontales. (LH)
  • cV: Coeficiente de detalles verticales. (HL)
  • cD: Coeficiente de detalles diagonales. (HH)

Esto se puede dividir en 4 sub-imágenes  el coeficiente de aproximación contendrá la mayor parte de informacion el resto de los coeficientes contendrán detalles. Lo que se logra al descomponer la imagen es, obtener 4 imágenes que nos permiten tener un histograma concentrado lo que facilita la compresión de imágenes.


Compresión de Imágenes

En la actualidad contamos con cámaras fotográficas que toman excelentes fotos de alta resolución  el problema viene a la hora de querer transferirlas, si bien contamos con este tipo de tecnología la transmisión de estos archivos es bastante tardada ademas que también ocupan bastante espacio. Uno de los principios básicos en la compresión de imágenes es el reducir la redundancia espacial y espectral dentro de una imagen. 

Tipos de compresión

  • Con Perdida: Elimina informacion redundante y logra mayores tasas de compresión.
  • Sin Perdida: Es capas de reconstruir la imagen de vuelta al 100%
Entre algunas de las aplicaciones en compresión de imágenes encontramos lo que es el formato JPEG, el cual esta basado en DCT, tomando bloques de 8x8 y aplicando DCT. Una desventaja es que la calidad de la imagen baja ademas de que existe un porcentaje de perdida. Los radios de compresión de JPEG van desde 10:1 hasta 100:1 dependiendo de la imagen. Por otra parte el formato GIF es un formato sin perdida y sus radios de compresión van desde 4:1 hasta 10:1, no mas ya que de aplicar mas podría haber alguna perdida en la imagen.

Retomando un poco el tema principal de la tarea que consiste en experimentar con algún tipo de compresión por medio de wavelets con ayuda de la librería Pywavelets.

Para mas informacion sobre esta librería:


Compresión de Imágenes aplicando DCT y su inversa - 2D.

Para realizar esto se utilizaron funciones de la librería Pywavelets:

Se utilizo la función dwt2() la cual toma como parámetros lo siguiente:

La informacion en este caso debe ser una matriz ya que estamos trabajando con 2D y el tipo de wavelet que utilizaremos, esta librería cuenta con una gran variedad de wavelets en este caso utilizaremos haar.

Lo primero que se hizo fue transformar la imagen que usaríamos a escala de grises.

Después generamos nuestro array, que es el parametro que nos pide la función como datos de entrada.

Después de esto lo que haremos es obtener los 4 coeficientes con la función que mencione anteriormente, lo único que haremos es en otra función enviar como parámetro el array para poder trabajar con el.


Una ves que tenemos los 4 coeficientes lo que se hará es crear una imagen nueva para cada uno de ellos y realizar un filtrado ya que varios resultados nos pueden dar valores negativos o valores que sobre pasen los valores permitidos del rango 0-255 por lo que cualquier valor negativo lo pondremos como 0 y cualquier valor que sobre pase los 255 quedara como 255, cualquier otro valor quedara con el valor que ya tiene asignado simplemente se convertirán a enteros para poder asignarlos a las nuevas imágenes.

Creamos una función para recorrer cada uno de los coeficientes.


Y a partir de aquí recorremos los valores de cada coeficientes y los enviamos al filtro mencionado anteriormente.


Una ves que termina con un coeficiente nos genera su imagen y continua con el siguiente. Para las pruebas utilice la siguiente función  en donde tome en cuenta el coeficiente utilizado, el porcentaje de compresión con base a la imagen original y la nueva creada según el coeficiente, y por ultimo el tiempo que toma en realizar la compresión.

Ejemplos




Imagen Original











Coeficiente de Aproximación




Coeficiente detalles horizontales

Coeficiente detalles verticales
Coeficiente detalles diagonales



Como podemos ver los porcentajes de compresión son bastante altos pero por ende la calidad de la imagen se pierde casi por completo en algunos casos no es notorio casi nada de la imagen original, en cuanto a los tiempos son bastante buenos, aunque bueno también hay que tomar en cuenta que la imagen es de muy mala calidad y eso hace que sea mas fácil y rápido el proceso. Ahora una prueba con una imagen algo mas pesada.







Imagen Original




Coeficiente Aproximación




Coeficiente Detalles Horizontales





Coeficiente Detalles Verticales



Coeficiente Detalles Diagonales



En este caso los tiempos incrementaron un poco mas por el tamaño de la imagen, en cuanto a la tasa de compresión se mantuvo muy alta y en las imágenes de igual forma se puede apreciar. Por ultimo pondré un ejemplo en el cual sucedió algo interesante.






Imagen Original

En.wikipedia.org (2000) Wavelet transform - Wikipedia, the free encyclopedia. [online] Available at: https://en.wikipedia.org/wiki/Wavelet_transform [Accessed: 29 May 2013].


Coeficiente Aproximación



Coeficiente Detalles Horizontales






Coeficientes Detalles Verticales







Coeficiente Detalles Diagonales


En este ejemplo en particular podemos ver que la tasa de compresión no es tan alta como en los otros ejemplos. Y los tiempos son mas altos, a que se debe? si bien la imagen es de menor tamaño que la del ejemplo del paisaje estuve analizándolas de cerca y en el caso de la imagen de lena la calidad es mayor a la del paisaje haciendo algunas pruebas con zoom el paisaje a los pocos zooms se empieza a "pixelear" y perder las formas de la imagen dándome a entender que a pasado ya por algún tipo de compresión en cuanto a la imagen de lena no es de tan alta calidad pero al revisarla de cerca no se pierde tanto como el paisaje.

Reconstrucción-Inversa


Para aplicar DWT inverso se utiliza la función idwt() que ocupa como parámetros los coeficientes que utilizamos a la hora de la compresión y de igual forma damos el wavelet que se utilizo.

Mas informacion:


Ejemplos


Original 9,308 bytes

          
Inversa 7,851 bytes



614,998 bytes
9,050 bytes

Conclusión

En base a los resultados finales a la hora de realizar la inversa, se puede decir que el algoritmo es eficiente ya que se obtiene un alto porcentaje de compresión y sin tener mucha perdida general en la imagen si bien no se mantiene tanta calidad el objetivo era experimentar con la compresión, habría que seguir realizando pruebas y intentar con otros wavelets y métodos para comparar resultados por lo pronto esto seria todo.

Código Completo

El código completo se encuentra en mi repositorio del curso: Respositorio

Referencias

  • En.wikipedia.org (2010) Image compression - Wikipedia, the free encyclopedia. [online] Available at: http://en.wikipedia.org/wiki/Image_compression [Accessed: 24 May 2013].
  • Wasilewski, F. (2006) PyWavelets - Discrete Wavelet Transform in Python — PyWavelets Documentation. [online] Available at: http://www.pybytes.com/pywavelets/ [Accessed: 24 May 2013].
  • Henao González, A. (n.p.) Compresión de imágenes usando la transformada de wavelet y el algoritmo de Huffman. [e-book] Manizales: [Accessed: 24 May 2013].













1 comentario: