日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv 中 快速傅里叶变换 FFT

發布時間:2025/3/21 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 中 快速傅里叶变换 FFT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

opencv 中 傅里葉變換 FFT,代碼如下:

void fft2(IplImage *src, IplImage *dst) { //實部、虛部IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0;// int i, j;image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //實部//Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //虛部//2 channels (image_Re, image_Im)Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);// Real part conversion from u8 to 64f (double)cvConvertScale(src, image_Re);// Imaginary part (zeros)cvZero(image_Im);// Join real and imaginary parts and stock them in Fourier imagecvMerge(image_Re, image_Im, 0, 0, Fourier);// Application of the forward Fourier transformcvDFT(Fourier, dst, CV_DXT_FORWARD);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);cvReleaseImage(&Fourier); }void fft2shift(IplImage *src, IplImage *dst) {IplImage *image_Re = 0, *image_Im = 0;int nRow, nCol, i, j, cy, cx;double scale, shift, tmp13, tmp24;image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);//Imaginary partimage_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);cvSplit( src, image_Re, image_Im, 0, 0 );//具體原理見岡薩雷斯數字圖像處理p123// Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)//計算傅里葉譜cvPow( image_Re, image_Re, 2.0);cvPow( image_Im, image_Im, 2.0);cvAdd( image_Re, image_Im, image_Re);cvPow( image_Re, image_Re, 0.5 );//對數變換以增強灰度級細節(這種變換使以窄帶低灰度輸入圖像值映射//一寬帶輸出值,具體可見岡薩雷斯數字圖像處理p62)// Compute log(1 + Mag);cvAddS( image_Re, cvScalar(1.0), image_Re ); // 1 + MagcvLog( image_Re, image_Re ); // log(1 + Mag)//Rearrange the quadrants of Fourier image so that the origin is at the image centernRow = src->height;nCol = src->width;cy = nRow/2; // image centercx = nCol/2;//CV_IMAGE_ELEM為OpenCV定義的宏,用來讀取圖像的像素值,這一部分就是進行中心變換for( j = 0; j < cy; j++ ){for( i = 0; i < cx; i++ ){//中心化,將整體份成四塊進行對角交換tmp13 = CV_IMAGE_ELEM( image_Re, double, j, i);CV_IMAGE_ELEM( image_Re, double, j, i) = CV_IMAGE_ELEM(image_Re, double, j+cy, i+cx);CV_IMAGE_ELEM( image_Re, double, j+cy, i+cx) = tmp13;tmp24 = CV_IMAGE_ELEM( image_Re, double, j, i+cx);CV_IMAGE_ELEM( image_Re, double, j, i+cx) =CV_IMAGE_ELEM( image_Re, double, j+cy, i);CV_IMAGE_ELEM( image_Re, double, j+cy, i) = tmp24;}}//歸一化處理將矩陣的元素值歸一為[0,255]//[(f(x,y)-minVal)/(maxVal-minVal)]*255double minVal = 0, maxVal = 0;// Localize minimum and maximum valuescvMinMaxLoc( image_Re, &minVal, &maxVal );// Normalize image (0 - 255) to be observed as an u8 imagescale = 255/(maxVal - minVal);shift = -minVal * scale;cvConvertScale(image_Re, dst, scale, shift);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im); }void CCVMFCView::OnFuliyeTransform() {IplImage *src;IplImage *Fourier; //傅里葉系數IplImage *dst ;IplImage *ImageRe;IplImage *ImageIm;IplImage *Image;IplImage *ImageDst;double m,M;double scale;double shift;//src = workImg;if(workImg->nChannels==3)OnColorToGray();src=cvCreateImage(cvGetSize(workImg),IPL_DEPTH_64F,workImg->nChannels); //源圖像imageClone(workImg,&src);cvFlip(src);Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);Image = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);ImageDst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);fft2(src,Fourier); //傅里葉變換fft2shift(Fourier, Image); //中心化cvDFT(Fourier,dst,CV_DXT_INV_SCALE);//實現傅里葉逆變換,并對結果進行縮放cvSplit(dst,ImageRe,ImageIm,0,0);cvNamedWindow("源圖像",0);cvShowImage("源圖像",src); //對數組每個元素平方并存儲在第二個參數中cvPow(ImageRe,ImageRe,2); cvPow(ImageIm,ImageIm,2);cvAdd(ImageRe,ImageIm,ImageRe,NULL);cvPow(ImageRe,ImageRe,0.5);cvMinMaxLoc(ImageRe,&m,&M,NULL,NULL);scale = 255/(M - m);shift = -m * scale;//將shift加在ImageRe各元素按比例縮放的結果上,存儲為ImageDstcvConvertScale(ImageRe,ImageDst,scale,shift);cvNamedWindow("傅里葉譜",0);cvShowImage("傅里葉譜",Image);cvNamedWindow("傅里葉逆變換",0);cvShowImage("傅里葉逆變換",ImageDst);//釋放圖像cvWaitKey(10000);cvReleaseImage(&src);cvReleaseImage(&Image);cvReleaseImage(&ImageIm);cvReleaseImage(&ImageRe);cvReleaseImage(&Fourier);cvReleaseImage(&dst);cvReleaseImage(&ImageDst);Invalidate(); }

from:?http://blog.csdn.net/abcjennifer/article/details/7359952

總結

以上是生活随笔為你收集整理的opencv 中 快速傅里叶变换 FFT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。