




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二 傅里叶变换一、 实验目的(1)了解图像变换的意义和手段(2)熟悉傅里叶变换的基本性质(3)热练掌握FFT的方法和应用二、 实验内容利用Visual C+编程实现数字图像的傅里叶变换。三、 预备知识在实验一的基础之上。四、 实验原理与步骤1 傅里叶变换的原理傅里叶变换是一种函数的正交变换,如果将信号以函数来描述,正交变换的含义就是将一个函数分解成一组正交函数的线性组合。对于二维信号,二维Fourier变换定义为:逆变换:在数字图像处理领域中,f(x,y)可以用来表示一幅图像,而F(u,v)就表示该图像的频谱。二维离散傅里叶变换为:其中, x=0,1,M-1,y=0,1, ,N-1,这里的
2、M和N可以理解为图像的宽度和高。从上式中可以看出, 傅立叶变换的每一项即对于每一个u和v,F(u,v)的值都由函数的所有值之和构成。F(u,v)的值所覆盖的范围的域被称为频率域, F(u,v)中的每一项被称为变换的频率分量。从欧拉公式中可以得出:再结合所以傅立叶变换实际上是不同频率的正弦余弦乘以加权函数的积分,即:2 实验具体步骤(1)新建一个类CFilterDFT,添加成员函数如下:函数名功能输入输出Execute完成FFT变换CBmp *pImage - 位图指针BOOLDFT_2D二维傅立叶变换(1)complex<double> * pSpaceData 图像数据的复数形式
3、(空间域)(2)int nWidthDFT 数据宽度(3)int nHeightDFT 数据高度complex<double> * pFrequencyData - 傅立叶变换后的结果(频率域)SetFrequencyData在视图类中调用该接口complex<double> *pFDatavoidBOOL CFilterDFT:Execute(CBmp *pImage) if(pImage = NULL) return FALSE; ASSERT(pImage->GetBitCount() = 8); / 循环控制变量 int x; int y; / 图象的高度
4、和宽度 int nWidth = pImage->GetWidth(); int nHeight = pImage->GetHeight(); int nWidthMemory = pImage->GetWidthMemory(); /图像数据 LPBYTE pImageData = pImage->GetBits(); / 临时变量 double dTemp; / 傅立叶变换高度,2的幂数 int nHeightDFT; / 傅立叶变换宽度,2的幂数 int nWidthDFT; /*-计算傅立叶变换的宽度和高度,是2的幂数-开始-*/ dTemp = log(nWi
5、dth)/log(2); dTemp = ceil(dTemp); dTemp = pow(2,dTemp); nWidthDFT = (int) dTemp; dTemp = log(nHeight)/log(2); dTemp = ceil(dTemp); dTemp = pow(2,dTemp); nHeightDFT = (int) dTemp; /*-计算傅立叶变换的宽度和高度,是2的幂数-结束-*/ / 指向图象数据的指针 LPBYTE lpSrc; / 指向空间域数据的指针 complex<double> * pSpaceData; / pFrequencyData
6、要从SetFrequencyData中设置 / 分配内存 pSpaceData = new complex<double>nWidthDFT * nHeightDFT; if (pSpaceData = NULL) | (pFrequencyData = NULL) return FALSE; /*- 初始化空间域数据-开始-*/ /* * 图象数据的宽和高不一定是2的整数次幂, * pSpaceData有一部分数据需要补0 */ for(y=0; y<nHeightDFT; +y) for(x=0; x<nWidthDFT; +x) pSpaceDatay*nWidt
7、hDFT+x = complex<double>(0, 0); / 把图象数据传给pSpaceData for(y=0; y<nHeight; +y) for(x=0; x<nWidth; +x) lpSrc = (LPBYTE) (pImageData + y * nWidthMemory + x) ; /空间域乘以pow(-1, x+y),频谱移至中心 pSpaceDatay*nWidthDFT+x = complex<double>(*lpSrc) /* pow(-1, x+y)*/,0); /*- 初始化空间域数据-结束-*/ /傅立叶变换 DFT_
8、2D(pSpaceData, nWidthDFT, nHeightDFT, pFrequencyData) ; / 用傅立叶变换结果的模作为灰度值 for(y=0; y<nHeight; +y) for(x=0; x<nWidth; +x) /取模 dTemp = pFrequencyDatay * nWidthDFT + x.real() * pFrequencyDatay * nWidthDFT + x.real() + pFrequencyDatay * nWidthDFT + x.imag() * pFrequencyDatay * nWidthDFT + x.imag()
9、; dTemp = sqrt(dTemp) / nWidth; /除以因子N / 图像数据值小于255 if(dTemp > 255) dTemp = 255; pImageDatay*nWidth+x = (BYTE) dTemp; / 释放内存 delete pSpaceData; pSpaceData = NULL; return TRUE;void CFilterDFT:DFT_2D(complex<double> *pSpaceData, int nWidthDFT, int nHeightDFT, complex<double> *pFrequency
10、Data) const double PI = 3.1415926; int m, n, x, y; double fCosTable; double fSinTable; complex<double> dTemp; for(n=0; n<nHeightDFT ; +n ) for(m=0 ; m<nWidthDFT ; +m ) dTemp = complex<double> (0.0, 0.0); for(y=0; y<nHeightDFT ; +y ) for(x=0 ; x<nWidthDFT ; +x ) fCosTable= cos
11、( -2*PI*( (double)m*x)/nWidthDFT + (double)n*y)/nHeightDFT) ) ; fSinTable= sin( -2*PI*( (double)m*x)/nWidthDFT + (double)n*y)/nHeightDFT) ) ; dTemp += complex<double> (fCosTable, fSinTable) * pSpaceDatay*nWidthDFT+x; pFrequencyDatan*nWidthDFT+m = dTemp; / 在视图类中调用该接口,传入pFDatavoid CFilterDFT:Set
12、FrequencyData(complex<double> *pFData) pFrequencyData = pFData;(2)在视图类中增加一个变量,用于存储频域变量的指针。complex<double> *m_pFData;(3)新建一个菜单,菜单项目为DFT,与视图类的OnFilterDft()相关联。void CImageTestView:OnFilterDft() if(AfxMessageBox("傅立叶变换算法时间较长,n建议选择小图像,n确实要运行DFT吗?",MB_YESNO) = IDNO) return ; CBmp *pI
13、mage = GetDocument()->GetImage(); ASSERT(pImage != NULL); / 判断是否是8-bpp位图 if (pImage->GetBitCount() != 8) / 提示用户 MessageBox("目前只支持256色的图像处理!", "系统提示" , MB_ICONINFORMATION | MB_OK); return; /更改光标形状 BeginWaitCursor(); / 为频率域分配内存 CFilterDFT *pFilter = new CFilterDFT; / 判断是否要分配内
14、存 / 图象的高度和宽度 int nWidth = pImage->GetWidth(); int nHeight = pImage->GetHeight(); / 傅立叶变换高度,2的幂数 int nHeightDFT; / 傅立叶变换宽度,2的幂数 int nWidthDFT; /*-计算傅立叶变换的宽度和高度,是2的幂数-开始-*/ double dTemp; dTemp = log(nWidth)/log(2); dTemp = ceil(dTemp); dTemp = pow(2,dTemp); nWidthDFT = (int) dTemp; dTemp = log(n
15、Height)/log(2); dTemp = ceil(dTemp); dTemp = pow(2,dTemp); nHeightDFT = (int) dTemp; /*-计算傅立叶变换的宽度和高度,是2的幂数-结束-*/ if(m_pFData != NULL) delete m_pFData; m_pFData = NULL; / 为傅立叶变换结果分配内存 m_pFData = new complex<double>nWidthDFT * nHeightDFT; if(m_pFData = NULL) AfxMessageBox("分配内存失败!"); return; else / 传给类CFilterDFT pFilter->SetFre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国水晶客房灯市场调查研究报告
- 2025年中国无纺布折叠袋市场调查研究报告
- 2025年中国广告白花浆市场调查研究报告
- 2025年中国大小盆市场调查研究报告
- 2025年中国印花/染色棉弹布市场调查研究报告
- 小吃餐饮培训合同协议
- 私人借贷保证合同协议
- 商用摩托买卖协议合同书
- 工厂内清理垃圾合同协议
- 确定行政行为合同协议
- 2024年浙江省海港投资运营集团有限公司招聘笔试冲刺题(带答案解析)
- 将军饮马18道典型习题
- YY/T 1256-2024解脲脲原体核酸检测试剂盒
- 钢筋优化技术创效手册(2022年)
- 美丽的西双版纳课件
- 调到新单位的简短发言8篇
- (2024年)初中七年级历史学习心得交流
- 员工心理健康与调适课件
- 学校心肺复苏
- 动火作业安全检查表
- 餐饮督导培训课件
评论
0/150
提交评论