最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【第23節(jié)】OpenCV傅里葉變換

2022-11-30 14:21 作者:海鷗之道  | 我要投稿

目標(biāo)

  • 使用OpenCV對(duì)圖像進(jìn)行傅里葉變換

  • 使用Numpy中FFT(快速傅里葉變換)函數(shù)

  • 傅里葉變換的一些用處

  • 我們將要學(xué)習(xí)的函數(shù)有:CV2.dft(),CV2.idft()等。

原理

????????傅里葉變換經(jīng)常被用來(lái)分析不同濾波器的頻率特性。我們可以使用2D離散傅里葉變換(DFT)分析圖像的頻域特性。實(shí)現(xiàn)DFT的一個(gè)快速算法被稱為快速傅里葉變換(FFT)。關(guān)于傅里葉變換的細(xì)節(jié)知識(shí)可以在任意一本圖像處理或信號(hào)處理的書(shū)中找到。請(qǐng)查看本小節(jié)中更多資源部分。對(duì)于一個(gè)正弦信號(hào): ax(t)= Asin (2πft),它的頻率為f,如果把這個(gè)信號(hào)轉(zhuǎn)到它的頻域表示,我們會(huì)在頻率f中看到一個(gè)峰值。如果我們的信號(hào)是由采樣產(chǎn)生的離散信號(hào)好組成,我們會(huì)得到類似的頻譜圖,只不過(guò)前面是連續(xù)的,現(xiàn)在是離散。你可以把圖像想象成沿著兩個(gè)方向采集的信號(hào)。所以對(duì)圖像同時(shí)進(jìn)行X方向和Y方向的傅里葉變換,我們就會(huì)得到這幅圖像的頻域表示(頻譜圖)。.

????????更直觀一點(diǎn),對(duì)于一個(gè)正弦信號(hào),如果它的幅度變化非???,我們可以說(shuō)他是高頻信號(hào),如果變化非常慢,我們稱之為低頻信號(hào)。你可以把這種想法應(yīng)用到圖像中,圖像那里的幅度變化非常大呢?邊界點(diǎn)或者噪聲。所以我們說(shuō)邊界和噪聲是圖像中的高頻分量(注意這里的高頻是指變化非???,而非出現(xiàn)的次數(shù)多)。如果沒(méi)有如此大的幅度變化我們稱之為低頻分量。

????????現(xiàn)在我們看看怎樣進(jìn)行傅里葉變換。

1、Numpy中的傅里葉變換

????????首先我們看看如何使用Numpy進(jìn)行傅里葉變換。Numpy中的FFT包可以幫助我們實(shí)現(xiàn)快速傅里葉變換。函數(shù)np.fft.fft2()可以對(duì)信號(hào)進(jìn)行頻率轉(zhuǎn)換,輸出結(jié)果是一個(gè)復(fù)雜的數(shù)組。本函數(shù)的第--個(gè)參數(shù)是輸入圖像,要求是灰度格式。第二個(gè)參數(shù)是可選的,決定輸出數(shù)組的大小。輸出數(shù)組的大小和輸入圖像大小一樣。如果輸出結(jié)果比輸入圖像大,輸入圖像就需要在進(jìn)行FFT前補(bǔ)0。如果輸出結(jié)果比輸入圖像小的話,輸入圖像就會(huì)被切割。

????????現(xiàn)在我們得到了結(jié)果,頻率為0的部分(直流分量)在輸出圖像的左上角。如果想讓它(直流分量)在輸出圖像的中心,我們還需要將結(jié)果沿兩個(gè)方向平移。函數(shù)np.f.fftshift()可以幫助我們實(shí)現(xiàn)這一步。(這樣更容易分析)。進(jìn)行完頻率變換之后,我們就可以構(gòu)建振幅譜了。

結(jié)果如下:

????????我們可以看到輸出結(jié)果的中心部分更白(亮),這說(shuō)明低頻分量更多?,F(xiàn)在我們可以進(jìn)行頻域變換了,我們就可以在頻域?qū)D像進(jìn)行一些操作了,例如高通濾波和重建圖像( DFT的逆變換)。比如我們可以使用一個(gè)60x60的矩形窗口對(duì)圖像進(jìn)行掩模操作從而去除低頻分量。然后再使用函數(shù)np.fft.ifftshift()進(jìn)行逆平移操作,所以現(xiàn)在直流分量又回到左上角了,左后使用函數(shù)np.ifft2()進(jìn)行FFT逆變換。同樣又得到一堆復(fù)雜的數(shù)字,我們可以對(duì)他們?nèi)〗^對(duì)值:

結(jié)果如下:

????????上圖的結(jié)果顯示高通濾波其實(shí)是一種邊界檢測(cè)操作。這就是我們?cè)谇懊鎴D像梯度那一章看到的。同時(shí)我們還發(fā)現(xiàn)圖像中的大部分?jǐn)?shù)據(jù)集中在頻譜圖的低頻區(qū)域。我們現(xiàn)在已經(jīng)知道如何使用Numpy進(jìn)行DFT和IDFT了,接著我們來(lái)看看如何使用OpenCV進(jìn)行這些操作。

????????如果你觀察仔細(xì)的話,尤其是最后一章JET顏色的圖像,你會(huì)看到-些不自然的東西(如我用紅色箭頭標(biāo)出的區(qū)域)??瓷蠄D那里有些條帶裝的結(jié)構(gòu),這被成為振鈴效應(yīng)。這是由于我們使用矩形窗口做掩模造成的。這個(gè)掩模被轉(zhuǎn)換成正弦形狀時(shí)就會(huì)出現(xiàn)這個(gè)問(wèn)題。所以一般我們不適用矩形窗口濾波。最好的選擇是高斯窗口。

2、OpenCV中的傅里葉變換

????????OpenCV中相應(yīng)的函數(shù)是CV2.dft()和CV2.idft()。和前面輸出的結(jié)果一樣,但是是雙通道的。第一個(gè)通道是結(jié)果的實(shí)數(shù)部分,第二個(gè)通道是結(jié)果的虛數(shù)部分。輸入圖像要首先轉(zhuǎn)換成np.float32格式。我們來(lái)看看如何操作。

注意:你可以使用函數(shù)CV2.cartToPolar(),它會(huì)同時(shí)返回幅度和相位。

????????現(xiàn)在我們來(lái)做逆DFT。在前面的部分我們實(shí)現(xiàn)了一個(gè)HPF(高通濾波),現(xiàn)在我們來(lái)做LPF(低通濾波)將高頻部分去除。其實(shí)就是對(duì)圖像進(jìn)行模糊操作。首先我們需要構(gòu)建一個(gè)掩模,與低頻區(qū)域?qū)?yīng)的地方設(shè)置為1,與高頻區(qū)域?qū)?yīng)的地方設(shè)置為0。

結(jié)果如下:

注意: OpenCV中的函數(shù)CV2.dft()和CV2.idft()要比Numpy快。但是Numpy函數(shù)更加用戶友好。關(guān)于性能的描述,請(qǐng)看下面的章節(jié)。

3、DFT的性能優(yōu)化

????????當(dāng)數(shù)組的大小為某些值時(shí)DFT的性能會(huì)更好。當(dāng)數(shù)組的大小是2的指數(shù)時(shí)DFT效率最高。當(dāng)數(shù)組的大小是2,3,5的倍數(shù)時(shí)效率也會(huì)很高。所以如果你想提高代碼的運(yùn)行效率時(shí),你可以修改輸入圖像的大小(補(bǔ)0)。對(duì)于OpenCV你必須自己手動(dòng)補(bǔ)0。但是Numpy,你只需要指定FFT運(yùn)算的大小,它會(huì)自動(dòng)補(bǔ)0。

????????那我們?cè)鯓哟_定最佳大小呢?OpenCV提供了-個(gè)函數(shù):CV2.getOptimalDFTSize().它可以同時(shí)被CV2.dft()和np.fft.fft2()使用。讓我們一起使用IPython的魔法命令%timeit來(lái)測(cè)試一下吧。

看到了吧,數(shù)組的大小從( 342,548 )變成了( 360,576 )?,F(xiàn)在我們?yōu)樗a(bǔ)0,然后看看性能有沒(méi)有提升。你可以創(chuàng)建一個(gè)大的0數(shù)組,然后把我們的數(shù)據(jù)拷貝過(guò)去,或者使用函數(shù)CV2.copyMakeBoder()。

或者:

現(xiàn)在我們看看 Numpy 的表現(xiàn):

速度提高了 4 倍。我們?cè)倏纯?OpenCV 的表現(xiàn):

也提高了4倍,同時(shí)我們也會(huì)發(fā)現(xiàn)OpenCV的速度是Numpy的3倍。你也可以測(cè)試一下逆FFT的表現(xiàn)。


【第23節(jié)】OpenCV傅里葉變換的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
南华县| 社会| 靖安县| 噶尔县| 军事| 东光县| 石景山区| 紫云| 顺义区| 张掖市| 呈贡县| 东方市| 萝北县| 垦利县| 道孚县| 山丹县| 峡江县| 贵溪市| 曲阳县| 衡阳市| 青浦区| 敖汉旗| 尉氏县| 黎川县| 上栗县| 轮台县| 汉沽区| 调兵山市| 探索| 鹰潭市| 奈曼旗| 洞头县| 砀山县| 盖州市| 分宜县| 洞头县| 区。| 光泽县| 连城县| 房山区| 湘乡市|