matlab的傅利葉變換

2021-09-28 18:32:05 字數 4009 閱讀 5967

影象變換:    

在 matlab 中,一般用二元函式 f(x, y) 作為影象的數學表示。  f( x, y) 表示在特定點f( x, y) 處的函式值,表示影象在該點相應的顏色強度或者灰度。所謂影象變換就是指把影象轉換為另一種數學表示方式的操作。

在影象處理技術中,影象的正交變換技術有著廣泛的應用,是影象處理的重要工具。通過變換影象,改變影象的表示域及表示資料,可以給後繼工作帶來極大的方便。例如,傅利葉變換可使處理分析在頻域中進行,使運算簡單;而離散余弦變換(dct)可使能量集中在少數資料上,從而實現資料壓縮,便於影象傳輸和儲存。

1.傅利葉變換的基本概念

假設  f (m,n) 是乙個包含兩個離散空間變數 m 和 n 的函式,則該函式的二維傅利葉變換的定義如下:

式中, ω 1 和 ω 2 為頻域變數,其單位為弧度/取樣單元。通常函式 f( ω 1 ,  ω 2 )稱為函式 f (m, n)的頻域表示。f( ω 1 ,  ω 2 )是復變函式,其變數 ω 1 和 ω 2 的週期均為 2π。因為這種週期性的存在,所以通常在影象顯示時,這兩個變數的取值範圍為-pi<=ω 1,ω 2<=pi.

傅利葉反變換定義如下:

簡單地說,該方程說明 f (m, n)可以表示為無限多項不同頻率的復指函式之和。而不同的頻率點( ω 1 ,  ω 2 )所做的貢獻由幅度 f( ω 1 ,  ω 2 )決定。

例如,考察下面的矩形函式 f (m, n)。該函式在乙個矩形的區域中的函式值為 1,其他區域都為 0,如圖 所示。

在 matlab 中,變數 m、n 和函式 f (m, n)均採用離散表示,所以要想真實地逼近連續函式,只能通過提高取樣率。因此,f (m, n)函式的傅利葉變換可由以下程式段獲得,傅利葉變換的幅值即|f( ω 1 ,  ω 2 )|,如圖 (b)所示。其中 x 軸和 y 軸分別為水平分量和垂直分量

例:  

n=100;

f=zeros(50,50);

f(15:35,23:28)=1;

figure(1);

imshow(f,'initialmagnification','fit');title('矩形連續函式')

%自動適應視窗大小輸出

f=fft2(f,n,n);

% f = fft2(f,n,n)是由使用者設定變換區域的大小nxn。當然,如果使用者設定的區域大小不是 2 的整數次方,fft 還會有預設的補零操作

f2=fftshift(abs(f));

%fftshift的作用正是讓正半軸部分和負半軸部分的影象分別關於各自的中心對稱。

%因為直接用fft得出的資料與頻率不是對應的,fftshift可以糾正過來

figure(2);

x=1:n;y=1:n;

mesh(x,y,f2(x,y)),title('傅利葉變換幅值');%三維網格圖

colormap(gray);%輸出灰色系曲面圖

colorbar;%新增顏色條

2.離散傅利葉變換

在用計算機處理傅利葉變換通常採用離散傅利葉變換(discrete fourier transform,dft)。採用離散傅利葉變換主要有以下兩個原因:

(1)因為 dft 的輸入/輸出均為離散值,非常適用於計算機的運算操作。

(2)採用離散傅利葉變換,就可以用一種快速演算法,即快速傅利葉變換(fast fouriertransform,fft)。

fft 的設計思想是將原函式分為奇數項和偶數項,通過不斷將乙個奇數項和乙個偶數項相加(減),得到需要的結果。

也就是說 fft 是將複雜的乘法運算變成兩個數相加(減)的簡單運算的重複,即通過計算兩個單點的 dft,來計算兩個雙點的 dft;通過計算兩個雙點的 dft,來計算四個  點的dft⋯⋯依此類推。

對於任何 n=2 m 的 dft 的計算,通過計算兩個 n/2 點的 dft,來計算 n 個點的 dft。

數學定義:

在 matlab 中,可分別用函式 fft、fft2 和 fftn 來計算一維、二維和 n 維的 fft,而其反變換依次為 ifft、ifft2 和 ifftn。

例:f = zeros(30,30);

f(5:24,13:17) = 1;

imshow(f,'initialmagnification','fit');title('矩形連續函式');

%自動適應視窗大小輸出

f = fft2(f);

f2 = log(abs(f));%輸出幅度值的另一種方法

figure

imshow(f2,[-1 5],'initialmagnification','fit'); colormap(jet); colorbar;title('傅利葉變換幅值');

%matlab colormap(jet)中數值大為紅色,數值小為藍色

在計算離散傅利葉變換時,可以通過下面的語句對被變換函式(或影象區域)進行補零操作來提高解析度,具體呼叫方式如下:

f = fft2(f,m,n);m×n 表示進行補零操作後被變換區域的大小,與原區域不相重疊的區域補零。

3.利用傅利葉變換進行影象特徵識別

(1)快速卷積

傅利葉變換的另乙個重要特性是能夠實現快速卷積。由線性系統理論可知,兩個函式的卷積的傅利葉變換等於兩個函式的傅利葉變換的乘積。該特性與快速傅利葉變換一

起,可以快速計算函式的卷積

fft(f1*f2)=fft(f1)x fft(f2)

f1*f2=ifft(fft(f1)xfft(f2));

(2)影象特徵識別

傅利葉變換可以用於與卷積密切相關的相關運算(correlation)。在數字影象處理中的相關運算通常用於匹配模板,可以用於對某些模板對應的特徵進行定位。例如,假如我們希望在影象 text.tif 中定位字母「a」,如圖所示,可以採用下面的方法定位。

將包含字母「a」的影象與影象 text.png 進行相關運算,也就是對字母「a」的影象和影象 text.png 進行傅利葉變換,然後利用快速卷積的方法,計算字母「a」和影象 text.png 的卷積,提取卷積運算的峰值,即得到在影象 text.png 中對應字母「a」的定位結果。

例:bw=imread('text.png');

>> a=bw(32:45,88:98);

>> figure,imshow(bw),title('原圖,在這幅圖中找出字母a的位置');

>> figure,imshow(a),title('字母a');

>>

>> c = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256)));

figure, imshow(c,),title('c');

>> max(c(:))

ans =

68.0000

>> thresh=60;

>> figure,imshow(c>thresh);

>> %卷積運算的值大於60的輸出為白色,小於的為黑色,卷積值反映了相似程度,越大表示越相近,當大於閾值的時候就任務是字母'a'了,

matlab 傅利葉變換

兩幅影象傅利葉變換後相加 f1 imread rice.tif 讀圖一f2 imread circles.tif 讀圖二f1 fft2 double f1 對圖一進行傅利葉變換 f2 fft2 double f2 對圖二進行傅利葉變換 f f1 f2 兩幅圖在頻率域融合 f ifft2 f 對f 反...

Matlab做快速傅利葉變換

快速傅利葉變換 fast fourier transform 是訊號處理與資料分析領域裡最重要的演算法之一。傅利葉變換在物理學 數論 組合數學 訊號處理 概率 統計 密碼學 聲學 光學等領域都有著廣泛的應用。那麼如何用matlab實現快速傅利葉變換呢?直接上 tp 0 2048 時域資料點數n yt...

快速傅利葉變換 及MATLAB函式

快速傅利葉變換實用程式 include include include define pi 3.1415926 typedef struct complexnumber cnumber void quickfft cnumber p,int n,int k,cnumber f,int l,int i...