要求
可以使用 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圖像如何處理?