Opencv實(shí)現(xiàn)傅里葉變換
傅里葉變換將圖像分解成其正弦和余弦分量,它將圖像由空域轉(zhuǎn)換為時(shí)域。任何函數(shù)都可以近似的表示為無(wú)數(shù)正弦和余弦函數(shù)的和,傅里葉變換就是實(shí)現(xiàn)這一步的,數(shù)學(xué)上一個(gè)二維圖像的傅里葉變換為:
公式中,f是圖像在空域的值,F(xiàn)是頻域的值。轉(zhuǎn)換的結(jié)果是復(fù)數(shù),但是不可能通過一個(gè)真實(shí)圖像和一個(gè)復(fù)雜的圖像或通過大小和相位圖像去顯示這樣的一個(gè)圖像。然而,在整個(gè)圖像處理算法只對(duì)大小圖像是感興趣的,因?yàn)檫@包含了所有我們需要的圖像幾何結(jié)構(gòu)的信息。
可通過以下幾步顯示一副傅里葉變換后的圖像
1、將圖像擴(kuò)展到它的最佳尺寸,DFT(直接傅里葉變換)的性能依賴于圖片的尺寸,當(dāng)圖像是2,3,5的倍數(shù)時(shí)往往是最快的。因此,為了達(dá)到最優(yōu)性能通常采用墊邊界值的方法,得到一個(gè)最佳的尺寸。
2、為傅立葉變換結(jié)果的實(shí)部和虛部分配存儲(chǔ)空間。傅里葉變換的結(jié)果是一個(gè)復(fù)數(shù),這意味著每幅圖的結(jié)果都有一個(gè)實(shí)部和虛部,此外,頻域范圍遠(yuǎn)遠(yuǎn)大于它對(duì)應(yīng)的空間范圍。因此,我們這些通常至少以一個(gè)浮點(diǎn)數(shù)格式存儲(chǔ)這些數(shù)值。因此,我們會(huì)將我們的輸入圖像轉(zhuǎn)換為這種類型并且擴(kuò)展它與另一通道存放復(fù)數(shù)值
3、進(jìn)行傅里葉變換。
4、將復(fù)數(shù)轉(zhuǎn)換為幅值,DFT的幅值由以下公式得出:
5、切換到對(duì)數(shù)刻度。對(duì)圖像進(jìn)行對(duì)數(shù)尺度的縮放,結(jié)果證明,傅立葉系數(shù)矩陣的動(dòng)態(tài)范圍太大,無(wú)法顯示在屏幕上,我們無(wú)法通過這樣去觀察一些小的和高的變化值。因此那些高的數(shù)值將轉(zhuǎn)化成白點(diǎn)而小的數(shù)值會(huì)變成黑點(diǎn),使用灰度值進(jìn)行可視化,我們可以將線性刻度轉(zhuǎn)換為對(duì)數(shù)刻度,以便于觀察。
6、剪切和重分布幅度圖象,第一步我們擴(kuò)展了圖像,這里我們?nèi)サ魯U(kuò)展的那部分值,基于可視化的目的,我們還可以重新排列結(jié)果的象限,使原點(diǎn)(0,0)對(duì)應(yīng)于與圖像中心
7、歸一化。目前得到的幅值圖像仍然太大,超出了顯示的范圍,歸一化這范圍內(nèi)的值,可以進(jìn)一步達(dá)到可視化的目的
實(shí)現(xiàn)程序
void _DFT(){ //1以灰度模式讀取原圖像并顯示 Mat srcImage = imread("miFan.jpg",0); if (!srcImage.data){ cout << "Error\n"; } imshow("原圖像", srcImage); //2將輸入圖像擴(kuò)展到最佳尺寸,邊界用0補(bǔ)充 int m = getOptimalDFTSize(srcImage.rows); int n = getOptimalDFTSize(srcImage.cols); //將添加的像素初始化為0 Mat padded; copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0)); //3為傅里葉變換的結(jié)果(實(shí)部和虛部)分配存儲(chǔ)空間 //將數(shù)組組合合并為一個(gè)多通道數(shù)組 Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI); //4進(jìn)行傅里葉變換 dft(complexI, complexI); //5將復(fù)數(shù)轉(zhuǎn)換為幅值,即=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) //將多通道數(shù)組分離為幾個(gè)單通道數(shù)組 split(complexI, planes);//planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) magnitude(planes[0], planes[1], planes[0]); Mat magImage = planes[0]; //6進(jìn)行對(duì)數(shù)尺度縮放 magImage += Scalar::all(1); log(magImage, magImage);//求自然對(duì)數(shù) //7剪切和重分布幅度圖象限 //若有奇數(shù)行或奇數(shù)列,進(jìn)行頻譜剪裁 magImage = magImage(Rect(0, 0, magImage.cols&-2, magImage.rows&-2)); //重新排列傅立葉圖像中的象限,使得原點(diǎn)位于圖像中心 int cx = magImage.cols / 2; int cy = magImage.rows / 2; Mat q0(magImage, Rect(0, 0, cx, cy)); Mat q1(magImage, Rect(cx, 0, cx, cy)); Mat q2(magImage, Rect(0,cy,cx,cy)); Mat q3(magImage, Rect(cx,cy,cx,cy)); //交換象限(左上與右下進(jìn)行交換) Mat tmp; q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); //交換象限(右上與左下進(jìn)行交換) q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); //8歸一化,用0到1的浮點(diǎn)值將矩陣變換為可視的圖像格式 normalize(magImage, magImage, 0, 1, CV_MINMAX); //9顯示 imshow("頻譜增幅", magImage); waitKey(); }
傅里葉變換后的圖片
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C++設(shè)計(jì)模式之橋接模式(Bridge)
欄 目:C語(yǔ)言
下一篇:C++如何判斷一個(gè)數(shù)字是否為質(zhì)數(shù)
本文標(biāo)題:Opencv實(shí)現(xiàn)傅里葉變換
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/826.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10求斐波那契(Fibonacci)數(shù)列通項(xiàng)的七種實(shí)現(xiàn)方法
- 01-10C語(yǔ)言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實(shí)現(xiàn)方法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作(一)
- 01-10用C語(yǔ)言實(shí)現(xiàn)單鏈表的各種操作(二)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)