opencv的頻域濾波

2022-08-20 03:00:16 字數 2707 閱讀 2070

下面是頻域濾波示例程式:

在本程式中,共有五個自定義函式,分別是:
1. mymagnitude(),在該函式中封裝了opencv中的magnitude函式,實現對於複數影象的幅值計算。
2. dftshift(),該函式實現對影象四個象限的對角互換,相當於matlab中 fftshift(),將頻譜的原點(0,0)移到影象中心。示例1中採用了該函式實現了頻譜圖中心化。
3. srccentralized()用於傅利葉變換前的預處理,以便得到傅利葉頻譜的原點(0,0)位於影象的中心。
該函式與dftshift()目的一致,實現方法不同,乙個是變換前預處理,乙個是變換後處理。
示例2中採用了該函式實現了頻譜圖中心化。
4. displaydftspectrum(),該函式用於顯示複數影象。
5. makefilter(),用於製作頻域濾波器,該函式利用了ptr()
指標遍歷影象的方法,實現了圓等濾波函式。
下面是兩個示例,分別採用了dftshift()、srccentralized()實現頻譜圖的中心化。示例2與岡薩雷斯的《數字影象處理(第3版)》的4.6.7小結中的流程一致。
在主程式內容,參見注釋。

示例1:在該程式中採用了第2個函式dftshift(),實現了頻譜圖中心化。

#include #include

using

namespace

cv;using

namespace

std;

void mymagnitude(mat & compleximg,mat &mi)

void dftshift(mat&ds)

void displaydftspectrum(mat&dftdst,string winname,bool

inversespectrum)

normalize(magi,magi,

0,1,norm_minmax);

imshow(winname,magi);

}void makefilter(mat&filter,int r,bool

islowpassfilter)}}

if(!islowpassfilter)

mat displayfilter;

extractchannel(filter,displayfilter,0);

imshow(

"filter image

",displayfilter);

}int

main()

示例2:在該示例中採用了第3個函式srccentralized(),實現頻譜圖中心化。程式流程即

在本教材的6.2.3頻域濾波步驟小結中,或者在岡薩雷斯的《數字影象處理》4.6.7節中,頻域濾波流程總結如下:

給定一幅大小為m×n的輸入影象f(x,y),從式(6.1-25)和式(6.1-26)得到填充引數p和q。典型地,我們選擇p=2m和q=2n;

對f(x,y)新增必要數量的0,形成大小為p×q填充後的影象

用(-1)(x+y)乘以fp(x,y),進行頻譜中心化的預處理;

計算中心化預處理過的fp(x,y)的傅利葉變換,得到fp(u,v);

生成乙個實的、對稱的濾波函式h(u,v),其大小為p×q,頻譜零點位於(p/2,q/2)處。用陣列相乘形成乘積g(u,v)=f(u,v)h(u,v);

經過頻域濾波後的影象:

gp(x,y)=(-1)(x+y)

其中,為忽略由於計算不準確導致的寄生復分量,選擇了實部,下標p指出我們處理的是填充後的陣列;

通過從 gp(x,y)的左上象限提取m×n區域,得到最終處理結果g(x,y)。

/*

求取複數矩陣的幅值

*/void mymagnitude(mat & compleximg,mat &mi)

/*傅利葉變換後的頻譜圖後處理,將傅利葉普的原點(0,0)平移到影象的中心

*/void dftshift(mat&ds)

/*傅利葉變換前的預處理,以便頻譜圖的原點(0,0)移動到影象的中心

*/void srccentralized(mat&src)

}}/*

在視窗中顯示複數影象,如果是正向傅利葉矩陣,需要取log才能顯示更多頻譜資訊

*如果是逆傅利葉變換,通過normalize歸一化後,顯示頻譜圖

*/void displaydftspectrum(mat&dftdst,string winname,bool

inversespectrum)

normalize(magi,magi,

0,1,norm_minmax);

imshow(winname,magi);

}void makefilter(mat&filter,int r,bool

islowpassfilter)}}

if(!islowpassfilter)

mat displayfilter;

extractchannel(filter,displayfilter,0);

imshow(

"filter image

",displayfilter);

}int

main()

時域濾波和頻域濾波

一直都分不清楚時域濾波和頻域濾波那個比較好?時域濾波就是通過fir或者iir濾波,頻域濾波就是先fft去掉不想要的成分在ifft,一直覺得頻域濾波就像是乙個理想濾波器一樣?對於一些離線訊號的處理或者對於資源沒有要求的資料處理是不是就考慮頻域濾波就好了?希望指教 時域的卷積是在空間上影象矩陣進行卷積運...

濾波器的頻域理解

濾波器的頻域理解 初學數字濾波器的時候,從頻域進行理解能夠比較簡單地理解濾波器的概念,而且在訊號處理的應用中,濾波器更多的也是用頻域的一些特性來描述。如果可以做乙個模擬的話,數字濾波器可以比作是乙個篩沙子的篩子。我們都知道如下的篩沙過程 先將一堆沙子放到篩子上,這堆沙子有大沙子,有細沙子,可能還有石...

頻域低通濾波器1

在頻譜中低頻主要對應影象在平滑區域的總體灰度級分布,而高頻對應影象的細節部分,如邊緣和雜訊。因此影象平滑可以通過衰減影象頻譜中的高頻部分來實現,這就建立了空間域影象平滑和頻域低通濾波之間的對應關係。理論基礎 最容易想到的衰減高頻成分方法是在乙個稱為 截止頻率 的位置截斷所有的高頻成分,將影象頻譜中所...