Teorema de convolución para la transformada de FourierMATLAB

Un teorema de convolución establece que la convolución en el dominio espacial es igual a la transformación inversa de Fourier de la multiplicación puntual de la señal transformada de Fourier y el filtro acolchado transformado de Fourier (del mismo tamaño que el de la señal). En otras palabras, el teorema de convolución dice que la convolución en el dominio espacial se puede llevar a cabo en el dominio de la frecuencia utilizando la transformación de Fourier.

Ecuación para la Transformación Discreta de Fourier (DFT):

X(k) = \sum_{n=0}^{N-1}\ x[n].e^{\frac{-j2\pi kn}{N}}

Ecuación para DFT inversa:

x(n) = \sum_{k=0}^{N-1}\ X[k].e^{\frac{j2\pi kn}{N}}

 

 

Pasos:

  • Tenemos la imagen M y el filtro espacial S.
  • Dado que necesitamos una multiplicación puntual, el tamaño del filtro debe ser igual al tamaño de la imagen.
  • Rellene el filtro S con 0 para que su tamaño sea igual al de la imagen M. Rellene el filtro S’.
  • Tome la Transformación de Fourier de M y S’.
  • Tome la multiplicación puntual de FT(M) y FT(S’)
  • Tome la Transformación de Fourier inversa del resultado.

Función utilizada:

  • La función incorporada imread() se usa para leer la imagen.
  • La función incorporada size( ) se usa para obtener el tamaño de la imagen.
  • La función incorporada rgb2gray( ) se utiliza para convertir una imagen RGB en una imagen en escala de grises.
  • la función incorporada ones() se usa para crear una array de 1s.
  • La función incorporada conv2() se utiliza para realizar la convolución 2D.
  • La función incorporada imtool() se usa para mostrar imágenes.
  • La función incorporada fft2() se utiliza para realizar la Transformación de Fourier 2D.
  • La función incorporada ifft2() se utiliza para realizar la Transformación de Fourier 2D inversa.
  • La función incorporada fftshift() se usa para cambiar las esquinas de FT al centro.
  • La función incorporada pause() se usa para pausar la ejecución durante segundos específicos.

Ejemplo:

Matlab

% MATLAB code for Convolution in Spatial Domain:
% CONVOLUTION IN SPATIAL DOMAIN
function f=Convolution(img)
  
%convert into grayscale if not.
[x,y,z]=size(img);
if(z==3)
    img=rgb2gray(img);
end
  
% Define averaging filter
mask=ones(5,5).*1/25;
Original_input_image=double(img);
convolved_image=conv2(Original_input_image,mask,'same');
  
% Display images.
imtool(Original_input_image,[]);
imtool(convolved_image,[]);
  
% Close all image tabs after 10s.
pause(10);
imtool close all;
end
  
% Utility code
k=imread("cameraman.jpg");
Convolution(k);

Producción:

Explicación del código:

  • máscara=unos(5,5).*1/25; Esta línea crea el filtro promedio de tamaño [5 5]
  • convolved_image=conv2(Original_input_image,mask,’same’); Esta línea realiza la convolución entre imagen y filtro.
  • imtool(Imagen_de_entrada_original,[]); Esta línea muestra la imagen de entrada.
  • imtool(imagen_convolucionada,[]); Esta línea muestra una imagen convolucionada.
  • pausa(10); Esta línea detiene la ejecución durante 10 segundos.
  • imtool cerrar todo; Esta línea cierra todas las ventanas de imágenes.
  • k=imread(“camarógrafo.jpg”); Esta línea lee la imagen.
  • Convolución (k); Esta línea llama a la función pasando la imagen como parámetro.

Ejemplo:

Matlab

% MATLAB code for Convolution in Frequency Domain:
% CONVOLUTION THEOREM FOR FOURIER TRANSFORMATION
function f=Convolution_Theorem(img)
  
% Convert into grayscale if not.
[x,y,z]=size(img);
if(z==3)
    img=rgb2gray(img);
end
  
% Define averaging filter
mask=ones(5,5).*1/25;
FT_img=fft2(img);
FT_mask=fft2(mask,x,y);
  
Fourier_Transformed_image=abs(log(fftshift(FT_img)));
Fourier_Transformed_mask=abs(log(fftshift(FT_mask)));
imtool(Fourier_Transformed_image,[]);
imtool(Fourier_Transformed_mask,[]);
  
pointwise_mul=FT_img.*FT_mask;
convolved_image=ifft2(pointwise_mul);
imtool(convolved_image,[]);
  
% Close all image tabs after 15s.
pause(15);
imtool close all;
end
  
% UTILITY CODE
k=imread("cameraman.jpg");
Convolution_Theorem(k);

Producción:

Explicación del código:

  • máscara=unos(5,5).*1/25; Esta línea crea el filtro promedio de tamaño [5 5].
  • FT_img=fft2(imagen); Esta línea calcula el FT de la imagen de entrada.
  • FT_mask=fft2(máscara,x,y); Esta línea calcula el FT de la máscara de promediación creada anteriormente.
  • pointwise_mul=FT_img.*FT_mask; Esta línea realiza la multiplicación por elementos entre la imagen FT y la máscara.
  • convolved_image=ifft2(pointwise_mul); Esta línea aplica desplazamiento inverso: los cuadrantes de la imagen se intercambian en diagonal.
  • k=imread(“camarógrafo.jpg”); Esta línea lee la imagen.
  • Convolución_Teorema(k); Esta línea pasa la imagen de entrada a la función.

La transformación de Fourier es más rápida que la convolución en el dominio espacial. La complejidad del cálculo es menor en el dominio de la frecuencia. En MATLAB, la función incorporada «conv2» también utiliza la misma técnica para realizar la convolución. La imagen y la máscara se convierten al dominio de la frecuencia mediante la Transformación de Fourier. La FT inversa se realiza sobre la multiplicación puntual de imagen y máscara. 

Si realizamos la convolución según las matemáticas en el dominio espacial, tomaría más tiempo ya que incluye más cómputo. Si el tamaño del filtro es pequeño y la array es grande, el costo computacional aumenta significativamente. 

Publicación traducida automáticamente

Artículo escrito por pintusaini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *