傅里叶变换的卷积定理 MATLAB
卷积定理指出,空间域中的卷积等于傅里叶变换信号和傅里叶变换填充滤波器的逐点乘法的傅里叶逆变换(与信号的大小相同)。换句话说,卷积定理说空间域中的卷积可以在频域中使用傅里叶变换进行。
离散傅里叶变换 (DFT) 方程:
逆 DFT 方程:
脚步:
- 我们有图像 M 和空间滤波器 S。
- 由于我们需要逐点乘法,因此滤波器大小应等于图像大小。
- 用 0 填充过滤器 S,使其大小等于图像 M。填充过滤器 S'。
- 对 M 和 S' 进行傅里叶变换。
- 对 FT(M) 和 FT(S') 进行逐点乘法
- 对结果进行傅里叶逆变换。
使用的函数:
- imread( ) 内置函数用于读取图像。
- size( ) 内置函数用于获取图像的大小。
- rgb2gray( ) 内置函数用于将 RGB 图像转换为灰度图像。
- one() 内置函数用于创建 1 的矩阵。
- conv2( ) 内置函数用于执行 2D 卷积。
- imtool() 内置函数用于显示图像。
- fft2( ) 内置函数用于执行二维傅里叶变换。
- ifft2( ) 内置函数用于执行二维傅里叶逆变换。
- fftshift( ) 内置函数用于将 FT 的角移动到中心。
- pause() 内置函数用于暂停执行指定的秒数。
例子:
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);
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);
输出:
代码说明:
- 掩码=一个(5,5)。* 1/25;此行创建大小为 [5 5] 的平均滤波器
- convolved_image=conv2(Original_input_image,mask,'same');这条线执行图像和过滤器之间的卷积。
- imtool(Original_input_image,[]);此行显示输入图像。
- imtool(卷积图像,[]);这条线显示卷积图像。
- 暂停(10);此行暂停执行 10 秒。
- imtool 全部关闭;此行关闭所有图像窗口。
- k=imread(“cameraman.jpg”);此行读取图像。
- 卷积(k);此行通过将图像作为参数传递来调用该函数。
例子:
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);
输出:
代码说明:
- 掩码=一个(5,5)。* 1/25;此行创建大小为 [5 5] 的平均滤波器。
- FT_img=fft2(img);此行计算输入图像的 FT。
- FT_mask=fft2(掩码,x,y);此行计算上面创建的平均掩码的 FT。
- pointwise_mul=FT_img.*FT_mask;此行执行 FT 图像和掩码之间的元素乘法。
- convolved_image=ifft2(pointwise_mul);这条线应用反向移动:图像象限沿对角线交换。
- k=imread(“cameraman.jpg”);此行读取图像。
- 卷积定理(k);此行将输入图像传递给函数。
傅里叶变换在空间域中比卷积更快。频域中的计算复杂度较低。在 MATLAB 中,内置函数“conv2”也使用相同的技术来执行卷积。通过使用傅里叶变换将图像和掩码转换为频域。在图像和掩码的逐点乘法上执行逆 FT。
如果我们按照空间域中的数学进行卷积,则需要更多时间,因为它包含更多计算。如果滤波器尺寸小而矩阵大,则计算成本显着增加。