1. 程式人生 > >影象處理(3)頻率域濾波

影象處理(3)頻率域濾波

  1. Fourier變換
    Fourier變換最開始由傅立葉提出,當時為了解決熱力學問題。後來經過發展形成了一套完整的理論,應用在物理學、訊號學等很多方面。如果一個函式滿足絕對可積條件,即:
    這裡寫圖片描述
    因為計算機處理的是離散值,要求對f(x)和F(w)都取樣,這時Fourier變換被稱為離散Fourier變換(DFT),為:
    這裡寫圖片描述
    求出離散Fourier變換需要的計算次數很多,為了降低計算量,可以利用快速Fourier變換方法(FFT),其利用了相位因子對稱性和週期性:
    這裡寫圖片描述
    將f(n)拆分為兩部分,分別計算這兩部分DFT,然後每個部分再進行拆分,直到不能再進行拆分為止。
    這裡寫圖片描述
    由於A(k)和B(k)是關於N/2週期對稱,所以有:
    這裡寫圖片描述

    然後一直不斷進行分割。這樣可以大大降低計算量。
    附上MATLAB程式碼:
function y=FFT_recur(x)

N=length(x);

x1=zeros(1,N/2);
x2=zeros(1,N/2);

y=zeros(1,N);

%split x into two space: odd and even
for j=1:N
   if mod(j,2)==0
       x1(j/2)=x(j);
   else
       x2((j+1)/2)=x(j);
   end
end


if N==2
    y(1)=x(1)+x(2);
    y(2)=x(1
)-x(2); else x_a=FFT_recur(x1); x_b=FFT_recur(x2); for k=1:N/2 y(k)=x_a(k)+exp(-i*2*pi*(k-1)/N)*x_b(k); y(k+N/2)=x_a(k)-exp(-i*2*pi*(k-1)/N)*x_b(k); end end
  1. 二維影象頻率濾波
    頻率域濾波方法有很多,主要是濾除某種頻率成分,從濾除成分來看分為低通濾波、高通濾波、帶通濾波等,技術手段上看有理想低通濾波、ButterWorth濾波,高斯濾波等。
    現在分別討論這三種濾波器。低通濾波器可以表示為在某一個頻率範圍是1,而之外為0。對於一幅影象,其中心頻率位於DFT變換函式的矩形中心,即F(k,l)中心(N/2,M/2),則理想低通表示為:
    這裡寫圖片描述

    對於理想低通濾波器,其Fourier反變換函式為sinc函式,其圖形如下
    這裡寫圖片描述
    圖1 理想低通濾波器
    低通濾波器頻率域相乘,在空間域為卷積,上述函式在和DFT變換前函式卷積時,其邊瓣會造成振鈴。
    為了消除邊瓣的波動,產生了ButterWorth和高斯濾波,當然也是因為理想低通濾波無法在物理上實現。而ButterWorth濾波器為
    這裡寫圖片描述
    MATLAB實現程式碼如下:
function ifft_image=filter_frequency(image,mode,mode_parameter)

%fourier transformation
fft_image=fft2(image);
fft_image=fftshift(fft_image);

[row,col]=size(fft_image);
filter_temp=zeros(row,col);

%Low Pass filter
if strcmp(mode,'LowPass')

    for i=1:row
        for j=1:col
            if sqrt((i-row/2)^2+(j-col/2)^2)<=mode_parameter
                filter_temp(i,j)=1;
            else
                filter_temp(i,j)=0;
            end
        end
    end

%Butter Worth filter with n=2    
elseif strcmp(mode,'ButterWorth')
    for i=1:row
        for j=1:col
            filter_temp(i,j)=1/(1+(sqrt((i-row/2)^2+(j-col/2)^2)/mode_parameter)^4);
        end
    end

%gaussion filter
elseif strcmp(mode,'Gaussion')
    for i=1:row
        for j=1:col
            filter_temp(i,j)=exp(-((i-row/2)^2+(j-col/2)^2)/(2*mode_parameter^2));
        end
    end

end

fft_image=fft_image.*filter_temp;

fft_image=ifftshift(fft_image);
ifft_image=ifft2(fft_image);
ifft_image=abs(ifft_image);
  1. 結果
    這裡寫圖片描述
    圖2 (a)原始1024x1024影象 (b)加入了週期噪聲
    這裡寫圖片描述
    圖3 低通濾波 (a)D0=100 (b)D0=300
    這裡寫圖片描述
    圖4 ButterWorth濾波 (a)D0=100 (b)D0=300
    這裡寫圖片描述
    圖5 高斯濾波 (a)D0=100 (b)D0=300