opencv采集图像并进行傅里叶变换
2016-10-12 23:17
344 查看
直接上代码,加注释......
代码主要参考《OpenCV3编程入门》(毛星云编著),只是个人学习整理,所以注明转载。
// 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编程入门》(毛星云编著),只是个人学习整理,所以注明转载。
相关文章推荐
- opencv采集图像并进行轮廓检测
- 关于图像采集卡采集到图像到内存后怎样用Opencv进行图像处理
- opencv进行图像复原
- vs2013在图像处理中的应用(6):使用OpenCV进行图像处理
- 图像的属性,利用OpenCV进行图像的基本操作
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- opencv对图像像素进行操作
- OpenCV学习笔记---- 挨个读取图像文件夹下的所有文件,进行样本训练
- opencv学习笔记第五章 使用形态学滤波对图像进行开闭运算
- OpenCV中如何只对IplImage图像的数据进行处理
- 4 用python进行OpenCV实战之图像变换1(平移)
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
- OpenCV对图像进行缩放显示
- OpenCV用形态学方法进行图像线特征和角点的提取
- javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
- opencv 使用Mat 矩阵进行图像的降采样,像素的访问方式
- android开发在jni中使用Opencv进行图像处理,环境搭建篇
- opencv Mat 图像数据元素进行排序 、常见Mat数据元素统计计算
- opencv2使用形态学滤波对图像进行边缘及角点检测
- 调用opencv中BP神经网络来对图像进行分类