opencv采集图像并进行傅里叶变换

直接上代码,加注释......

// opencv_dft.cpp : 定义控制台应用程序的入口点。
// 运行环境:VS2015+opencv3.0
// 用摄影头采集图像,并进行离散傅里叶变换
// 采集的图像保存在 D:\\capture001.jpg

#include "stdafx.h"
#include<opencv2/opencv.hpp>
using namespace cv;

void f_trans(Mat f_img);
int main()
{
	VideoCapture capture(0);
	Mat img;
	capture >> img;//打开摄像头,并用img记录图像
	imshow("采集图像", img);
	//保存图像
	imwrite("D:\\capture001.jpg", img);

	//以灰度模式读取图像
	Mat f_img = imread("D:\\capture001.jpg", 0);
	//傅里叶变换处理
	f_trans(f_img);

	return 0;
}

//进行离散傅里叶变换处理
void f_trans(Mat f_img)
{
	if (f_img.data == NULL)
	{
		printf("读取图像错误,请检查图像是否存在!");
	}
	//将图像延扩到最佳尺寸(图像尺寸为2、3、5的倍数时,计算速度最快)
	int m = getOptimalDFTSize(f_img.rows);
	int n = getOptimalDFTSize(f_img.cols);
	//将延扩边界的像素初始化为0
	Mat padded;
	copyMakeBorder(f_img, padded, 0, m - f_img.rows, 0, n - f_img.cols, BORDER_CONSTANT, Scalar::all(0));

	//傅里叶变换的结果为复数,为其(实部和虚部)分配存储空间
	Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(),CV_32F) };
	Mat complex_img;
	merge(planes, 2, complex_img);//将单通道数组合并成一个多通道数组
	
	//傅里叶变换
	dft(complex_img, complex_img);

	//将复数转换成幅值,即幅度m=sqrt(re(dft(img))^2+im(dft(img)^2))
	split(complex_img, planes);//将一个多通道数组分离成单通道数组
	magnitude(planes[0], planes[1], planes[0]);
	Mat magnitude_img = planes[0];
	//对数尺度缩放,m'=log(1+m)
	magnitude_img += Scalar::all(1);
	log(magnitude_img, magnitude_img);

	//重分布幅度图像象限
	//若有奇数行或奇数列,进行频谱裁剪
	magnitude_img = magnitude_img(Rect(0, 0, magnitude_img.cols&-2, magnitude_img.rows&-2));
	//重排傅里叶图像中的象限,使原点位于图像中心
	int cx = magnitude_img.cols / 2;
	int cy = magnitude_img.rows / 2;
	Mat q0(magnitude_img, Rect(0, 0, cx, cy));//左上
	Mat q1(magnitude_img, Rect(cx, 0, cx, cy));//右上
	Mat q2(magnitude_img, Rect(0, cy, cx, cy));//左下
	Mat q3(magnitude_img, Rect(cx, cy, cx, cy));//右下
	//左上、右下象限交换
	Mat temp;
	q0.copyTo(temp);
	q3.copyTo(q0);
	temp.copyTo(q3);
	//左下、右上象限交换
	q1.copyTo(temp);
	q2.copyTo(q1);
	temp.copyTo(q2);

	//归一化,为了图像显示和方便计算
	normalize(magnitude_img, magnitude_img, 0, 1, NORM_MINMAX);
	
	//显示傅里叶变换效果图
	imshow("频谱幅值", magnitude_img);
	waitKey();
}

代码主要参考《OpenCV3编程入门》(毛星云编著),只是个人学习整理,所以注明转载。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值