当前位置:首页 > OpenCV图像的离散傅里叶变换
《OpenCV图像处理》
---上机实验报告 2
图像的离散傅里叶变换
一、 实验名称:
图像的离散傅里叶变换
二、 实验目的:
1、进一步学习OpenCV的使用方法;
2、学会计算以及显示傅里叶变换后的幅度图像。
三、 实验内容:
1、学习有关傅立叶变换的知识;
2、计算并显示傅立叶变换后的幅度图像。
四、 实验原理:
对一张图像使用傅里叶变换就是将它分解成正弦和余弦两部分,也就是将图像从空间域转换到频域,这一转换的理论基础来自于以下事实:任一函数都可以表示成无数个正弦和余弦函数的和的形式。傅里叶变换就是一个用来将函数分解的工具。计算以及显示傅里叶变换后的幅度图像的步骤如下: 1、将图像延扩到最佳尺寸
2、为傅立叶变化的结果分配空间 3、进行离散傅立叶变换 4、将复数转换为幅度 5、对数尺度缩放
6、剪切和重分布幅度图象限
五、 实验运行环境:
Windows7操作系统,Microsoft Visual C++ 2008 Express Edition
六、实验源代码:
#include
#include \ #include \ #include \ #include
int main(int argc,char**argv) {
const char*filename=argc>=2?argv[1]:\; Mat I=imread(filename,CV_LOAD_IMAGE_GRAYSCALE); if(I.empty())
return -1; Mat padded;
}
int m=getOptimalDFTSize(I.rows);
copyMakeBorder(I,padded,0,m-I.rows,0,n-I.cols,BORDER_CONSTANT,Scalar::all(0));
int n=getOptimalDFTSize(I.cols);
Mat planes[]={Mat_
merge(planes,2,complexI);
dft(complexI,complexI); split(complexI,planes); Mat magI=planes[0]; magI+=Scalar::all(1); log(magI,magI);
magI=magI(Rect(0,0,magI.cols&-2,magI.rows&-2)); int cx=magI.cols/2;
Mat q0(magI,Rect(0,0,cx,cy)); Mat q1(magI,Rect(cx,0,cx,cy)); Mat q2(magI,Rect(0,cy,cx,cy)); Mat q3(magI,Rect(cx,cy,cx,cy)); Mat tmp; q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q2.copyTo(q1); tmp.copyTo(q2);
normalize(magI,magI,0,1,CV_MINMAX);
magnitude(planes[0],planes[1],planes[0]);
int cy=magI.rows/2;
q1.copyTo(tmp);
imshow(\,I); waitKey(); return 0;
imshow(\,magI);
七、实验结果:
八、实验总结:
通过本次实验,我又一次学到了一种图像处理的方法,学会计算以及显示傅里叶变换后的幅度图像,我熟悉了对图片的傅立叶变换的操作和具体代码,写代码期间遇到过很多问题,通过查阅书籍和资料都一一改正了过来,总之,代码还是不太熟悉,还有待于进一步提高。
共分享92篇相关文档