1. 程式人生 > >影象處理-離散傅立葉變換-數字影象處理第三版第四章內容

影象處理-離散傅立葉變換-數字影象處理第三版第四章內容

  影象傅立葉變換方法有很多,可以通過空間光調製器輸入影象後在通過平行光照明經過傅立葉變換透鏡進行傅立葉變換,另一個方法就是利用計算機進行傅立葉變換,其中傅立葉變換有兩種演算法一種是DFT還有一種是FFT(快速傅立葉變換)。

  首先我介紹一下影象的定義,影象是怎麼去得到的呢?影象是物體與點擴散函式卷積的結果加上一個噪聲項(具體想了解可以檢視“傅立葉光學"-呂乃光)。

  在這裡我談談離散傅立葉變換的一些問題,以及離散傅立葉變換的MATLAB程式碼。首先談談傅立葉變換,想必大家一聽到傅立葉變換整個人都不好了,傅立葉變換是做什麼的呢,個人的理解就是通過無數個正交的向量去描述一個任意的曲線或者訊號,最簡單的理解就是我們可以通過xy直角座標系通過一個關係建立一個二維曲線,這樣我們就可以通過一個正交的向量去描述這個線上的任意一個點。

  在傅立葉變換中所謂的空間頻率的高頻與低頻分別代表什麼呢?高頻代表的就是影象中灰度突變速度快的地方,說白了就是看起來密集的地方就是高頻,看起來平坦的地方就是低頻。這是最簡單的理解方式。離散傅立葉變換可以處理任意大小的影象,FFT只能處理2^n*2^n大小的影象,當影象大小不夠的時候需要填補空缺的地方。

一下為DFT函式的matlab程式碼,

<span style="font-size:18px;">function [out_dft_image,out_ab_dft_pic]=dft(input_image,mode)
%%  [out_dft_image,out_ab_dft_pic]=dft_test(input_image)     this function can make dft transform
% F(u-M/2,v-N/2)<=>f(x,y)*(-1).^(x+y)   or you can make dft transform like
% F(u,v)<=>f(x,y)
%     input_image:  had batter less than 150*150 large
%     mode:   if mode==1  this function is to do comfortable visable result   
%             else mode=~1 the result maybe make you uncomfortable 
%     out_dft_image: this is the complex matrix it can make the idft and
%                   get the surse image in spetial domain 
%     out_ab_dft_pic: this is the frequency spectrum picture matrix
%     design by baiyinhao 2015.9.28    20:07 Email:
[email protected]
% % 作 者:光電科技協會 2015.9.28 20:07 白銀浩 % %空域變換到頻率域 pic=double(input_image); [u_p,v_p]=size(pic);% F(u,v)中的u,v %f(x,y)*(-1).^(x+y) 即對原圖進行一次運算 if mode==1 for x=1:u_p for y=1:v_p pic(x,y)=pic(x,y)*(-1)^(x+y);%在此處對輸入的pic進行了改變 即變成f(x,y)*(-1).^(x+y) 白 新增 end end %居中傅立葉變換 [x_p,y_p]=size(pic); dft_pic=zeros(u_p,v_p); flag=0; temp1=0; for u=1:u_p for v=1:v_p for x=1:x_p for y=1:y_p temp1=temp1+pic(x,y)*exp(-1j*2*pi*(u*x/u_p+v*y/v_p)); end end dft_pic(u,v)=temp1; temp1=0; end flag=flag+1; sprintf('執行到了影象的第:%d 行',flag) end %輸出傅立葉變換 後的實部虛部 R_dft_pic=real(dft_pic);%求出傅立葉變換後的實部 I_dft_pic=imag(dft_pic);%求出傅立葉變換後的虛部 %傅立葉譜 ab_dft_pic(u_p,v_p)=0; for u=1:u_p for v=1:v_p ab_dft_pic(u,v)=sqrt(R_dft_pic(u,v).^2+I_dft_pic(u,v).^2); end end %最後輸出值 m_dft_pic=max(max(ab_dft_pic)); ab_dft_pic1=ab_dft_pic/m_dft_pic*255; else %正常傅立葉變換 [x_p,y_p]=size(pic); dft_pic=zeros(u_p,v_p); flag=0; temp1=0; for u=1:u_p for v=1:v_p for x=1:x_p for y=1:y_p temp1=temp1+pic(x,y)*exp(-1j*2*pi*(u*x/u_p+v*y/v_p)); end end dft_pic(u,v)=temp1; temp1=0; end flag=flag+1; sprintf('執行到了影象的第:%d 行',flag) end %輸出傅立葉變換 後的實部虛部 白銀浩新增 R_dft_pic=real(dft_pic);%求出傅立葉變換後的實部 I_dft_pic=imag(dft_pic);%求出傅立葉變換後的虛部 %傅立葉譜 ab_dft_pic(u_p,v_p)=0; for u=1:u_p for v=1:v_p ab_dft_pic(u,v)=sqrt(R_dft_pic(u,v).^2+I_dft_pic(u,v).^2); end end %最後輸出值 m_dft_pic=max(max(ab_dft_pic)); ab_dft_pic1=ab_dft_pic/m_dft_pic*255; end out_dft_image=dft_pic; out_ab_dft_pic=uint8(ab_dft_pic1); end</span>

由於執行速度慢,有助於理解,如果有實際用途建議使用FFT。

2016.11.9   12:09

白銀浩    

E-mail:[email protected]

Q    Q:792499178