91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Opencv實現傅里葉變換

發布時間:2020-08-21 15:03:18 來源:腳本之家 閱讀:188 作者:Ethan_Lei_Pro 欄目:編程語言

傅里葉變換將圖像分解成其正弦和余弦分量,它將圖像由空域轉換為時域。任何函數都可以近似的表示為無數正弦和余弦函數的和,傅里葉變換就是實現這一步的,數學上一個二維圖像的傅里葉變換為:

Opencv實現傅里葉變換 

公式中,f是圖像在空域的值,F是頻域的值。轉換的結果是復數,但是不可能通過一個真實圖像和一個復雜的圖像或通過大小和相位圖像去顯示這樣的一個圖像。然而,在整個圖像處理算法只對大小圖像是感興趣的,因為這包含了所有我們需要的圖像幾何結構的信息。

可通過以下幾步顯示一副傅里葉變換后的圖像

1、將圖像擴展到它的最佳尺寸,DFT(直接傅里葉變換)的性能依賴于圖片的尺寸,當圖像是2,3,5的倍數時往往是最快的。因此,為了達到最優性能通常采用墊邊界值的方法,得到一個最佳的尺寸。

2、為傅立葉變換結果的實部和虛部分配存儲空間。傅里葉變換的結果是一個復數,這意味著每幅圖的結果都有一個實部和虛部,此外,頻域范圍遠遠大于它對應的空間范圍。因此,我們這些通常至少以一個浮點數格式存儲這些數值。因此,我們會將我們的輸入圖像轉換為這種類型并且擴展它與另一通道存放復數值

3、進行傅里葉變換。

4、將復數轉換為幅值,DFT的幅值由以下公式得出:Opencv實現傅里葉變換

5、切換到對數刻度。對圖像進行對數尺度的縮放,結果證明,傅立葉系數矩陣的動態范圍太大,無法顯示在屏幕上,我們無法通過這樣去觀察一些小的和高的變化值。因此那些高的數值將轉化成白點而小的數值會變成黑點,使用灰度值進行可視化,我們可以將線性刻度轉換為對數刻度,以便于觀察。

Opencv實現傅里葉變換 

6、剪切和重分布幅度圖象,第一步我們擴展了圖像,這里我們去掉擴展的那部分值,基于可視化的目的,我們還可以重新排列結果的象限,使原點(0,0)對應于與圖像中心

7、歸一化。目前得到的幅值圖像仍然太大,超出了顯示的范圍,歸一化這范圍內的值,可以進一步達到可視化的目的

實現程序

void _DFT(){
 //1以灰度模式讀取原圖像并顯示
 Mat srcImage = imread("miFan.jpg",0);
 if (!srcImage.data){ cout << "Error\n"; }
 imshow("原圖像", srcImage);

 //2將輸入圖像擴展到最佳尺寸,邊界用0補充
 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為傅里葉變換的結果(實部和虛部)分配存儲空間
 //將數組組合合并為一個多通道數組
 Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
 Mat complexI;
 merge(planes, 2, complexI);

 //4進行傅里葉變換
 dft(complexI, complexI);

 //5將復數轉換為幅值,即=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
 //將多通道數組分離為幾個單通道數組
 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進行對數尺度縮放
 magImage += Scalar::all(1);
 log(magImage, magImage);//求自然對數

 //7剪切和重分布幅度圖象限
 //若有奇數行或奇數列,進行頻譜剪裁
 magImage = magImage(Rect(0, 0, magImage.cols&-2, magImage.rows&-2));
 //重新排列傅立葉圖像中的象限,使得原點位于圖像中心 
 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));
 //交換象限(左上與右下進行交換)
 Mat tmp;
 q0.copyTo(tmp);
 q3.copyTo(q0);
 tmp.copyTo(q3);
 //交換象限(右上與左下進行交換)
 q1.copyTo(tmp);
 q2.copyTo(q1);
 tmp.copyTo(q2);

 //8歸一化,用0到1的浮點值將矩陣變換為可視的圖像格式
 normalize(magImage, magImage, 0, 1, CV_MINMAX);

 //9顯示
 imshow("頻譜增幅", magImage);

 waitKey();
}

Opencv實現傅里葉變換

傅里葉變換后的圖片

Opencv實現傅里葉變換

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乐市| 长汀县| 盐山县| 贞丰县| 固原市| 大城县| 淅川县| 偏关县| 黔江区| 调兵山市| 旬阳县| 渝中区| 和静县| 嘉善县| 洛南县| 阜宁县| 宜丰县| 宜城市| 海阳市| 武鸣县| 什邡市| 凤凰县| 余庆县| 涟源市| 鹤峰县| 巢湖市| 梅河口市| 海伦市| 泽普县| 左贡县| 贵港市| 罗田县| 乌兰察布市| 孝义市| 江门市| 阿拉善左旗| 合阳县| 信宜市| 时尚| 兴宁市| 柞水县|