机器学习实践系列之14
来源:互联网 发布:mac 最好的五笔输入法 编辑:程序博客网 时间:2024/05/18 03:49
关于 傅里叶变换,讲的太多了,这里我就不再啰嗦一遍了,原理的东西大家可以搜一下,推荐一篇文章:
如果看了此文你还不懂傅里叶变换,那就过来掐死我吧
这篇文章写得很不错了,从 频域 到傅里叶级数 讲的都比较细,而且都有配图,真看不懂的话就 你掐死他吧!
(PS:冤冤相报何时了,我在一旁看热闹,横批:不嫌事大)
看下效果(居然暴漏了自己的迅雷,哈哈):
参考代码:
/* linolzhang 2013.11 基于OpenCV的傅里叶变换及逆变换*/#include <iostream> #include "opencv2/highgui/highgui.hpp" #pragma comment(lib,"opencv_core2410.lib") #pragma comment(lib,"opencv_highgui2410.lib") //傅里叶正变换void fft2(IplImage *src, IplImage *dst){// 实部、虚部IplImage *image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);IplImage *image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);IplImage *Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);cvConvertScale(src, image_Re); // 实部变换 u8 -> 64fcvZero(image_Im); // 虚部变换 -> 0// MergecvMerge(image_Re, image_Im, 0, 0, Fourier);// DFT计算傅里叶变换cvDFT(Fourier, dst, CV_DXT_FORWARD);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);cvReleaseImage(&Fourier);}void fft2shift(IplImage *src, IplImage *dst){IplImage *image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);IplImage *image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);cvSplit(src, image_Re, image_Im, 0, 0);// 具体原理见冈萨雷斯《数字图像处理》p123// Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)// 计算傅里叶谱cvPow(image_Re, image_Re, 2.0);cvPow(image_Im, image_Im, 2.0);cvAdd(image_Re, image_Im, image_Re);cvPow(image_Re, image_Re, 0.5);// 对数变换以增强灰度级细节(这种变换使以窄带低灰度输入图像值映射// 一宽带输出值,具体可见冈萨雷斯数字图像处理p62)// Compute log(1 + Mag);cvAddS(image_Re, cvScalar(1.0), image_Re); // 1 + MagcvLog(image_Re, image_Re); // log(1 + Mag)// Rearrange the quadrants of Fourier image so that the origin is at the image centerint cy = src->height / 2;int cx = src->width / 2;// CV_IMAGE_ELEM为OpenCV定义的宏,用来读取图像的像素值,这一部分就是进行中心变换for(int j=0; j<cy; j++){for(int i=0; i<cx; i++){// 中心化,将整体份成四块进行对角交换double tmp13 = CV_IMAGE_ELEM( image_Re, double, j, i);CV_IMAGE_ELEM( image_Re, double, j, i) = CV_IMAGE_ELEM(image_Re, double, j+cy, i+cx);CV_IMAGE_ELEM( image_Re, double, j+cy, i+cx) = tmp13;double tmp24 = CV_IMAGE_ELEM( image_Re, double, j, i+cx);CV_IMAGE_ELEM( image_Re, double, j, i+cx) = CV_IMAGE_ELEM( image_Re, double, j+cy, i);CV_IMAGE_ELEM( image_Re, double, j+cy, i) = tmp24;}}// 归一化处理将矩阵的元素值归一为[0,255]// [(f(x,y)-minVal)/(maxVal-minVal)]*255double minVal = 0, maxVal = 0;// Localize minimum and maximum valuescvMinMaxLoc( image_Re, &minVal, &maxVal );// Normalize image (0 - 255) to be observed as an u8 imagedouble scale = 255/(maxVal - minVal);double shift = -minVal * scale;cvConvertScale(image_Re, dst, scale, shift);cvReleaseImage(&image_Re);cvReleaseImage(&image_Im);}int main(int argc, char** argv){IplImage *src = NULL;if(argc != 2) src = cvLoadImage("1.jpg", 0); // 加载源图像,转为单通道else src = cvLoadImage(argv[1], 0); IplImage *Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2); // 傅里叶系数IplImage *dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);IplImage *ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);IplImage *ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);IplImage *Image = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);IplImage *ImageDst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);fft2(src,Fourier); // 傅里叶变换fft2shift(Fourier, Image); // 中心化cvDFT(Fourier,dst,CV_DXT_INV_SCALE); // 实现傅里叶逆变换,并对结果进行缩放cvSplit(dst,ImageRe,ImageIm,0,0);// 对数组每个元素平方并存储在第二个参数中cvPow(ImageRe,ImageRe,2); cvPow(ImageIm,ImageIm,2);cvAdd(ImageRe,ImageIm,ImageRe,NULL);cvPow(ImageRe,ImageRe,0.5);double m,M;cvMinMaxLoc(ImageRe,&m,&M,NULL,NULL);double scale = 255/(M - m);double shift = -m * scale;// 将shift加在ImageRe各元素按比例缩放的结果上,存储为ImageDstcvConvertScale(ImageRe,ImageDst,scale,shift);cvShowImage("源图像",src); cvShowImage("傅里叶谱",Image);cvShowImage("傅里叶逆变换",ImageDst);cvWaitKey(0);// 释放资源cvReleaseImage(&src);cvReleaseImage(&Image);cvReleaseImage(&ImageIm);cvReleaseImage(&ImageRe);cvReleaseImage(&Fourier);cvReleaseImage(&dst);cvReleaseImage(&ImageDst);return 0;}
2 0
- 机器学习实践系列之14
- 机器学习实践系列之1 - dlib
- 机器学习实践系列之2 - GPUImage
- 机器学习实践系列之13
- 机器学习实践系列之15
- 机器学习实践系列之16
- 机器学习实践系列之5
- 机器学习实践系列之12 - OpenCV之三维重建
- 机器学习实践系列之5 - 目标跟踪
- 机器学习实践系列之6 - OpenCV实战光流
- 机器学习实践系列之7 - 车辆检测
- 机器学习实践系列之8 - 人眼定位
- 机器学习实践系列之9 - 视频结构化
- 机器学习实践系列之10 - OpenCV实战立体视觉
- 机器学习系列之决策树
- 机器学习系列之最小二乘法
- 机器学习实践系列之3 - 人脸对齐(上)
- 机器学习实践系列之4 - 人脸对齐(下)
- 欢迎使用CSDN-markdown编辑器
- leecoda第二题
- 9.13 C和C++ 13.8编写一个智能指针类
- SQL Server 提高执行效率的16种方法
- 2017.03.02 线程的关闭
- 机器学习实践系列之14
- oj2017: 排序问题
- 算法训练 统计字符次数
- Tomact配置(详细)
- C++递归算法经典实例详解
- 网球追踪器
- $(function(){});只加载一次,jQuery预加载函数只加载了一次问题
- 3 faster rcnn的anchor产生问题
- 算法训练 数的统计