要求 

可以使用 MATLAB 的傅里叶变换函数和反变换函数。

原理部分


  • 低通滤波器指去除图像中的高频成分,而低通滤波器指去除图像中的高频成分。
  • 考虑的有三种低通滤波器:理想滤波器、布特沃斯滤波器和高斯滤波器。
  • 理想低通滤波器:以原点为圆心,D为半径的圆内, 无衰减地通过所有频率,在圆外截断所有频率。由下面函数确定:
  • 具体参见下图:

Matlab函数介绍



  • Fft2:二维快速傅里叶变换
  • Fftshift:移动零频点到频谱中间
  • Ifft2: 二维快速反傅里叶变换 


算法思路

对图像进行傅里叶变换(FFT),得到频谱;用理想低通滤波器对频谱滤波;对滤波后的频谱进行反傅里叶变换(IFFT),得到滤波后图像。见下图:

python基于傅里叶变换的频率域滤波的方法图像去噪 傅里叶变换滤波matlab_傅里叶变换



具体编程流程


1) 原始正常的图像,加噪处理,得到img_noise;

2) img_noise图像进行傅里叶变换,得到频谱;

3) 对得到的频谱进行理想低通滤波;

4) 对滤波后的频谱进行反傅里叶变换,得到滤波后图像

源码


%傅里叶变换的低通滤波
%低通滤波选用理想低通滤波方式
% d0 是阈值,可以修改,初步设定为50
% 
clear all;
close all;
clc;

img_origin=imread('C:\Users\yytang\Desktop\lena.jpg');
img_origin=rgb2gray(img_origin);
d0=50;  %阈值
img_noise=imnoise(img_origin,'salt'); % 加椒盐噪声
%img_noise=imnoise(img_origin,'gaussian'); % 加高斯噪声
img_f=fftshift(fft2(double(img_noise)));  %傅里叶变换得到频谱
[m n]=size(img_f);
m_mid=fix(m/2);  %是不是可以有其他取整方式?
n_mid=fix(n/2);  
img_lpf=zeros(m,n);
for i=1:m
    for j=1:n
        d=sqrt((i-m_mid)^2+(j-n_mid)^2);   %理想低通滤波,求距离
        if d<=d0
            h(i,j)=1;
        else
            h(i,j)=0;
        end
        img_lpf(i,j)=h(i,j)*img_f(i,j);  
    end
end

img_lpf=ifftshift(img_lpf);    %反傅里叶变换
img_lpf=uint8(real(ifft2(img_lpf)));  %取实数部分

subplot(2,2,1);imshow(img_origin);title('原图');
subplot(2,2,2);imshow(img_noise);title('噪声图');
subplot(2,2,3);imshow(img_lpf);title('理想低通滤波');


测试结果


分别对高斯噪声和椒盐噪声处理过的图像进行低通滤波,同时对于不同的阈值进行测试,具体测试结果见下图。

python基于傅里叶变换的频率域滤波的方法图像去噪 傅里叶变换滤波matlab_低通滤波_02



图1 高斯噪声阈值50结果图

python基于傅里叶变换的频率域滤波的方法图像去噪 傅里叶变换滤波matlab_低通滤波器_03



图2 高斯噪声阈值为30结果图

python基于傅里叶变换的频率域滤波的方法图像去噪 傅里叶变换滤波matlab_傅里叶变换_04


图3 椒盐噪声阈值50的结果图

python基于傅里叶变换的频率域滤波的方法图像去噪 傅里叶变换滤波matlab_数字图像_05


图4 椒盐噪音阈值30的结果图


思考1:可以尝试使用其他滤波方式?比如?

思考2:rgb图像如何处理?