您的位置:首页 > 运维架构

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

2016-10-12 23:17 344 查看
直接上代码,加注释......

// 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编程入门》(毛星云编著),只是个人学习整理,所以注明转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: