核心函数:cvDFT

程序:

wKioL1PsKuKgMhUzAADLkNsp1PQ852.jpg

代码:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
int DFT2(int argc,char** argv)  //离散傅里叶变换(Discrete Fourier Transform,缩写为DFT)
{
IplImage* src=cvLoadImage("e:\\picture\\4.jpg",0);
IplImage* Src32F=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* Dst32F=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* Dst32F_Inverse=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* DFTResult_32F=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* DFTResult=cvCreateImage(cvGetSize(src),8,1);
IplImage* src2=cvCreateImage(cvGetSize(src),8,1);
cvConvertScale(src,Src32F);
cvDFT(Src32F,Dst32F,CV_DXT_FORWARD);
cvDFT(Dst32F,Dst32F_Inverse,CV_DXT_INVERSE | CV_DXT_SCALE); //用CV_DXT_SCALE即可不做归一化处理
cvConvertScale(Dst32F_Inverse,src2);
//对傅里叶变换结果进行归一化以显示结果
double MaxVal=0;
double MinVal=0;
cvMinMaxLoc(Dst32F,&MinVal,&MaxVal);
double scale=255/(MaxVal-MinVal);
double shift=-MinVal*scale;
cvConvertScale(Dst32F,DFTResult_32F,scale,shift);
//把归一化的福利叶变换结果转换为8位以便显示
cvConvertScale(DFTResult_32F,DFTResult);
cvMinMaxLoc(DFTResult,&MinVal,&MaxVal);
std::cout<<"DFTResult Max:"<<MaxVal<<"DFTResult Max:"<<MinVal<<std::endl;
cvNamedWindow("src");
cvNamedWindow("src2");
cvNamedWindow("DFTResult");
cvShowImage("src",src);
cvShowImage("src2",src2);
cvShowImage("DFTResult",DFTResult);
cvWaitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("src2");
cvDestroyWindow("DFTResult");
cvReleaseImage(&src);
cvReleaseImage(&src2);
cvReleaseImage(&DFTResult);
return 0;
}