要求
可以使用 MATLAB 的傅里叶变换函数和反变换函数。
原理部分
- 低通滤波器指去除图像中的高频成分,而低通滤波器指去除图像中的高频成分。
- 考虑的有三种低通滤波器:理想滤波器、布特沃斯滤波器和高斯滤波器。
- 理想低通滤波器:以原点为圆心,D为半径的圆内, 无衰减地通过所有频率,在圆外截断所有频率。由下面函数确定:
- 具体参见下图:
Matlab函数介绍
- Fft2:二维快速傅里叶变换
- Fftshift:移动零频点到频谱中间
- Ifft2: 二维快速反傅里叶变换
算法思路
对图像进行傅里叶变换(FFT),得到频谱;用理想低通滤波器对频谱滤波;对滤波后的频谱进行反傅里叶变换(IFFT),得到滤波后图像。见下图:
具体编程流程
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('理想低通滤波');
测试结果
分别对高斯噪声和椒盐噪声处理过的图像进行低通滤波,同时对于不同的阈值进行测试,具体测试结果见下图。
图1 高斯噪声阈值50结果图
图2 高斯噪声阈值为30结果图
图3 椒盐噪声阈值50的结果图
图4 椒盐噪音阈值30的结果图
思考1:可以尝试使用其他滤波方式?比如?
思考2:rgb图像如何处理?