Opencv离散傅里叶变换

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值