Transformada inversa de coseno 2-D en MATLAB: Restaurar imágenes desde datos de frecuencia
La Transformada Inversa de Coseno, a menudo denotada como ICT o IDCT, es una operación matemática que invierte el proceso de la Transformada de Coseno. Es particularmente útil en procesamiento de señales e imágenes para reconstruir señales o imágenes desde sus representaciones en el dominio de la frecuencia.
En el contexto de señales o imágenes 2-D, la Transformada Inversa de Coseno 2-D (2-D ICT o 2-D IDCT) convierte una matriz de coeficientes de coseno (representando el contenido de frecuencia de la señal o imagen) de vuelta al dominio espacial, produciendo la señal o imagen original.
La Transformada Inversa de Coseno 2-D en MATLAB se usa para convertir una matriz de valores de coseno en una imagen del dominio espacial. Es la operación inversa de la Transformada de Coseno 2-D y se usa comúnmente en procesamiento y compresión de imágenes. La función idct2 se usa para realizar la Transformada Inversa de Coseno 2-D en MATLAB.
Transformada inversa discreta de coseno 2-D
En MATLAB, la función idct2 se usa para realizar la Transformada Inversa de Coseno 2-D. Toma una matriz de coeficientes de coseno como entrada y devuelve la representación del dominio espacial de la señal o imagen. El resultado es una imagen reconstruida que puede mostrarse o procesarse ulteriormente.
La Transformada Inversa de Coseno es crucial en varias aplicaciones, incluyendo compresión de imágenes (ej., en compresión JPEG), reconstrucción de imágenes y tareas de procesamiento de señales donde las señales o imágenes necesitan transformarse de vuelta a su forma original después de manipulación en el dominio de la frecuencia.
Sintaxis
B = idct2(A) B = idct2(A,m,n) B = idct2(A,[m n])
Explicación de la sintaxis
B = idct2(A) — Calcula la Transformada Inversa Discreta de Coseno Bidimensional (IDCT) de la matriz A, devolviendo el resultado en la matriz B. Esta operación reconstruye efectivamente la imagen del dominio espacial desde su representación en el dominio de la frecuencia en A.
B = idct2(A, m,n) — calcula la Transformada Inversa Discreta de Coseno Bidimensional (IDCT) de la matriz A y especifica el tamaño de la matriz de salida B como m-por-n. Esta operación reconstruye efectivamente la imagen del dominio espacial desde su representación en el dominio de la frecuencia en A, redimensionándola a las dimensiones especificadas m-por-n.
B = idct2(A, [m,n]) — calcula la Transformada Inversa Discreta de Coseno Bidimensional (IDCT) de la matriz A y redimensiona la matriz de salida B para tener m filas y n columnas. Esta operación reconstruye la imagen del dominio espacial desde su representación en el dominio de la frecuencia en A, redimensionándola a las dimensiones especificadas [m n].
Veamos algunos ejemplos para la transformada inversa discreta de coseno 2-D
Ejemplo 1: Eliminar altas frecuencias de imagen usando la función idct2()
El código que tenemos es:
img = imread('autumn.tif'); % Convertir a escala de grises si es necesario if size(img, 3) == 3 img = rgb2gray(img); end % Calcular 2-D DCT dct_img = dct2(double(img)); % Establecer umbral para eliminar altas frecuencias (ej., mantener solo los primeros 50 coeficientes) threshold = 50; dct_img_thresh = dct_img; dct_img_thresh(threshold+1:end, :) = 0; dct_img_thresh(:, threshold+1:end) = 0; % Calcular la inversa 2-D DCT para obtener la imagen filtrada filtered_img = uint8(idct2(dct_img_thresh)); % Mostrar la imagen original y filtrada figure; subplot(1, 2, 1); imshow(img); title('Imagen Original'); subplot(1, 2, 2); imshow(filtered_img); title('Imagen Filtrada'); En el ejemplo:
- La función imread se usa para leer la imagen desde un archivo ('autumn.tif' en este caso) y almacenarla en la variable img.
- Si la imagen es a color (es decir, tiene tres canales para rojo, verde y azul), se convierte a escala de grises usando la función rgb2gray. Esto se hace porque la 2-D DCT se aplica típicamente a imágenes en escala de grises.
- La función dct2 calcula la 2-D DCT de la imagen. El resultado se almacena en la variable dct_img. La DCT representa la imagen en el dominio de la frecuencia, donde los componentes de alta frecuencia corresponden a cambios rápidos en valores de píxeles.
- Se elige un valor umbral para determinar qué coeficientes DCT mantener y cuáles descartar. En este ejemplo, elegimos mantener solo los primeros 50 coeficientes (en una imagen de 256x256, estos coeficientes representan las frecuencias más bajas). Los coeficientes de alta frecuencia (aquellos más allá del umbral) se establecen en cero.
- La función idct2 calcula la inversa 2-D DCT de los coeficientes DCT modificados (dct_img_thresh). Esta operación reconstruye efectivamente la imagen del dominio espacial desde su representación en el dominio de la frecuencia. El resultado se almacena en filtered_img.
- Finalmente, la imagen original y la imagen filtrada se muestran lado a lado usando la función imshow. La imagen original se muestra a la izquierda, y la imagen filtrada (con altas frecuencias eliminadas) se muestra a la derecha.
Al ejecutar, la salida que obtenemos es:
Ejemplo 2: Redimensionar imagen usando B = idct2(A, m,n)
El código que tenemos es:
% Leer la imagen img = imread('autumn.tif'); % Convertir la imagen a escala de grises if size(img, 3) == 3 img = rgb2gray(img); end % Calcular la 2-D DCT de la imagen dct_img = dct2(double(img)); % Redimensionar la matriz de coeficientes DCT (representación en dominio de frecuencia) a un tamaño menor % Redimensionémosla a la mitad del tamaño original new_size = size(img) / 2; dct_resized = imresize(dct_img, new_size); % Calcular la inversa 2-D DCT para obtener la imagen redimensionada resized_img = uint8(idct2(dct_resized, size(img, 1), size(img, 2))); % Mostrar la imagen original y redimensionada subplot(1, 2, 1); imshow(img); title('Imagen Original'); subplot(1, 2, 2); imshow(resized_img); title('Imagen Redimensionada usando 2-D IDCT'); En el ejemplo tenemos:
- La función imread se usa para leer la imagen desde un archivo ('autumn.tif' en este caso) y almacenarla en la variable img.
- Si la imagen es a color (es decir, tiene tres canales para rojo, verde y azul), se convierte a escala de grises usando la función rgb2gray. Este paso es importante porque la 2-D DCT se aplica típicamente a imágenes en escala de grises.
- La función dct2 calcula la 2-D DCT de la imagen. El resultado se almacena en la variable dct_img. La DCT representa la imagen en el dominio de la frecuencia, donde diferentes frecuencias de la imagen son representadas por diferentes coeficientes.
- Para redimensionar la imagen, redimensionamos la matriz de coeficientes DCT (dct_img) a un tamaño menor. Esto se hace usando la función imresize, especificando el nuevo tamaño como la mitad del tamaño original (new_size = size(img) / 2). Esto reduce efectivamente la representación en el dominio de la frecuencia de la imagen.
- La función idct2 calcula la inversa 2-D DCT de los coeficientes DCT redimensionados (dct_resized). Esta operación reconstruye efectivamente la imagen redimensionada del dominio espacial desde su representación redimensionada en el dominio de la frecuencia.
- Finalmente, la imagen original y la imagen redimensionada se muestran lado a lado usando la función imshow. La imagen original se muestra a la izquierda, y la imagen redimensionada (obtenida usando 2-D IDCT) se muestra a la derecha.
La salida al ejecutar es:
Ejemplo 3: Redimensionar una matriz usando Transformada Inversa Discreta de Coseno 2-D (IDCT)
El código que tenemos es el siguiente:
% Crear una matriz de muestra A A = [ 10, 20, 30, 40; 50, 60, 70, 80; 90, 100, 110, 120; 130, 140, 150, 160 ]; % Mostrar la matriz original A disp('Matriz Original A:'); disp(A); % Calcular la 2-D IDCT de A y redimensionarla a una matriz 3x2 B = idct2(A, [3, 2]); % Mostrar la matriz redimensionada B disp('Matriz Redimensionada B (3x2):'); disp(B); En este ejemplo, creamos una matriz de muestra 4x4 A. Luego aplicamos la 2-D IDCT a A y redimensionamos el resultado a una matriz 3x2 [m, n] = [3, 2]. La matriz redimensionada B se muestra después de la transformación.
La salida que obtenemos es la siguiente:
Matriz Original A: 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 Matriz Redimensionada B (3x2): 122.0957 -11.9692 -97.4491 1.6910 12.0957 -1.9692
MATLAB
- Dominando Strings en MATLAB: Creación, Manipulación y Funciones
- Archivos M de MATLAB: Scripts y Funciones para Programación Potente
- Funciones en MATLAB: Definición, Workspace, Entradas y Salidas
- Derivadas Simbólicas en MATLAB con el Comando diff
- Gráficos de Funciones en MATLAB: Guía Paso a Paso
- Toma de Decisiones en MATLAB: Guía Completa de Estructuras Condicionales
- Guía MATLAB: Cálculo eficiente de derivadas de polinomios
- Transformadas en MATLAB: Laplace, Fourier y FFT
- Matrices en MATLAB: Creación, Referenciación y Manipulación de Datos
- Vectores en MATLAB: Conceptos Básicos de Vectores Fila y Columna
- Domine la POO en MATLAB: Construyendo código robusto y reutilizable con clases y objetos