实验二傅里叶变换_第1页
实验二傅里叶变换_第2页
实验二傅里叶变换_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、f(x,y)在数字图像处理领域中, 该图像的频谱。二维离散傅里叶变换为:f(x,y)可以用来表示一幅图像,而F(u,v)就表示F (u ,v)二MNM -1 N -1 z zi =0 k =0j 2兀(f (x, y )euxM*vy)实验二傅里叶变换一、实验目的(1) 了解图像变换的意义和手段(2) 熟悉傅里叶变换的基本性质(3) 热练掌握FFT的方法和应用二、实验内容利用Visual C+编程实现数字图像的傅里叶变换。三、预备知识在实验一的基础之上。四、实验原理与步骤1傅里叶变换的原理正交变换的傅里叶变换是一种函数的正交变换, 如果将信号以函数来描述, 含义就是将一个函数分解成一组正交函数

2、的线性组合。对于二维信号,二维Fourier变换定义为::-j 2 二(ux vy )F ( u , v )=f(x,y)edxdyoOoO逆变换:j 2 i' ( ux 'vy )I JF(u,v)edudv其中,x=0,1,M-1,y=0,1,N-1 ,这里的M和N可以理解为图像的宽度 和高。从上式中可以看出,傅立叶变换的每一项即对于每一个 u和v, F(u , v) 的值都由函数的所有值之和构成。F(u , v)的值所覆盖的范围的域被称为频率域,F(u , v)中的每一项被称为变换的频率分量。 从欧拉公式中可以得出:ecos : j sinr再结合cos(-R二cos(H

3、sin(“)二-sin(d),所以傅立叶变换实际上是不同频率的正弦余弦乘以加权函数的积分,即:F(u,v)MNMVNVuxEE f (x, y)cos( (i =0 k =0Mvxux VX.-jsin(2(M N)2实验具体步骤(1)新建一个类 CFilterDFT,添加成员函数如下:函数名功能输入输出Execute完成FFT变换CBmp *pImage - 位图指针BOOLDFT_2D二维傅立叶变换(1) complex<double> * pSpaceData 图像数据的复数 形式(空间域)(2) int nWidthDFT 数据宽度(3) int nHeightDFT 数据

4、高度complex<double> * pFreque ncyData -傅立叶变换后的 结果(频率域)SetFreque ncyData在视图类中调用 该接口complex<double> *pFDatavoidBOOL CFilterDFT:Execute(CBmp *plmage) if(pImage = NULL)return FALSE;ASSERT(plmage->GetBitCou nt() = 8);/循环控制变量int x;int y;/图象的高度和宽度int nWidth = pImage->GetWidth();int nHeight

5、= pImage->GetHeight();int nWidthMemory = pImage->GetWidthMemory();/图像数据LPBYTE pImageData = pImage->GetBits();/ 临时变量 double dTemp;/ 傅立叶变换高度 ,2 的幂数 int nHeightDFT;/ 傅立叶变换宽度 ,2 的幂数 int nWidthDFT;2 的幂数 开始 -*/2 的幂数 结束 -*/* 计算傅立叶变换的宽度和高度,是dTemp = log(nWidth)/log(2);dTemp = ceil(dTemp);dTemp = pow

6、(2,dTemp);nWidthDFT = (int) dTemp;dTemp = log(nHeight)/log(2);dTemp = ceil(dTemp);dTemp = pow(2,dTemp); nHeightDFT = (int) dTemp;/* 计算傅立叶变换的宽度和高度,是/ 指向图象数据的指针LPBYTE lpSrc;/ 指向空间域数据的指针 complex<double> * pSpaceData;/ pFrequencyData 要从 SetFrequencyData 中设置/ 分配内存pSpaceData = new complex<double&

7、gt;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*nWidthDFT+x = complex<double>(0, 0);/ 把图象数据传给 pSpaceDatafor(y=0; y<n

8、Height; +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_2D(pSpaceData, nWidthDFT, nHeightDFT, pFrequencyData) ;/ 用傅立叶变换结果的模作为灰度值 for(y=

9、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(); dTemp = sqrt(dTemp) / nWidth;/除以因子 N/ 图像数据值小于 255 if(dTemp > 255)dTemp = 255; pIm

10、ageDatay*nWidth+x = (BYTE) dTemp;/ 释放内存delete pSpaceData; pSpaceData = NULL;return TRUE;void CFilterDFT:DFT_2D(complex<double> *pSpaceData, int nWidthDFT, int nHeightDFT, complex<double> *pFrequencyData)const double PI = 3.1415926;int m, n, x, y;double fCosTable;double fSinTable; complex

11、<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( -2*PI*( (double)m*x)/nWidthDFT + (double)n*y)/nHeightDFT) ) ; fSinTable=sin( -2*PI*( (double)m*x)

12、/nWidthDFT + (double)n*y)/nHeightDFT) ) ;dTemp += complex<double> (fCosTable, fSinTable) * pSpaceDatay*nWidthDFT+x;pFrequencyDatan*nWidthDFT+m = dTemp;/ 在视图类中调用该接口,传入 pFDatavoid CFilterDFT:SetFrequencyData(complex<double> *pFData)pFrequencyData = pFData;(2)在视图类中增加一个变量,用于存储频域变量的指针。 comple

13、x<double> *m_pFData;(3)新建一个菜单,菜单项目为 DFT ,与视图类的 OnFilterDft() 相关联。void CImageTestView:OnFilterDft()if(AfxMessageBox(" 傅立叶变换算法时间较长, n 建议选择小图像, n 确实要运行 DFT 吗? ",MB_YESNO) = IDNO)return ;CBmp *pImage = GetDocument()->GetImage();ASSERT(pImage != NULL);/ 判断是否是 8-bpp 位图if (pImage->Get

14、BitCount() != 8)/ 提示用户MessageBox(" 目前只支持 256 色的图像处理! ", "系统提示 " , MB_ICONINFORMATION | MB_OK);return;/更改光标形状BeginWaitCursor();/ 为频率域分配内存CFilterDFT *pFilter = new CFilterDFT;/ 判断是否要分配内存/ 图象的高度和宽度int nWidth = pImage->GetWidth();int nHeight = pImage->GetHeight();/ 傅立叶变换高度 ,2 的

15、幂数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(nHeight)/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 p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论