《实验三-图像的傅立叶变换.doc》由会员分享,可在线阅读,更多相关《实验三-图像的傅立叶变换.doc(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date实验三-图像的傅立叶变换(课程名称)教学大纲实验三、图像的傅立叶变换一、实验目的1了解图像变换的意义和手段;2熟悉傅里叶变换的基本性质;3熟练掌握FFT的方法及应用;4通过实验了解二维频谱的分布特点;5通过本实验掌握编程实现数字图像的傅立叶变换。二、实验原理1应用傅立叶变换进行图像处理傅里叶变换是线性系统分析的一个有力工具,它能够定量地分析诸如数字化系统、采样点、电子
2、放大器、卷积滤波器、噪音和显示点等的作用。通过实验培养这项技能,将有助于解决大多数图像处理问题。对任何想在工作中有效应用数字图像处理技术的人来说,把时间用在学习和掌握博里叶变换上是很有必要的。2傅立叶(Fourier)变换的定义对于二维信号,二维Fourier变换定义为:二维离散傅立叶变换为:图像的傅立叶变换与一维信号的傅立叶变换变换一样,有快速算法,具体参见参考书目,有关傅立叶变换的快速算法的程序不难找到。实际上,现在有实现傅立叶变换的芯片,可以实时实现傅立叶变换。三、实验内容1.根据二维离散Fourier变换的定义编写程序2.实现图象的变换3.画出图象的频谱图。2提交实验的原始图像和结果图
3、像。3报告内容主要是将原理与实验现象相结合,利用原理简要解释观察到的现象。六、思考题1傅里叶变换有哪些重要的性质?2图像的二维频谱在显示和处理时应注意什么?1. 源程序:/ MyDIPView.cpp : implementation of the CMyDIPView class/#include stdafx.h#include MyDIP.h#include MyDIPDoc.h#include MyDIPView.h#include math.h#includeusing namespace std;#define PI 3.14159#ifdef _DEBUG#define new
4、DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/* * * 函数名称: * FFT() * * 参数: * complex * TD- 指向时域数组的指针 * complex * FD- 指向频域数组的指针 * r2的幂数,即迭代次数 * * 返回值: * 无。 * * 说明: * 该函数用来实现快速付立叶变换。 * */VOID WINAPI FFT(complex * TD, complex * FD, int r)/ 付立叶变换点数LONGcount;/ 循环变量inti,j,k;/ 中间变量intbfsize
5、,p;/ 角度doubleangle;complex *W,*X1,*X2,*X;/ 计算付立叶变换点数count = 1 r;/ 分配运算所需存储器W = new complexcount / 2;X1 = new complexcount;X2 = new complexcount;/ 计算加权系数for(i = 0; i count / 2; i+)angle = -i * PI * 2 / count;Wi = complex (cos(angle), sin(angle);/ 将时域点写入X1memcpy(X1, TD, sizeof(complex) * count);/ 采用蝶形
6、算法进行快速付立叶变换for(k = 0; k r; k+)for(j = 0; j 1 k; j+)bfsize = 1 (r-k);for(i = 0; i bfsize / 2; i+)p = j * bfsize;X2i + p = X1i + p + X1i + p + bfsize / 2;X2i + p + bfsize / 2 = (X1i + p - X1i + p + bfsize / 2) * Wi * (1k);X = X1;X1 = X2;X2 = X;/ 重新排序for(j = 0; j count; j+)p = 0;for(i = 0; i r; i+)if (
7、j&(1i)p+=1(r-i-1);FDj=X1p;/ 释放内存delete W;delete X1;delete X2;/* * * 函数名称: * Fourier() * * 参数: * LPSTR lpDIBBits - 指向源DIB图像指针 * LONG lWidth - 源图像宽度(象素数) * LONG lHeight - 源图像高度(象素数) * * 返回值: * BOOL - 成功返回TRUE,否则返回FALSE。 * * 说明: * 该函数用来对图像进行付立叶变换。 * BOOL WINAPI Fourier(LPSTR lpDIBBits, LONG lWidth, LON
8、G lHeight)/ 指向源图像的指针unsigned char*lpSrc;/ 中间变量doubledTemp;/ 循环变量LONGi;LONGj;/ 进行付立叶变换的宽度和高度(2的整数次方)LONGw;LONGh;intwp;inthp;/ 图像每行的字节数LONGlLineBytes;/ 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8);/ 赋初值w = 1;h = 1;wp = 0;hp = 0;/ 计算进行付立叶变换的宽度和高度(2的整数次方)while(w * 2 = lWidth)w *= 2;wp+;while(h * 2 = lH
9、eight)h *= 2;hp+;/ 分配内存complex *TD = new complexw * h;complex *FD = new complexw * h;/ 行for(i = 0; i h; i+)/ 列for(j = 0; j w; j+)/ 指向DIB第i行,第j个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;/ 给时域赋值TDj + w * i = complex(*(lpSrc), 0);for(i = 0; i h; i+)/ 对y方向进行快速付立叶变换FFT(&
10、TDw * i, &FDw * i, wp);/ 保存变换结果for(i = 0; i h; i+)for(j = 0; j w; j+)TDi + h * j = FDj + w * i;for(i = 0; i w; i+)/ 对x方向进行快速付立叶变换FFT(&TDi * h, &FDi * h, hp);/ 行for(i = 0; i h; i+)/ 列for(j = 0; j 255)/ 对于超过的,直接设置为255dTemp = 255;/ 指向DIB第(ih/2 ? i+h/2 : i-h/2)行,第(jw/2 ? j+w/2 : j-w/2)个象素的指针/ 此处不直接取i和j,
11、是为了将变换后的原点移到中心/lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - (ih/2 ? i+h/2 : i-h/2) + (jm_hDIB = NULL)return ;/ TODO: add draw code for native data hereint i,j; unsigned char *lpSrc;LPSTR lpDIB = (LPSTR) :Global
12、Lock(HGLOBAL) pDoc-m_hDIB);int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - xint cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - yLPSTR lpDIBBits=:FindDIBBits (lpDIB);/ 计算图像每行的字节数long lLineBytes = WIDTHBYTES(cxDIB * 8);/ 每行for(i = 0; i cyDIB; i+)/ 每列for(j = 0; j m_hDIB);CRect rect(0,0,cxDIB,cyDI
13、B), rcDIB(0,0,cxDIB,cyDIB);:PaintDIB(pDC-m_hDC, &rect, pDoc-m_hDIB, &rcDIB, pDoc-m_palDIB);/ CMyDIPView printingBOOL CMyDIPView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CMyDIPView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add ext
14、ra initialization before printingvoid CMyDIPView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add cleanup after printing/ CMyDIPView diagnostics#ifdef _DEBUGvoid CMyDIPView:AssertValid() constCScrollView:AssertValid();void CMyDIPView:Dump(CDumpContext& dc) constCScrollView:Dump(dc);CMyD
15、IPDoc* CMyDIPView:GetDocument() / non-debug version is inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyDIPDoc);return (CMyDIPDoc*)m_pDocument;#endif /_DEBUGvoid CMyDIPView:OnMenuitem32778() / 图像付立叶变换/ 获取文档CMyDIPDoc* pDoc = GetDocument();/ 指向DIB的指针LPSTRlpDIB;/ 指向DIB象素指针LPSTR lpDIBBits;/ 锁定DIBlpDIB
16、 = (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHDIB();/ 找到DIB图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/ 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的付立叶变换,其它的可以类推)if (:DIBNumColors(lpDIB) != 256)/ 提示用户MessageBox(目前只支持256色位图的付立叶变换!, 系统提示 ,MB_ICONINFORMATION | MB_OK);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 返回return;/
17、 更改光标形状BeginWaitCursor();/ 调用Fourier()函数进行付立叶变换if (:Fourier(lpDIBBits, :DIBWidth(lpDIB), :DIBHeight(lpDIB)/ 设置脏标记pDoc-SetModifiedFlag(TRUE);/ 更新视图pDoc-UpdateAllViews(NULL);else/ 提示用户MessageBox(分配内存失败!, 系统提示 , MB_ICONINFORMATION | MB_OK);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 恢复光标EndWaitCursor
18、();2.程序运行结果截图实验原始图像:一次傅里叶变换第二次傅里叶变换第三次傅里叶变换3.傅立叶变换的性质及意义傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一
19、片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。另外:1、图像经过二维傅立叶变换后,其变换系数矩阵表明: 若变换矩阵Fn原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅立叶变换矩阵Fn的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。 2 、变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)。FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。-