图像傅里叶变换、反变换的实现

时间:2023-05-01 12:36:09 资料 我要投稿
  • 相关推荐

图像傅里叶变换、反变换的实现

课程大作业实验报告

图像傅里叶变幻、反变换的实现

课程名称:数字图像处理

组 长: 王文雄 学号:200730590323 年级专业班级:07通信3班 成员一: 庞柱坚 学号:200730590318 年级专业班级:07通信3班 成员二: 王弥光 学号:200730590322 年级专业班级: 07通信3班 成员三: 学号: 年级专业班级:07通信3班

指导教师 邓继忠

报告提交日期

2010年 6 月1日

项目答辩日期

2010年 6 月1日

目 录

1. 项目要求............................................................... 3 2. 项目开发环境........................................................... 3 3. 系统分析............................................................... 3 3.1. 系统的主要功能分析 ............................................... 3 3.2. 系统的关键问题及解决方法(或思路) ............................... 6 4. 系统设计............................................................... 8 4.1. 程序流程图及说明 ................................................... 8 4.2. 程序主要模块(或功能)介绍 ........................................ 10 4.2.1. 一维 FFT 和 IFFT ............................................. 10 4.2.2. 二维图像 FFT 和 IFFT: ....................................... 11 5. 实验结果与分析........................................................ 12 5.1. 实验结果 .......................................................... 12 5.2. 项目的创新之处 .................................................... 13 5.3. 存在问题及改进设想 ................................................ 13 6. 心得体会.............................................................. 14 6.1. 系统开发的体会 .................................................... 14 6.2. 对本门课程的改进意见或建议 ........................................ 14 7. 附件一................................................................ 15

1. 项目要求

1.基本要求:自修教材相关内容(P52-74)或其它参考资料,在CVI下编程对尺寸为2N(N为正整数)的图像进行FFT(快速傅里叶变换)和(快速傅里叶反变换)。 (不能利用CVI下的函数)

2.题目拓展:编程实现任意大小图像的二维傅立叶的变换与反变换。

2. 项目开发环境

项目开发环境主要分为软件环境和硬件环境

软件:Lab Windows/CVI和IMAQ_Vision for LabWindows/CVI。Lab Windows/CVI是美国National Instrument(简称NI)公司开发的基于C语言的虚拟仪器开发平台,适用于自动测试、自动控制、测试仪器通信、测试硬件控制、信号分析及图像处理等软件的开发。经过版本的不断更新,Lab Windows/CVI已经成为测控领域应用最为广泛的软件开发工具之一。而IMAQ_Vision for LabWindows/CVI是NI公司开发的基于LabWindows/CVI的高级图像处理和分析软件包,是进行图像处理和分析的教学和科研的有力工具。软件包提供了3个重要的文件:

硬件:个人PC电脑(主频:2.6GHZ*2 内存:1G*2)

3. 系统分析

3.1. 系统的主要功能分析

傅里叶变换是研究信号频域特性首要数学工具。在数字图像频域处理中,常常要对二维图像做快速傅里叶变换,由于傅里叶变换的可分离性,二维快速傅里叶变可以分解为对行、列两个方向的一维快速傅里叶变换,所以在LabWindows/CVI 集成开发

环境下实现二维图像的快速傅里叶变换的关键是一维傅里叶变换的实现。

在本系统设计过程中,主要分成两个部分完成:

第一部分是一维快速傅里叶变换,该部分所包含的变量函数基本上不依赖于特定的软件平台,仅仅与C语言有关,这部分是为二维快速傅里叶服务的。主要有内容及其作用如表格1所示。

表 1 一维快速傅里叶变换及反变换功能模块列表

第二部分是二维快速傅里叶变换及其反变换,该部分主要是在一维快速傅里叶变换及其反变换的基础上,完成对一幅二维图像的快速傅里叶变换及其反变换,并将结果显示出来。主要函数模块及其功能如表格2所示。

表2 二维快速傅里叶变换及反变换功能模块列表

3.2. 系统的关键问题及解决方法(或思路)

二维图像的快速傅里叶变换及其反变换可以分解成行、列两个方向上的一维快速傅里叶变换及其反变换,由因为快速傅里叶变换和反变换的原理是一致的,所以,在整个系统设计的过程中,最关键的问题就是如何用C语言程序描述模拟整个快第一文库网速傅里叶变换的运算流程。

为了解决这个问题,根据快速傅里叶变换运算流图,将整个变换过程分层描述,共分解为3个层次:“级”、“组”和“个”。一个快速傅里叶变换运算过程分为i个级,每个级包含j个组,每个组又包含k个单个蝶形运算。例如如图1所示的N=8的快速傅里叶变换的运算流图,该流图共分为3个级:第一级包含4个组,每个组又1个单个蝶形运算;第二级包含2个组,每个组有2个单个蝶形运算;第三级包含1个组,每个组有4个蝶形运算。

图1 N=8的快速傅里叶变换蝶形运算流图

在函数fft(int length, complex src[])实现时使用3重for循环来描述,最外

层for循环是对“级”的循环,第二层for循环是对每一级里“组”的循环,最内层for

循环是对每一组里“个“,即单个蝶形运算的循环。程序代码如下所示:

/*快速傅里叶变换*/

void fft(int length, complex src[]) {

int i=0; int j=0; int k=0;

//1次FFT蝶形运算

int Distance=0; //1个FFT蝶形运算跨越的

//计算一级运算当前已经走过的步长 //FFT蝶形运算级数寄存器 //FFT蝶形运算组数寄存器 //FFT蝶形运算个数寄存器 //1个蝶形运算中间结果寄存器 //1个蝶形运算中间结果寄存器

int grade=0; int group=0; int unit=0; complex up;

complex down;

complex product; //1个蝶形运算中间结果寄存器

/*先对原始数据做

/*计算1次FFT的级数总数grade*/ grade=(int)(log(length)/log(2));

for(i=0;i

/*计算第i级运算包含组数group*/ group=(int)pow(2,(double)(grade-1-i));

/*计算单个蝶形运算跨越距离*/ Distance=1

/*一级蝶形运算*/ for(j=0;j

/*计算一级运算当前已经走过的步长*/ Step=2*Distance*j;

/*计算一组蝶形运算中包含的蝶形运算个数unit*/ unit=(int)pow(2,(double)(i));

/*一组蝶形运算*/ for(k=0;k

/*一个蝶形运算*/

mul(src[Step+k+Distance],W[length*k/2/Distance],&product); add(src[Step+k],product,&up); sub(src[Step+k],product,&down); src[Step+k]=up;

src[Step+k+Distance]=down;

} }

4. 系统设计

4.1. 程序流程图及说明

整体程序流程图如下所示:

图2 整体程序流程图

说明:A.当开始运行程序后,通过点击“打开一幅图像并显示”按钮,在弹出的对话框

中选择一幅格式符合要求的图像并确定,之后程序就会在另一个名为“源图像”的窗口中显示原始图像并在主界面中显示原始图像宽度和高度。按钮“打开一幅图像并显示”左边的指示LED灯亮,表示已经打开一幅图像,并可以开始下面的操作。

B.打开一幅图像后,点击“傅里叶变换”按钮,对原始图像进行二维FFT变换,

得到变换后的数据,并在一个名为“FFT图像”的窗口中显示经过傅里叶变换后的复数图像。

C.点击“傅里叶反变换”按钮,对第二步中二维傅里叶变换变换得到的数据进行

二维傅里叶反变换,恢复原始图像,并在一个名为“IFFT图像”的窗口中显示。

D.如果此时要退出程序,那么就点击“退出”按钮;如果不想退出,想对另外一

幅图像进行1~3步的操作,那么就点击“清除”按钮,程序会重新回到刚运行程序的状态。

4.2. 程序主要模块(或功能)介绍 4.2.1. 一维 FFT 和 IFFT 流程图:

图3 一维FFT 和 IFFT流程图

说明:A.FFT和IFFT的运算及其总体流程图是相同的,均是按以上流程图来实现。

iWNB.首先,先计算 。

C.对输入数据x(n)进行位倒序处理。

D.接着,根据运算流图进行三重for循环运算,最后得出结果。

E.grade是指一次FFT或IFFT运算分级的总数;group是每个级分组的总数;unit是每个组包含蝶形运算的总数。

F.对于得出自然顺序的结果,可以用两种方法去实验,一是输入数据经过位倒序处理后再运算,输出数据为自然顺序。二是不先对输入数据做位倒序处理,运算后在做处理也可以得到自然顺序的结果数据。

4.2.2. 二维图像 FFT 和 IFFT: 流程图:

图4 二维FFT和IFFT流程图

说明:1、二维图像FFT和IFFT的运算流程图是相同的,均是按上图所示。

2、先通过打开图像来获得width和height,并定义二维数组

Buffer[width][height]。

3、width和height分别是原始图像的宽度和高度;Buffer[width][height]是用

来存放原始数据、中间运算数据及最终结果的缓冲区。

4、 其实,二维数组的运算就是一维数组的变换运算,对Buffer数组的第一行进

行FFT或IFFT运算,之后对矩阵进行倒置,再对此矩阵的第一行进行FFT或IFFT运算,再进行多一次倒置,进而得出结果。

5、对于最终结果的显示是通过在CVI下用复数图像显示。

5. 实验结果与分析

5.1. 实验结果

(应有实验结果的图片,有结果分析或说明)

下面表格里是3组实验图片,从左到右分别是原始图像、经过快速傅里叶变换后的到的数据转换而来的FFT图像(complex image)以及通过对快速傅里叶变换得到的数据进行快速傅里叶反变换恢复的图像。

从3组实验图片的FFT图片表示中,可以看出图像中央是直流低频成分,四角是高频成分。

从3组图像的源图像与IFFT图像的比较中可知,从快速傅里叶变换结果数据用反变换的来的图像与原始图像几乎是相同的,由此证明程序是正确的。

图5 三组实验结果

5.2. 项目的创新之处

本设计其实并没有创新之处。如果要说做的比较好的地方的话,那就是使用malloc

()动态分配内存空间,包括快速傅里叶变换及其反变换的缓冲区,用于数组到图像转换的一维数组空间等。使用动态分配空间可以适应不同大小的图片(图像宽度和高度可以不同,但仍然需要满足2的N次方条件),另外就是动态分配的内存空间使用完后及时回收,节省对内存空间的资源和提高利用率。 5.3. 存在问题及改进设想

对本设计中存在的问题是快速傅里叶变换及其反变换所用的时间比较长,原因可能有

以下两点:一是描述complex数据类型的实部虚部成员使用double类型(64位)过大;二是在快速傅里叶变换及其反变换程序实现时,在一些运算量比较大的地方,例如for循环里,不必要的重复运算过多。

针对上面问题,本组认为可以从选择合适的数据类型和优化程序代码等方面入手,

较少运算时间。

6. 心得体会

6.1. 系统开发的体会

在本设计中,本组成员体会比较深刻的是分层和面向过程的程序设计思想。

首先,对于一个比较复杂的程序可以简化思路,提高代码可读性等等,这是对程序设计的纵向优化。在本系统设计中,主要有两个地方体现了这一思想。一是对于一维快速傅里叶变换及其反变换的实现过程,结合运算流程的特点,将一个运算流程分解成若干级,每个级中包含若干组,每个组中又分成若干个单个的蝶形运算,这样子分层,可以使得程序设计更为清晰,系统化,也便于理解;二是将一维快速福利叶变换及其反变换与二维的分离开。

其次是面向过程程序设计。在系统设计中,把不同功能的程序封装成各个独立的函数,使得代码重用性,可读性提高,也便于以后的修改。例如把一维快速傅里叶变换或反变换封装函数供二维变换调用。 6.2. 对本门课程的改进意见或建议

对本门课程的改进意见或建议:其实,课程的主要目的都是在于提高学生的学习热情和创新意识,这有利于多方面开发学生智力,提高学生的综合素质等。 所以,对于这门课程更有利开展,如果条件允许的话,可以尝试整合课程教学资源,例如包括课程介绍、教学大纲、授课教案、作业习题、实验指导、参考文献目录、授课实况录像等资源,然后整合完毕后都可以发送到每一个学生手上,有了这些资料,学生就可以尝试自己开展课程的学习,更有利于提高学生的积极性与自主性。如学生可以根据课堂讲授,结合在课后对课堂知识进行消化吸收,加深对课堂内容的理解,深入分析试验数据,对实验结果进行论证。其次,课程可以更多结合当今的就业工作所需对学生进行专业性知识讲解,使学生对未来就业某个方向有一定了解,也可以使学生提高自己的知识结构。因为每一个学生最关注的都是未来就业的压力与自己的能力,所以可以适当关注一下这个方向。

附件一

华南农业大学

图像大作业成绩评定表

注:如果小组成员仅仅分工撰写实验报告或制作PPT,没有参与编程,则其成绩要低于编程的同学。

【图像傅里叶变换、反变换的实现】相关文章:

分数阶傅里叶变换的数值实现04-28

基于变形分数傅里叶变换的六重密钥图像加密04-29

探测波导全息光栅傅里叶变换光谱的新方法04-27

基于正弦变换的红外图像均衡算法05-02

二元微分联合变换相关器实现图像识别的研究05-01

基于小波变换的图像配准04-30

数字离轴无透镜傅里叶变换全息重建方法研究04-27

彝药金沙青叶胆的傅里叶变换红外光谱研究04-26

JPEG图像压缩技术的实现与优化04-27

基于MATLAB的DCT变换在JPEG图像压缩中的应用04-27