1. 程式人生 > >opencv傅立葉變換例項

opencv傅立葉變換例項

OpenCV快速傅立葉變換例項

int main()
{
    Mat I = imread("ted_cruz.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if (I.empty())
        return -1;
    cout << I.size() << endl;
    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(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); cout << padded.size() << endl; Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zeros
dft(complexI, complexI); // this way the result may fit in the source matrix // compute the magnitude and switch to logarithmic scale // => 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]);// planes[0] = magnitude Mat magI = planes[0]; magI += Scalar::all(1); // switch to logarithmic scale log(magI, magI); // 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; 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); normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a // viewable image form (float between values 0 and 1). imshow("Input Image", I); // Show the result imshow("spectrum magnitude", magI); waitKey(); return 0; }
OpenCV 中 傅立葉變換 FFT,程式碼如下:
  1. void fft2(IplImage *src, IplImage *dst)  
  2. {   //實部、虛部
  3.     IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0;  
  4.     //   int i, j;
  5.     image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);  //實部
  6.     //Imaginary part
  7.     image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);  //虛部
  8.     //2 channels (image_Re, image_Im)
  9.     Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);  
  10.     // Real part conversion from u8 to 64f (double)
  11.     cvConvertScale(src, image_Re);  
  12.     // Imaginary part (zeros)
  13.     cvZero(image_Im);  
  14.     // Join real and imaginary parts and stock them in Fourier image
  15.     cvMerge(image_Re, image_Im, 0, 0, Fourier);  
  16.     // Application of the forward Fourier transform
  17.     cvDFT(Fourier, dst, CV_DXT_FORWARD);  
  18.     cvReleaseImage(&image_Re);  
  19.     cvReleaseImage(&image_Im);  
  20.     cvReleaseImage(&Fourier);  
  21. }  
  22. void fft2shift(IplImage *src, IplImage *dst)  
  23. {  
  24.     IplImage *image_Re = 0, *image_Im = 0;  
  25.     int nRow, nCol, i, j, cy, cx;  
  26.     double scale, shift, tmp13, tmp24;  
  27.     image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);  
  28.     //Imaginary part
  29.     image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);  
  30.     cvSplit( src, image_Re, image_Im, 0, 0 );  
  31.     //具體原理見岡薩雷斯數字影象處理p123
  32.     // Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)
  33.     //計算傅立葉譜
  34.     cvPow( image_Re, image_Re, 2.0);  
  35.     cvPow( image_Im, image_Im, 2.0);  
  36.     cvAdd( image_Re, image_Im, image_Re);  
  37.     cvPow( image_Re, image_Re, 0.5 );  
  38.     //對數變換以增強灰度級細節(這種變換使以窄帶低灰度輸入影象值對映
  39.     //一寬頻輸出值,具體可見岡薩雷斯數字影象處理p62)
  40.     // Compute log(1 + Mag);
  41.     cvAddS( image_Re, cvScalar(1.0), image_Re ); // 1 + Mag
  42.     cvLog( image_Re, image_Re ); // log(1 + Mag)
  43.     //Rearrange the quadrants of Fourier image so that the origin is at the image center
  44.     nRow = src->height;  
  45.     nCol = src->width;  
  46.     cy = nRow/2; // image center
  47.     cx = nCol/2;  
  48.     //CV_IMAGE_ELEM為OpenCV定義的巨集,用來讀取影象的畫素值,這一部分就是進行中心變換
  49.     for( j = 0; j < cy; j++ ){  
  50.         for( i = 0; i < cx; i++ ){  
  51.             //中心化,將整體份成四塊進行對角交換
  52.             tmp13 = CV_IMAGE_ELEM( image_Re, double, j, i);  
  53.             CV_IMAGE_ELEM( image_Re, double, j, i) = CV_IMAGE_ELEM(  
  54.                 image_Re, double, j+cy, i+cx);  
  55.             CV_IMAGE_ELEM( image_Re, double, j+cy, i+cx) = tmp13;  
  56.             tmp24 = CV_IMAGE_ELEM( image_Re, double, j, i+cx);  
  57.             CV_IMAGE_ELEM( image_Re, double, j, i+cx) =  
  58.                 CV_IMAGE_ELEM( image_Re, double, j+cy, i);  
  59.             CV_IMAGE_ELEM( image_Re, double, j+cy, i) = tmp24;  
  60.         }  
  61.     }  
  62.     //歸一化處理將矩陣的元素值歸一為[0,255]
  63.     //[(f(x,y)-minVal)/(maxVal-minVal)]*255
  64.     double minVal = 0, maxVal = 0;  
  65.     // Localize minimum and maximum values
  66.     cvMinMaxLoc( image_Re, &minVal, &maxVal );  
  67.     // Normalize image (0 - 255) to be observed as an u8 image
  68.     scale = 255/(maxVal - minVal);  
  69.     shift = -minVal * scale;  
  70.     cvConvertScale(image_Re, dst, scale, shift);  
  71.     cvReleaseImage(&image_Re);  
  72.     cvReleaseImage(&image_Im);  
  73. }  
  74. void CCVMFCView::OnFuliyeTransform()  
  75. {  
  76.     IplImage *src;  
  77.     IplImage *Fourier;   //傅立葉係數
  78.     IplImage *dst ;  
  79.     IplImage *ImageRe;  
  80.     IplImage *ImageIm;  
  81.     IplImage *Image;  
  82.     IplImage *ImageDst;  
  83.     double m,M;  
  84.     double scale;  
  85.     double shift;  
  86.     //src = workImg;
  87.     if(workImg->nChannels==3)  
  88.         OnColorToGray();  
  89.     src=cvCreateImage(cvGetSize(workImg),IPL_DEPTH_64F,workImg->nChannels);  //源影象
  90.     imageClone(workImg,&src);  
  91.     cvFlip(src);  
  92.     Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);  
  93.     dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);  
  94.     ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);  
  95.     ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);  
  96.     Image = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);  
  97.     ImageDst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);  
  98.     fft2(src,Fourier);                  //傅立葉變換
  99.     fft2shift(Fourier, Image);          //中心化
  100.     cvDFT(Fourier,dst,CV_DXT_INV_SCALE);//實現傅立葉逆變換,並對結果進行縮放
  101.     cvSplit(dst,ImageRe,ImageIm,0,0);  
  102.     cvNamedWindow("源影象",0);  
  103.     cvShowImage("源影象",src);               
  104.     //對陣列每個元素平方並存儲在第二個引數中
  105.     cvPow(ImageRe,ImageRe,2);                 
  106.     cvPow(ImageIm,ImageIm,2);  
  107.     cvAdd(ImageRe,ImageIm,ImageRe,NULL);  
  108. 相關推薦

    opencv變換例項

    OpenCV快速傅立葉變換例項 int main() { Mat I = imread("ted_cruz.jpg", CV_LOAD_IMAGE_GRAYSCALE); if (I.empty()) return -1; c

    opencv 變換及其逆變換例項及其理解

    傅立葉變換是把影象從空間域轉化到頻率域的變換。 空間域 一般的情況下,空間域的影象是f(x,y)=灰度級(0-255),形象一點就是一個二維矩陣,每個座標對應一個顏色值。 頻率域 先介紹幾個概念 頻率:對於影象來說可以指影象顏色值的梯度,即灰度級的變化速度 幅度:可以簡單的理

    Opencv 變換 變換

    作業要求: 1.計算一個圖片的傅立葉變換 2.進行傅立葉逆變換 環境:Win7(64bits),Visual Studio2010,OpenCV 2.4.10 1.計算一個圖片的傅立葉變換 離散傅立葉變換的原理 對一張影象使用傅立葉變換就是將它分解成正弦和餘弦兩個部分,

    OpenCV變換

    傅立葉變換可以將影象的時域訊號轉換到頻域,通過頻域我們可以看到訊號的另一面。我們可以在頻域對影象進行濾波等處理,然後通過傅立葉反變換,將頻域影象轉換回時域,就可以看到處理後的影象。 實際應用中,更多的是在頻域進行濾波器設計,設計合適的濾波器,然後將濾波器經過傅立葉反變換生

    opencv變換 FFT

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    0022-在OpenCV環境下做影象或矩陣的變換

    傅立葉變換的概念在《高等數學》、《訊號與系統》、《數字訊號處理》中都有詳細的原理說明,網上也有一大堆文章解釋其原理。這裡我就不多說了,總之它是把訊號變換到三角函式系裡,實際上是域的變換,至於變換有什麼好處,其實就是從另一個角度觀察同一個訊號。對影象的傅立葉變換實際上是一個二維傅立葉變換。OpenCV

    變換及其在opencv中影象去噪的實現

    前言 我保證這篇文章和你以前看過的所有文章都不同,這是12年還在果殼的時候寫的,但是當時沒有來得及寫 完就出國了……於是拖了兩年,嗯,我是拖延症患者…… 這篇文章的核心思想就是: 要讓讀者在不看任何數學公式的情況下理解傅立葉分析。 傅立葉分析不僅僅是一個數學工

    分別用OpenCV-Python和Numpy實現變換和逆變換

    Numpy實現 fft = np.fft.fft2(img) 將空間域轉化為頻率域 OpenCV實現 dft = cv2.dft(np.float32(img),flag=cv2.DFT_COMPLEX_OUTPUT) 這個函式與np.fft.fft2(img)實現相同的功能,但要注意先

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

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

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

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

    opencv 中 快速變換 FFT

    opencv 中 傅立葉變換 FFT,程式碼如下: void fft2(IplImage *src, IplImage *dst) { //實部、虛部 IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0; //

    Python下opencv使用筆記(十)(影象頻域濾波與變換

    前面曾經介紹過空間域濾波,空間域濾波就是用各種模板直接與影象進行卷積運算,實現對影象的處理,這種方法直接對影象空間操作,操作簡單,所以也是空間域濾波。 頻域濾波說到底最終可能是和空間域濾波實現相同的功能,比如實現影象的輪廓提取,在空間域濾波中我們使用一個拉普拉

    OpenCV影象的變換-(補番)

    前兩天剛剛寫完OpenCV中關於影象的離散傅立葉變換的程式碼,旨在解釋了程式碼中出現的諸多困難。而忽視了傅立葉本身的原理部分 實在是罪過。 關於傅立葉變換,網上有一個大名鼎鼎的看了還不懂就來掐死我的

    opencv學習(十五)之影象變換dft

    在學習訊號與系統或通訊原理等課程裡面可能對傅立葉變換有了一定的瞭解。我們知道傅立葉變換是把一個訊號從時域變換到其對應的頻域進行分析。如果有小夥伴還對傅立葉變換處於很迷糊的狀態,請戳這裡,非常通俗易懂。而在影象處理中也有傅立葉分析的概念,我這裡給出在其官方指導檔案

    python OpenCV學習筆記(二十五):變換(Fourier Transform )

    傅立葉變換用於分析各種濾波器的頻率特性。對於影象,二維離散傅立葉變換(2D Discrete Fourier Transform/DFT)用於尋找頻域。快速傅立葉變換(Fast Fourier Transform/FFT)的快速演算法用於計算DFT。

    OpenCV中的離散變換的解讀

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

    opencv實現變換

    const char* filename = argc >=2 ? argv[1] : "lena.jpg"; Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE); 原始影象: 獲

    OpenCV下利用變換和逆變換實現影象卷積演算法,並附自己對於卷積核/模板核算子的理解!

    學過訊號與系統的人都知道,卷積運算一般是轉化成頻率乘積再求逆來計算,因為這樣可以減少計算量,提高程式碼的效率。 影象卷積操作廣泛應用在影象濾波技術中。 影象卷積運算中一個重要概念是卷積核算子,它是模板核算子的一種,模板核算子實際上就是一個視窗矩陣,用這個視窗按畫素點滑動去

    影象變換與逆變換OpenCV實現

    程式碼步驟: 讀入影象->傅立葉變換->傅立葉逆變換->讀取影象 int main() { cv::Mat img = cv::imread("lena.jpg"); DFTtransform(img);

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

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