傅里叶变换

/*傅里叶变换*/
#include<opencv2\opencv.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
	Mat img = imread("D://图片//5.jpg");
	if (img.empty())
		return -1;
	cvtColor(img, img, CV_BGR2GRAY);

	Mat tempic = img.clone();
	int r = getOptimalDFTSize(img.rows);  //尺寸是2,3,5的倍数时处理速度最快,得到合适的尺寸
	int c = getOptimalDFTSize(img.cols);

	Mat padded;
	copyMakeBorder(tempic, padded, 0, r - img.rows, 0, c - img.cols, BORDER_CONSTANT, Scalar::all(0)); //填充,填充纯色对结果影响不大
	Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) };   //dft要分别计算实部和虚部,把要处理的图像作为输入的实部、一个全零的图像作为输入的虚部
	Mat complex;
	merge(planes, 2, complex);  //dft()输入和输出应该分别为单张图像,所以要先用merge()把实虚部图像合并,分别处于图像complex的两个通道内,计算得到的实虚部仍然保存在complex的两个通道内
	dft(complex, complex);

	split(complex, planes);

	magnitude(planes[0], planes[1], planes[0]);   //magnitude = sqrt(Re(DFT)^2 + Im(DFT)^2)
	Mat result = planes[0];

	result += Scalar::all(1);
	log(result, result);    //幅度的变化范围很大,容易造成一大片漆黑,只有几个点很亮。所以要用log函数把数值的范围缩小,但是仍然不能保证在[0,255]之间
	result = result(Rect(0, 0, result.cols & -2, result.rows & -2));

	int center_x = result.cols / 2;
	int center_y = result.rows / 2;

	Mat q0(result, Rect(0, 0, center_x, center_y));   // dft()直接获得的结果低频部分位于四角,高频部分位于中间,把图像做四等份,互相对调,让频域原点位于中心
	Mat q1(result, Rect(center_x, 0, center_x, center_y));
	Mat q2(result, Rect(0, center_y, center_x, center_y));
	Mat q3(result, Rect(center_x, center_y, center_x, center_y));

	Mat temp;
	q0.copyTo(temp);
	q3.copyTo(q0);
	temp.copyTo(q3);

	q1.copyTo(temp);
	q2.copyTo(q1);
	temp.copyTo(q2);

	normalize(result, result, 0, 1, CV_MINMAX);    //投射到[0,1],再通过convertTo转到[0,255]
	Mat res;
	result.convertTo(res, CV_8U);

	imshow("result", result);
	destroyAllWindows;
	waitKey(0);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值