jueves, 23 de mayo de 2013

Labo Visión. Wavelets. Compresión de imágenes.

Que tal gente, esta entrada es correspondiente al laboratorio de visión computacional, se habla de waveletes y su aplicación en el procesamiento de imágenes.

Compresión y transmisión de imágenes.

Actualmente los dispositivos para captura de imágenes generan cada vez imágenes con mejor calidad, lo cual permite un mejor procesamiento de las mismas y obtener resultados mas exactos, el inconveniente llega a la hora la hora de almacenamiento o transmisión de dichas imágenes, ya que a imágenes de mayor calidad, imágenes de mayor peso. Debido a esto, es necesario emplear mecanismos de compresión ya sea para almacenar o transmitir este tipo de información.

Existen métodos para comprimir imágenes donde no se pierde información  y existen métodos donde si se pierde información, por información me refiero a detalle en la imagen, el proceso que se va a estudiar si genera algo de perdida de detalle durante el proceso, pero el nivel de compresión resultante es considerablemente bueno.

La implementación o no de la compresión dependerá del fin del proceso, en ocasiones se debe priorizar la velocidad de transmisión, un ejemplo donde se puede ver esto fácilmente es cuando vas a google y quieres ver una imagen en su tamaño completo, inicialmente se ve algo pixeleada, pero no pasan mas de unos segundo cuando lo imagen ya se observa perfectamente bien, esto es porque los servidores envían la versión compresa de la imagen, y posteriormente mandan el detalle, visualmente parece que carga rápido, pero realmente hace la carga en dos pasos para evitar verse lento con imágenes grandes.

Wavelets.

La transformada wavelet básicamente es una función que es valida para ciertas condiciones especificas, es una variante de las transformadas de fourier, pero dado su modelo matemático esta siendo lleva a mucho campos reinventando la forma de aplicación en relación a las transformadas de fourier, ahora se estudiara como se aplica esta transformada en la compresión de imágenes.

Como funciona?

Supongamos que tenemos una matriz de 8 x 8 como la siguiente:

El proceso se divide en dos pasos, la matriz se debe procesar por renglones generando una nueva matriz, misma que se procesara de la misma manera, pero ahora por columnas, el resultado final, sera la matriz de la transformada haar wavelet.

Para cada renglón, lo que se hace es:
Se agrupan por pares de valores, para cada par se busca el promedio de ambos, y se almacena, entonces , si tenemos 8 valores, la siguiente fila tendrá esos 4 promedios al inicio, para completar el largo de la fila, lo que se hace es obtener la diferencia del promedio respecto al primer valor que genero dicho promedio, con esos 4 valores se complementa la fila, la fila resultante se vuelve a procesar de la misma manera, realmente la cada renglón se procesa hasta obtener en la fila resultante un solo valor de promedio, la cantidad de veces a procesar esta regida por la potencia de dos a la que es igual el numero de elementos de la fila, para el primer renglón de la imagen anterior, el resultado del proceso seria el siguiente:

Entonces, una vez obtenida la matiz resultante por renglón  se repite el mismo proceso pero ahora procesando por columnas, lo cual nos generara una matriz con los valores comunes empaquetados, ademas de generar los valores de detalle, mismos que son procesados para lograr la compresión.

Compresión.

La compresión es bastante sencilla, lo que se hace es evaluar la matriz resultante respecto a un valor umbral, lo que se trata de hacer, es quitar detalle de la imagen cuyo peso especifico este entre el rango del umbral, los valores se igualan a cero, al hacer esto la imagen resultante perderá peso en k's porque el peso lo generan todos los valores distintos de cero contenidos en la imagen, es cuestión de jugar con el valor umbral y ver que tanto se presta la imagen para hacerla mas ligera, si perder demasiado detalle, por lógica, entre mayor sea el umbral, mayor sera la compresión obtenida, pero también sera mayor el detalle perdido.

Una vez que el detalle fue umbralizado, se aplica la transformada inversa, y el valor resultante sera la matriz de nuestra imagen resultante.

Código.

Uno de los aspectos mas fuertes de python es que tiene una cantidad inmensa de módulos, para esta tarea, se nos facilita la vida al hechar mano de dos librerías, se explotara la velocidad de procesamiento de numpy en conjunto con la librería pywavelets, la cual es capaz de realizar los cálculos de este tipo de transformadas de forma bastante rápida, lo cual nos permite enfocarnos directamente a la implementación.

Bien, el flujo del código es el siguiente:
  • Se carga la imagen.
  • Se aplica filtro escala de grises.
  • Se genera un array de numpy con los valores de cada pixel de la imagen.
  • Se obtienen las matrices resultantes y de detalle aplicando la transformada haar wavelet a la matriz con la ayuda de la pywavelets.
  • Se toman las matrices de detalle resultantes y se procesan con numpy para discriminar todos los valores que caen dentro del umbral establecido, convertiendolos a cero.
  • se genera un nuevo conjunto de coeficientes con las nuevas matrices de detalle y se aplica la transformada inversa para obtener los nuevos valores de la imagen.
  • Se procesa el array resultante para generar la imagen de salida en base sus valores.
  • Se ejecuta el proceso de evaluación, para comparar los pesos de imagen original y resultante y determinar el porcentaje de compresión obtenido.
El código no esta del todo limpio, pero las lineas comentarizadas sirven para ver y entender un poco mejor todo lo que hace esta librería por abajo antes de arrojarnos el resultado.


Pruebas.
Para las pruebas se ejecuto el script con diversos umbrales, para estudiar el grado de compresión y la calidad de imagen resultante, cabe mencionar que las imágenes tienen que ser de dimensiones potencias de dos.

Prueba 1.
Resultados.
Maximizar la imagen para apreciar como decrece la calidad de la imagen de salida conforme aumenta el umbral.


En las siguientes gráficas se observan las matrices de detalle para cada umbral, se logra apreciar como va disminuyendo el detalle conforme aumenta aumenta el umbral.

Detalle original.


Detalle umbralizado a 10.


Detalle umbralizado a 50.



Prueba 2.

Se puede observar, que para aun y cuando la imagen es del mismo tamaño a la anterior (256, 256) los resultado obtenido son menos eficientes respecto a la prueba anterior.


Aquí se aprecia un poco mas la perdida de detalle, esto porque se manejan umbrales mayores. Aun así  el nivel de compresión no es bueno respecto a la prueba anterior. depende también del nivel de detalle de la imagen original.

Bien, por mi parte es todo.

Saludos!

Fuentes:
http://gtwavelet.bme.gatech.edu/wp/kidsA.pdf
http://www-scf.usc.edu/~hbalan/wavelets.pdf
http://www.iberchip.net/VIII/docs/posters/p13.pdf
http://www.pybytes.com/pywavelets/regression/dwt-idwt.html

1 comentario: