Transformada de coseno discreta
Definición de DCT
La transformada de coseno discreta (DCT) representa una imagen como una suma de sinusoides de magnitudes y frecuencias variables. La función dct2
calcula la transformada de coseno discreta (DCT) bidimensional de una imagen. La DCT tiene la propiedad de que, en una imagen típica, la mayor parte de la información visualmente significativa sobre ella se concentra en unos pocos coeficientes de la DCT. Por ello, la DCT se utiliza a menudo en aplicaciones de compresión de imágenes. Por ejemplo, la DCT es la base del estándar internacional del algoritmo de compresión de imágenes con pérdida conocido como JPEG. (El nombre procede del grupo de trabajo que desarrolló el estándar: el Joint Photographic Experts Group.)
La DCT bidimensional de una matriz de M por N A
se define de la siguiente forma.
Los valores Bpq se denominan coeficientes de la DCT de A
. (Tenga en cuenta que los índices de las matrices en MATLAB® siempre comienzan en 1 en lugar de 0; por lo tanto, los elementos de las matrices A(1,1)
y B(1,1)
de MATLAB corresponden a las cantidades matemáticas A00 y B00, respectivamente.)
La DCT es una transformada invertible y su inversa viene dada por
La ecuación de la DCT inversa puede interpretarse en el sentido de que cualquier matriz de M por N A
puede escribirse como una suma de MN funciones de la forma
Estas funciones se denominan funciones base de la DCT. Por tanto, los coeficientes de la DCT Bpq pueden considerarse las ponderaciones aplicadas a cada función base. En el caso de matrices de 8 por 8, las 64 funciones base se ilustran con esta imagen.
Las 64 funciones base de una matriz de 8 por 8
Las frecuencias horizontales aumentan de izquierda a derecha y las verticales, de arriba abajo. La función base de valor constante de la parte superior izquierda suele denominarse función base DC, y el coeficiente de la DCT B00 correspondiente suele denominarse coeficiente DC.
La matriz de transformación de la DCT
Hay dos formas de calcular la DCT utilizando el software Image Processing Toolbox™. El primer método es utilizar la función dct2
. dct2
utiliza un algoritmo basado en FFT para acelerar el cálculo con entradas grandes. El segundo método consiste en utilizar la matriz de transformación de la DCT, que devuelve la función dctmtx
y podría ser más eficiente para entradas cuadradas pequeñas, como de 8 por 8 o 16 por 16. La matriz de transformación de M por M T
viene dada por
En el caso de una matriz de M por M A
, T*A
es una matriz de M por M cuyas columnas contienen la DCT unidimensional de las columnas de A
. La DCT bidimensional de A
se puede calcular como B=T*A*T'
. Como T
es una matriz real ortonormal, su inversa es igual a su traspuesta. Por lo tanto, la DCT inversa bidimensional de B
viene dada por T'*B*T
.
Compresión de imágenes con la transformada de coseno discreta
Este ejemplo muestra cómo comprimir una imagen utilizando la transformada de coseno discreta (DCT). El ejemplo calcula la DCT bidimensional de bloques de 8 por 8 en una imagen de entrada, descarta (pone a cero) todos menos 10 de los 64 coeficientes de la DCT en cada bloque y, a continuación, reconstruye la imagen utilizando la DCT inversa bidimensional de cada bloque. El ejemplo utiliza el método de cálculo de matrices de transformación.
La DCT se utiliza en el algoritmo de compresión de imágenes JPEG. La imagen de entrada se divide en bloques de 8 por 8 o de 16 por 16, y la DCT bidimensional se calcula para cada bloque. A continuación, los coeficientes de la DCT se cuantifican, codifican y transmiten. El receptor JPEG (o lector de archivos JPEG) descodifica los coeficientes de la DCT cuantificados, calcula la DCT inversa bidimensional de cada bloque y, a continuación, vuelve a unir los bloques en una sola imagen. En las imágenes típicas, muchos de los coeficientes de la DCT tienen valores próximos a cero. Estos coeficientes pueden descartarse sin afectar gravemente a la calidad de la imagen reconstruida.
Lea una imagen en el espacio de trabajo y conviértala en clase double
.
I = imread('cameraman.tif');
I = im2double(I);
Calcule la DCT bidimensional de los bloques de 8 por 8 de la imagen. La función dctmtx
devuelve la matriz de transformación de la DCT de N por N.
T = dctmtx(8); dct = @(block_struct) T * block_struct.data * T'; B = blockproc(I,[8 8],dct);
Descarte todos menos 10 de los 64 coeficientes de la DCT de cada bloque.
mask = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data);
Reconstruya la imagen utilizando la DCT inversa bidimensional de cada bloque.
invdct = @(block_struct) T' * block_struct.data * T; I2 = blockproc(B2,[8 8],invdct);
Muestre la imagen original y la imagen reconstruida, una al lado de la otra. Aunque hay cierta pérdida de calidad en la imagen reconstruida, es claramente reconocible, a pesar de que se descartaron casi el 85% de los coeficientes de la DCT.
imshow(I)
figure imshow(I2)