martes, 28 de mayo de 2013

Compresión de imagenes

En esta ocasión les hablaremos un poco de la manera de comprimir imágenes. Bueno empecemos:


Para poder comprimir la imagen se utilizo la Transformada de coseno discreta (DCT).   Con la transformada nos permite obtener los datos de los pixeles que son de gran importancia y de aquellos que no lo son. Existen  diferentes modelos de DTC para este ejemplo se uso el modelo DCT 2 que es el mas utilizado para matrices en dos dimensiones en este caso una imagen en 2D.

Para poder realizar esto se utilizo se utilizo una herramienta científica para python llamada scipy. Esta librería se puede instalar desde la terminal tecleando lo siguiente:

sudo apt-get install python-scipy

O desde el synaptic buscando por scipy.

Esta librería nos permite sacar directamente la Transformada de coseno discreta al igual que la inversa, además que también nos permite obtener la transformada inversa de la misma para obtener los valores anteriores, además que también nos permite hacer integrales, derivadas y diferentes transformadas de  Fourier.

Información de scipy para diferentes transformadas

Informacion especifica para la transformada de coseno discreta con scipy.  

El algoritmo a seguir es el siguiente:

 1-.Se pasa la imagen original a escala de grises.
 2-.Se divide la imagen por cuadros de 8 pixeles cada uno.
 3-.Se obtiene la transformada de coseno discreta por cada uno de los bloques.

Para obtener la transformada usando la librería primero es necesario llamarla de la siguiente manera:

from scipy.fftpack import dct,idct

Como sabemos dct tiene tres diferentes modalidades, pero como es en 2D usaremos la modalidad dos

  • Llamamos al método DCT, este método necesita varios parámetros.
  • Primero es la matriz.
  • El segundo es el tipo de DCT.
  • el tercero es la longitud de la transformada en este caso dejamos que la librería use la estándar.
  • El cuarto es el eje en que se realizara la transformada
  • Quinta es la normalización.

De esta manera podemos llamarla y obtener la matriz de la transformada:

    b = dct(matriz,type=2,n=None,axis=-1,norm='ortho',overwrite_x=False)

Teniendo encuentra que la matriz que le enviamos es necesario que este entre el rango de -128 a 128, para esto solo restamos cada uno de los valores un 128.

Posteriormente necesitamos cuantificar, para saber que tanta calidad necesitamos reducir a la imagen, para ello se utilizo la matriz por default:




Posteriormente se realiza una división entre la matriz de la transformada y la matriz cuantificadora.

Frec = dct/Q

Obteniendo así una matriz predominante de ceros y diferentes números. Los ceros son las frecuencias importantes, mientras tanto los otros números son aquellos que no son tan importantes y que usaremos para reducir la calidad de la imagen y por consiguiente el tamaño.


Ejemplo de una sola matriz:



Código para obtener la matriz cuantificada:

Código para obtener la matriz cuantificada.




Esto es para sacar solo la matriz cuantificada.

Para el proceso en la imagen se va recorriendo la matriz de pixeles generando matrices de 8 x 8 y estas matrices se procesa de la manera anterior.

Las matrices cuantificadora resultantes son por lo general datos ceros que corresponde a las frecuencias importantes y los datos restantes son los menos importantes, solo es cuestión de utilizar un umbral para que estos datos se modifiquen de tal manera para reducir la calidad e invertir la matriz para general los nuevos pixeles y sustituir en la original para obtener nuestra imagen con menor calidad y menor tamaño en bytes.

Código para invertir la matriz ya con los nuevos valores:

Código para invertir la matriz ya con los nuevos valores.




Aquí unas pruebas

Imagen original (Escala de grises ):
Imagen comprimida:


imagen original(Escala de grises)

Imagen comprimida





Código del método principal:

Código del método principal.

Otro método que se utilizo fue el siguiente:

Se siguió el procedimiento de la misma manera asta obtener la matriz cuantificada.

Para poder modificar los pixeles , se realizo un filtro mediano entre los valores de mayor frecuencia y se sustituyo en todo el bloque de 8  obteniendo los siguientes resultados:

Imagen Original (Escala de grises):

Imagen comprimida:


Como resultado se obtuvo una imagen muy pixeleada pero con una compresión alta por la gran reducción de la calidad.


Click aquí para el código completo


 Referencias:

The JPEG Image Compression Algorithm | John W, O'Brien | 2 de diciembre de 2005 | http://hkn.colorado.edu/resources/latex/jpeg-paper/appm3310-project-final.pdf

 Image Compression Using Burrows wheeler Transfor | Vo si Van | 25 de noviembre 2009 | http://lib.tkk.fi/Dipl/2009/urn100116.pdf

 



2 comentarios:

  1. El reporte está bien; 8 pts. El código carece contribución original; 6 pts por ello.

    ResponderEliminar
  2. El programa es muy interesante, sin embargo tengo conflictos con la libreria scipy ya que no se deja instalar como lo explicaste (uso python 3.6.1)
    Podrías por favor ayudarme para poder ejecutar el proyecto?
    gracias de antemano!!

    ResponderEliminar