#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("1.jpg", 0);
namedWindow("【原图】");
moveWindow("【原图】", 0, 0);
imshow("【原图】", srcImage);
//得到图像合适的尺寸,以便得到最快的处理速度
int comfRows = getOptimalDFTSize(srcImage.rows);
int comfCols = getOptimalDFTSize(srcImage.cols);
//剪裁到合适的尺寸
Mat dstImage;
copyMakeBorder(srcImage, dstImage, 0, comfRows - srcImage.rows, 0, comfCols - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));
//因为傅里叶变换结果是一个复数,在这里就是输出两个Mat类型的变量,所以需要用容器去存放这两个变量
Mat plannes[] = { Mat_<float>(dstImage), Mat::zeros(dstImage.size(), CV_32F) };
Mat complexImage;
merge(plannes, 2, complexImage);
//进行离散傅里叶变换
dft(complexImage, complexImage);
//对计算计算出来的复数 求 幅值
split(complexImage, plannes);
//将结果保存在Mat 类型的变量 中
Mat magnitudeImage;
magnitude(plannes[0], plannes[1], magnitudeImage);
//为了显示出幅值,进行以下操作
//1、进行对数尺度缩放
magnitudeImage += Scalar::all(1);
log(magnitudeImage, magnitudeImage);
//2、之前的步骤中,对图像进行了扩展,现在,需要将扩展的截去
magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));
//3、重新分布幅度图 象限
//中心
int center_x = magnitudeImage.cols / 2;
int center_y = magnitudeImage.rows / 2;
//定义象限
Mat q0 = magnitudeImage(Rect(0, 0, center_x, center_y));
Mat q1 = magnitudeImage(Rect(center_x, 0, center_x, center_y));
Mat q2 = magnitudeImage(Rect(0, center_y, center_x, center_y));
Mat q3 = magnitudeImage(Rect(center_x, center_y, center_x, center_y));
//4、交换象限
Mat temp;
q0.copyTo(temp);
q3.copyTo(q0);
temp.copyTo(q3);
q1.copyTo(temp);
q2.copyTo(q1);
temp.copyTo(q2);
//5、归一化处理
normalize(magnitudeImage, magnitudeImage, 0, 1, CV_MINMAX);
imshow("【傅里叶变换】", magnitudeImage);
waitKey(0);
return 0;
}
Opencv离散傅里叶变换
最新推荐文章于 2022-06-23 23:37:35 发布