Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Transformación de coseno discreta

Definición de DCT

La transformada de coseno discreta (DCT) representa una imagen como una suma de sinusoides de diferentes magnitudes y frecuencias. La función calcula la transformada de coseno discreta bidimensional (DCT) de una imagen.dct2 El DCT tiene la propiedad que, para una imagen típica, la mayor parte de la información visualmente significativa sobre la imagen se concentra en sólo unos pocos coeficientes de la DCT. Por esta razón, el DCT se utiliza a menudo en aplicaciones de compresión de imagen. Por ejemplo, el DCT es el corazón del algoritmo de compresión de imagen con pérdida estándar internacional conocido como JPEG. (El nombre proviene del grupo de trabajo que desarrolló la norma: el grupo conjunto de expertos fotográficos.)

El DCT bidimensional de una matriz M-by-N se define de la siguiente manera.Un

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 llama el de.DCT coefficientsUn (Tenga en cuenta que los índices de matriz en siempre comienzan en 1 en lugar de 0; por lo tanto, los elementos de matriz y corresponden a las cantidades matemáticasMATLAB®MATLABA(1,1)B(1,1) A00 Y B00, respectivamente.)

El DCT es una transformación invertible, y su inversa es 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 inversa de DCT puede interpretarse en el sentido de que cualquier matriz M-by-N puede escribirse como una suma deUn MN funciones del formulario

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

Estas funciones se denominan de la DCT.basis functions Los coeficientes DCT Bpq, entonces, puede ser considerado como el aplicado a cada función de base.weights Para matrices de 8 por 8, las funciones de base de 64 se ilustran con esta imagen.

Las funciones de base 64 de una matriz de 8 por 8

Las frecuencias horizontales aumentan de izquierda a derecha, y las frecuencias verticales aumentan de arriba a abajo. La función de base de valor constante en la parte superior izquierda se llama a menudo el, y el correspondiente coeficiente DCTDC basis function B00 a menudo se llama el.DC coefficient

La matriz de transformación DCT

Hay dos maneras de computar el DCT usando el software.Image Processing Toolbox™ El primer método es utilizar la función. utiliza un algoritmo basado en FFT para el cálculo rápido con entradas grandes.dct2dct2 El segundo método es utilizar el DCT, que es devuelto por la función y puede ser más eficiente para pequeñas entradas cuadradas, como 8 por 8 o 16 por 16.transform matrixdctmtx La matriz de transformación M-by-M viene dada porT

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

Para una matriz m-by-M, es una matriz M-by-M cuyas columnas contienen el DCT unidimensional de las columnas de.UnT*AUn El DCT bidimensional de puede ser calculado como.UnB=T*A*T' Dado que es una matriz ortoonormal real, su inversa es la misma que su transposición.T Por lo tanto, el DCT bidimensional inverso de es dado por.BT'*B*T

Compresión de imagen con la transformación de coseno discreta

Este ejemplo muestra cómo comprimir una imagen usando la transformada de coseno discreta (DCT). El ejemplo computa el DCT bidimensional de 8-por-8 bloques en una imagen de entrada, descarta (fija a cero) todos menos 10 de los coeficientes DCT 64 en cada bloque, y después reconstruye la imagen usando el DCT inverso bidimensional de cada bloque. El ejemplo utiliza el método de cálculo de matriz de transformación.

DCT se utiliza en el algoritmo de compresión de imagen JPEG. La imagen de entrada se divide en bloques de 8 por 8 o 16 por 16, y se calcula el DCT bidimensional para cada bloque. Los coeficientes DCT son cuantizados, codificados y transmitidos. El receptor JPEG (o el lector de archivos JPEG) descodifica los coeficientes DCT cuantizados, calcula el DCT bidimensional inverso de cada bloque y, a continuación, vuelve a unir los bloques en una sola imagen. Para las imágenes típicas, muchos de los coeficientes DCT tienen valores cercanos a cero. Estos coeficientes pueden desecharse sin afectar seriamente la calidad de la imagen reconstruida.

Lea una imagen en el espacio de trabajo y conviértalo en clase.double

I = imread('cameraman.tif'); I = im2double(I);

Calcule el DCT bidimensional de 8 por 8 bloques en la imagen. La función devuelve la matriz de transformación N-by-N DCT.dctmtx

T = dctmtx(8); dct = @(block_struct) T * block_struct.data * T'; B = blockproc(I,[8 8],dct);

Deseche todo menos 10 de los 64 coeficientes DCT en 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 usando el DCT inverso bidimensional de cada bloque.

invdct = @(block_struct) T' * block_struct.data * T; I2 = blockproc(B2,[8 8],invdct);

Visualice la imagen original y la imagen reconstruida, de lado a lado. Aunque hay cierta pérdida de calidad en la imagen reconstruida, es claramente reconocible, a pesar de que casi el 85% de los coeficientes DCT fueron desechados.

imshow(I)

figure imshow(I2)