Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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.

Bpq=αpαqm=0M1n=0N1Amncosπ(2m+1)p2Mcosπ(2n+1)q2N,0pM10qN1αp={1/M,2/M,p=01pM1αq={1/N,2/N,q=01qN1

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

Amn=p=0M1q=0N1αpαqBpqcosπ(2m+1)p2Mcosπ(2n+1)q2N,0mM10nN1αp={1/M,2/M,p=01pM1αq={1/N,2/N,q=01qN1

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

αpαqcosπ(2m+1)p2Mcosπ(2n+1)q2N,   0pM10qN1

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

64 basis functions are arranged in an 8-by-8 grid. As the row and column indices in the grid increase, the basis functions have higher vertical and horizontal frequencies, respectively.

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

Tpq={1M2Mcosπ(2q+1)p2Mp=0,1pM1,0qM10qM1

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 contains an axes object. The axes object contains an object of type image.

figure
imshow(I2)

Figure contains an axes object. The axes object contains an object of type image.