对图像进行频域变换(傅里叶变换)

#include <iostream>
#include <opencv2/opencv.hpp>
#define WITH 600
#define  window1 "【原图】"
#define  window2 "【效果图1】"
#define  window3 "【效果图2】"
using namespace cv;
using namespace std;





//对图像进行频域变换。(傅里叶变换)

int main()
{
	//1.原图像。
	Mat src = imread("女战士.jpg",0);
	resize(src,src,Size(),0.4,0.4);
	imshow(window1,src);
	//2.扩充原图。getoptimalsize
	int x = getOptimalDFTSize(src.cols);
	int y = getOptimalDFTSize(src.rows);
	Mat g_src(y,x,CV_32FC2,Scalar(Scalar::all(0)));
	//3.填充扩充元素。copymakeborder
	vector<Mat>temp;
	split(g_src,temp);
	Mat roi = temp[0](Rect(0, 0, src.cols, src.rows));
	Mat_<float>(src).copyTo(roi);
	merge(temp,g_src);

	//4.离散傅里叶变换,注意图像应为32F双通道。
	dft(g_src,g_src,g_src.rows);
	//5.将复数转换为幅值。magnitude
	split(g_src,temp);
	magnitude(temp[0],temp[1],temp[0]);
	Mat mage = temp[0];
	
	//6.将幅值用对数来缩小。log
	mage += Scalar(Scalar::all(1));
	log(mage,mage);
	//7.归一化。
	normalize(mage,mage,0,1,NORM_MINMAX);
	//8.显示频谱图像。、、效果不好的话,可以将源点转换到中间。
	imshow(window2,mage);

	//9 将源点转换到中间。左上与右下,左下与右上交换。
	int cx = mage.cols/2;
	int cy = mage.rows/2;
	Mat lt = mage(Rect(0,0,cx,cy));
	Mat lb= mage(Rect(0,cy,cx,cy));
	Mat rt = mage(Rect(cx,0,cx,cy));
	Mat rb = mage(Rect(cx,cy,cx,cy));

	Mat t;
	lt.copyTo(t);
	rb.copyTo(lt);
	t.copyTo(rb);

	lb.copyTo(t);
	rt.copyTo(lb);
	t.copyTo(rt);

	imshow(window3,mage);
	waitKey(0);
	return 0;
	
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值