源码:
##名称:离散傅里叶变换
##平台:QT5.7.1+opencv3.2.0
##日期:2017年12月13、
/**** 新建QT控制台程序****/
#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
//读入原始图像
Mat srcImage = imread("/home/ttwang/Valley_logo.jpg",0);
imshow("srcImage",srcImage);
/****将图像扩大到合适尺寸********/
int m = getOptimalDFTSize(srcImage.rows);
int n = getOptimalDFTSize(srcImage.cols);
Mat padded;
copyMakeBorder(srcImage,padded,0,m-srcImage.rows,0,n-srcImage.cols,BORDER_CONSTANT,
Scalar::all(0));
/******为傅里叶变换的结果(实部和虚部)分配存储空间******/
Mat planes[] = {Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F)};
Mat complexI;
merge(planes,2,complexI);
/********进行傅里叶变换*********/
dft(complexI,complexI);
/*********将复数转化为幅值***********/
split(complexI,planes);
magnitude(planes[0],planes[1],planes[0]);
Mat magnitudeImage = planes[0];
/**********进行对数尺度**********/
magnitudeImage += Scalar::all(1);
log(magnitudeImage,magnitudeImage);
/*******剪切和重分布幅度图象限 ******/
magnitudeImage = magnitudeImage(Rect(0,0,magnitudeImage.cols & -2,magnitudeImage.rows & -2));
int cx = magnitudeImage.cols / 2;
int cy = magnitudeImage.rows /2;
Mat q0(magnitudeImage,Rect(0,0,cx,cy));
Mat q1(magnitudeImage,Rect(cx,0,cx,cy));
Mat q2(magnitudeImage,Rect(0,cy,cx,cy));
Mat q3(magnitudeImage,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);
/********归一化********/
normalize(magnitudeImage,magnitudeImage,0,1,NORM_MINMAX);
/******显示效果图******/
imshow("magnitudeImage",magnitudeImage);
waitKey(0);
return 0;
}
运行结果:
效果图 原图