matlab用傅里葉變換實現圖像的低通濾波

要求 

可以使用 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可以嘗試使用其他濾波方式?比如?

思考2rgb圖像如何處理?







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章