1. 程式人生 > >opencv官方示例-離散傅立葉變換dft()

opencv官方示例-離散傅立葉變換dft()

//discrete fourier tranform, 離散傅立葉變換

//標頭檔案
#include "opencv2/core.hpp"     //Core functionality,核心函式相關
#include "opencv2/imgproc.hpp"  //Image processing, 影象處理相關
#include "opencv2/imgcodecs.hpp"//Image file reading and writing, 影象的載入和寫出相關
#include "opencv2/highgui.hpp"  //High-level GUI,圖形介面GUI相關

#include <iostream>
/** * 程式流程 * 1、載入影象,格式為灰度圖 * 2、獲取圖片dft變換的最佳大小 * 3、邊框加0的方式填充圖片,即非0部分為dft變換的最佳大小 * 4、建立陣列儲存影象實部虛部,且合併到complexI * 5、傅立葉變換 dft(complexI, complexI) * 6、重新分離實部虛部,並且計算幅度 * 7、將幅度對映到對數域 * 8、以影象中心為原點劃分象限,每個象限建立一個ROI * 9、對角象限互換 * 10、顯示結果 */ //名稱空間 using namespace cv; using namespace std; //幫助函式,輸出程式的資訊
static void help(void) { cout << endl << "This program demonstrated the use of the discrete Fourier transform (DFT). " << endl //離散傅立葉變換示例 << "The dft of an image is taken and it's power spectrum is displayed." << endl //離散傅立葉變換後顯示功率譜 << "Usage:"
<< endl << "./discrete_fourier_transform [image_name -- default ../data/lena.jpg]" << endl; //預設載入圖片路徑 } int main(int argc, char ** argv) { help(); //獲取影象路徑(檔名),命令列輸入否則預設 const char* filename = argc >=2 ? argv[1] : "../data/lena.jpg"; //載入影象,方式為載入灰度圖 Mat I = imread(filename, IMREAD_GRAYSCALE); //檢查是否成功載入 if( I.empty()){ cout << "Error opening image" << endl; return -1; } //! [expand] Mat padded; //expand input image to optimal size, 將輸入影象擴充套件到最佳大小 int m = getOptimalDFTSize( I.rows ); int n = getOptimalDFTSize( I.cols ); // on the border add zero values,在邊框上新增零值,使用copyMakeBorder函式 copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); //! [expand] //! [complex_and_real] 實部和虛部 Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; //Mat 陣列儲存影象的實部和虛部 Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros,用零新增到擴充套件的另一平面 //! [complex_and_real] //! [dft] //離散傅立葉變換 dft(complexI, complexI); // this way the result may fit in the source matrix,這種方式的結果可能適合在源矩陣 //! [dft] // compute the magnitude and switch to logarithmic scale,計算幅度並對映到對數刻度 //公式 => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) //! [magnitude] 幅度 split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)),分離實部和虛部 magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude,計算幅度且存放到planes[0] Mat magI = planes[0]; //幅度 //! [magnitude] //! [log] magI += Scalar::all(1); // switch to logarithmic scale,對映到對數刻度 log(magI, magI); //! [log] //! [crop_rearrange]裁剪重新排列 // crop the spectrum, if it has an odd number of rows or columns, 裁剪頻譜, 如果它有奇數行或列數 magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2)); // rearrange the quadrants of Fourier image so that the origin is at the image center //重新排列傅立葉影象的象限, 使原點位於影象中心 int cx = magI.cols/2; int cy = magI.rows/2; //每個象限新建一個ROI Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant, 左上,第二象限 Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right, 右上,第一象限 Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left,左下,第三象限 Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right, 右下,第四象限 Mat tmp; // swap quadrants (Top-Left with Bottom-Right),交換左上和右下象限 q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left),交換右上和左下象限 q2.copyTo(q1); tmp.copyTo(q2); //! [crop_rearrange] //! [normalize] //歸一化,畫素值都對映到[0,1]之間 normalize(magI, magI, 0, 1, NORM_MINMAX); // Transform the matrix with float values into a // viewable image form (float between values 0 and 1). //! [normalize] //顯示結果 imshow("Input Image" , I ); // Show the result imshow("spectrum magnitude", magI); waitKey(); return 0; } /** * 要點總結: * 載入圖片格式為灰度圖 * getOptimalDFTSize()函式獲取最佳大小 * copyMakeBorder()加框函式 * 實部虛部 * merge()合併函式 * dft()函式 * 幅度公式sqrt(Re(DFT(I))^2 + Im(DFT(I))^2) * split()分離函式 * magnitude()計算幅度 * log()對數函式 * normalize()歸一化函式 * /

相關推薦

opencv官方示例-離散變換dft()

//discrete fourier tranform, 離散傅立葉變換 //標頭檔案 #include "opencv2/core.hpp" //Core functionality,核心函式相關 #include "opencv2/imgpro

OpenCV中的離散變換的解讀

關於傅立葉變換及其意義請參照:https://blog.csdn.net/guyuealian/article/details/72817527?locationNum=9&fps=1點選開啟連結 讀完上面連結中的文章,可以知道在頻域處理影象的頻率資訊簡單了不少。在頻譜中頻率對應的其實是多

Python中使用numpy對序列進行離散變換DFT

看了大佬對DFT的介紹後感覺離散傅立葉變換對序列訊號的處理還是很有用的, 總結下來就是DFT可以增加有限長序列的長度來提高物理解析度。 自己用python中的numpy庫實現了一下: 其中繪相簿的使用請參考:Python繪圖 將有效長度為4的單位序列,變換為長度16的DFT譜線。

數字影象處理成長之路4: C語言與離散變換(DFT)

這幾天一直學習傅立葉變換,看了很多國內外資料,網上講原理的很多,到了程式實現這塊大多是Matlab,opencv等,這些軟體的api對於我們理解DFT在計算機中的實現並沒有多大幫助。於是想用C/C++實現DFT,經過不斷的閱讀與程式設計實驗,最終程式有了還算滿意

離散變換DFT

  DFT是為適應計算機分析傅立葉變換規定的一種專門運算,本章是數字訊號處理課程的重點章節。  3.7用DFT進行頻譜分析 1.用DFT對連續訊號進行譜分析   (1)原理         (2)頻率解析度與DFT引數的選擇   頻率解析度是指所用的演算法能將訊號中兩個

matlab在DSP中的應用(五)---離散變換DFT

一、實驗目的 (1)加深對離散傅立葉變換(DFT)基本概念的理解 (2)瞭解有限長序列傅立葉變換(DFT)與離散時間傅立葉變換(DTFT)的聯絡 (3)掌握用MATLAB語言進行離散傅立葉變換和逆變換的方法 二、實驗原理 1.有限長序列的傅立葉變換(D

離散變換-DFT(FFT基礎)

      本文是從最基礎的知識開始講解,力求用最通俗易懂的文字將問題將的通俗易懂,大神勿噴,多多指教啊,雖然說是從零學習FFT,但是基本的數學知識還是要有的,sin,cos,等。        FFT(快速傅立葉變換)其本質就是DFT,只不過可以快速的計算出DFT結果,要弄懂FFT,必須先弄懂DFT,D

《OpenCV3程式設計入門》——5.5.8 離散變換綜合示例程式(附程式碼)

綜合《OpenCV3程式設計入門》——5.5 離散傅立葉變換原理和 《OpenCV3程式設計入門》——5.5.2 離散傅立葉變換相關函式詳解兩篇文章對離傅立葉變換的詳細介紹,本篇將展示實現離散傅立葉變化的示例程式(本篇所涉及的所有知識均在上述兩篇博文裡有詳細解釋,請參考): //--------

OpenCV中對影象進行二維離散變換

#include<opencv2/opencv.hpp> #include <highgui.h> #include <iostream> #include <cv.h> #include <opencv2/core/c

OpenCV學習筆記(六)離散變換

離散傅立葉變換: 傅立葉變換將講時域訊號分解為不同頻率的正弦訊號或餘弦訊號疊加之和,時域分析只能反映訊號的幅值隨時間變化得情況,除單頻率分量的簡諧波外,很難對資訊頻率的組成及各頻率分量的大小進行詳細分析,而訊號頻譜分析提供了比時域訊號波形更直觀、更豐富的資訊。在實際的影象處

opencv從零開始——4. 離散變換的體驗

opencv的強大之處,從這裡開始,越來越能和訊號處理接軌了,贊一個。 程式碼: #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include &l

opencv學習實現簡單的影象離散變換

離散傅立葉變換就是將影象從空間域轉換到頻域,這一轉換基本原理為: 任一函式都可以表示成無數個正弦和餘弦函式的和的形式,二維影象的傅立葉變換可用公式表示為: 其中,f是空間域,F是頻域,轉換之後的頻域值是複數,因此顯示傅立葉變換之後的結果需要使用實物影象加虛數影象或者幅度影

離散變換DFT)和快速變換(FFT)原理與實現

目錄 1、影象變換 2、離散傅立葉變換(Discrete Fourier Transform) 3、DFT性質 4、DFT與數字影象處理 5、FFT-快速傅立葉變換 6、DFT與FFT的演算法實現 1. 影象變換 — —數學領域中有很多種變換,如傅立葉變換、拉普拉斯變

c語言數字影象處理(六):二維離散變換

基礎知識 複數表示 C = R + jI 極座標:C = |C|(cosθ + jsinθ) 尤拉公式:C = |C|ejθ 有關更多的時域與複頻域的知識可以學習複變函式與積分變換,本篇文章只給出DFT公式,性質,以及實現方法 二維離散傅立葉變換(DFT) 其中f(x,y)為原影象,F(u,

拉普拉斯變換變換;Z變換離散時間變換(DTFT);離散變換DFT)之間的關係及理解

頻域與時域之間的關係是: 時域離散——頻域週期; 時域週期——頻域離散; 對於連續時間訊號 1.拉普拉斯變換: X (

補零與離散變換的解析度

     離散傅立葉變換(DFT)的輸入是一組離散的值,輸出同樣是一組離散的值。在輸入訊號而言,相鄰兩個取樣點的間隔為取樣時間Ts。在輸出訊號而言,相鄰兩個取樣點的間隔為頻率解析度fs/N,其中fs為取樣頻率,其大小等於1/Ts,N為輸入訊號的取樣點數。這也就是說,DF

二維離散變換以及濾波應用

一、二維離散傅立葉變換 二維離散傅立葉變換的公式:F(u,v)=1MN[∑m=0M−1∑n=0N−1f(m,n)WMumWNvn]∙RMN(u,v) F(u,v) = \frac{1}{MN}[\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}f

《OpenCV3程式設計入門》——5.5.2 離散變換相關函式詳解

目錄 1、dft()函式 2、返回DFT最優尺寸大小:getOptimalDFTSize()函式 3、擴充影象邊界:copyMakeBorder()函式 4、計算二維向量的幅值:magnitude()函式 6、矩陣歸一化:normalize()函式 1、dft()函式

《OpenCV3程式設計入門》——5.5 離散變換原理

離散傅立葉變換(Discrete Fourier Transform,縮寫為DFT)指傅立葉變換在時域和頻域上都呈現離散的形式,將時域訊號的取樣變換為在離散時間傅立葉變換(DTFT)頻域的取樣。 形式上,變換兩端(時域和頻域)的序列是有限長的,而實際上這兩組序列都應該被認為是離散週期訊號的主值序

離散變換在影象處理中的應用_學習

1、為什麼要進行傅立葉變換,其物理意義是什麼? 傅立葉原理表明:任何連續測量的時序或訊號,都可以表示為不同頻率的正弦波訊號的無限疊加。而根據該原理創立的傅立葉變換演算法利用直接測量到的原始訊號,以累加方式來計算該訊號中不同正弦波訊號的頻率、振幅和相位。 和傅立葉