Compresión de imágenes usando la DCT


Un mapa de bits o BMP es un conjunto de puntos formando una imagen. Está compuesto por una serie de matrices bidimensionales. Estas matrices contienen los valores que corresponden a la cantidad de color rojo (R), verde (G) y azul (B) que componen a la imágen.

Leemos una imagen, la transformamos a escala de grises y obtenemos las frecuencias que contribuyen.
Luego eliminamos frecuencias y reconstruimos la imagen.

Veamos la implementación en Python de esta idea:

import matplotlib.pyplot as plt         #paquete para graficar
import numpy as np                        #paquete de operaciones matemáticas
from scipy.fftpack import dct, idct   #paquete para transformadas

# leemos la imagen
im = plt.imread('perro.tif')

#fórmula para convertir a escala de grises
R, G, B = im[:,:,0], im[:,:,1], im[:,:,2]
imGrises = 0.2989 * R + 0.5870 * G + 0.1140 * B

# transformada de coseno discreta
def dct2(a):
    return dct(dct(a.T, norm='ortho').T, norm='ortho')

# antitransformada de coseno discreta
def idct2(a):
    return idct(idct(a.T, norm='ortho').T, norm='ortho')

# frecuencias de la imagen
imF = dct2(imGrises)

# frecuencias no nulas
print(np.not_equal(imF,0).sum())

# eliminamos las frecuencias cuyo valor absoluto sea menor que 100
Q=100
imF[abs(imF)<Q]=0.0

# frecuencias no nulas luego
print(np.not_equal(imF,0).sum())

# reconstruimos la imagen con menos frecuencias
im2=idct2(imF)

# nos quedamos con “cuanto” de las frecuencias (1=100%)
cuanto = 0.5
cuantasFrecuencias = int(len(X)*cuanto)  
cuantaEnergia = np.linalg.norm(  X[ indices[range(0,cuantasFrecuencias)] ]  )/np.linalg.norm(X)


# al resto de las frecuencias las ponemos en 0
X[ indices[range(cuantasFrecuencias+1, len(X))] ] =0

# reconstruimos el sonido con las nuevas frecuencias
xx= idct(X, norm="ortho")

# mostramos la imagen
plt.imshow(im2, cmap='gray')
plt.show()


Aquí está el código Matlab del ejemplo descargar.

Resultados



q10

Imagen original a color (RGB).


q0

Imagen original, Q=0 y 100% de los coeficientes de las frecuencias.


q10

Q=10, nos quedamos con el 24% de los coeficientes.


q10

Q=20, nos quedamos con el 9% de los coeficientes.


q10

Q=40, nos quedamos con el 3% de los coeficientes.


q10

Q=60, nos quedamos con el 2% de los coeficientes.


q10

Q=100, nos quedamos con el 0.65% de los coeficientes.


q10

Q=200, nos quedamos con el 0.25% de los coeficientes.


q10

Q=400, nos quedamos con el 0.097% de los coeficientes.


q10

Q=1000, nos quedamos con el 0.025% de los coeficientes.