图像傅里叶变换反变换的实现.docx
《图像傅里叶变换反变换的实现.docx》由会员分享,可在线阅读,更多相关《图像傅里叶变换反变换的实现.docx(16页珍藏版)》请在冰豆网上搜索。
图像傅里叶变换反变换的实现
课程大作业实验报告
图像傅里叶变幻、反变换的实现
课程名称:
数字图像处理
组长:
王文雄学号:
200730590323年级专业班级:
07通信3班
成员一:
庞柱坚学号:
200730590318年级专业班级:
07通信3班
成员二:
王弥光学号:
200730590322年级专业班级:
07通信3班
成员三:
学号:
年级专业班级:
07通信3班
指导教师
邓继忠
报告提交日期
2010年6月1日
项目答辩日期
2010年6月1日
1.项目要求
1.基本要求:
自修教材相关内容(P52-74)或其它参考资料,在CVI下编程对尺寸为2N(N为正整数)的图像进行FFT(快速傅里叶变换)和(快速傅里叶反变换)。
(不能利用CVI下的函数)
2.题目拓展:
编程实现任意大小图像的二维傅立叶的变换与反变换。
2.项目开发环境
项目开发环境主要分为软件环境和硬件环境
软件:
LabWindows/CVI和IMAQ_VisionforLabWindows/CVI。
LabWindows/CVI是美国NationalInstrument(简称NI)公司开发的基于C语言的虚拟仪器开发平台,适用于自动测试、自动控制、测试仪器通信、测试硬件控制、信号分析及图像处理等软件的开发。
经过版本的不断更新,LabWindows/CVI已经成为测控领域应用最为广泛的软件开发工具之一。
而IMAQ_VisionforLabWindows/CVI是NI公司开发的基于LabWindows/CVI的高级图像处理和分析软件包,是进行图像处理和分析的教学和科研的有力工具。
软件包提供了3个重要的文件:
硬件:
个人PC电脑(主频:
2.6GHZ*2内存:
1G*2)
3.系统分析
3.1.系统的主要功能分析
傅里叶变换是研究信号频域特性首要数学工具。
在数字图像频域处理中,常常要对二维图像做快速傅里叶变换,由于傅里叶变换的可分离性,二维快速傅里叶变可以分解为对行、列两个方向的一维快速傅里叶变换,所以在LabWindows/CVI集成开发环境下实现二维图像的快速傅里叶变换的关键是一维傅里叶变换的实现。
在本系统设计过程中,主要分成两个部分完成:
第一部分是一维快速傅里叶变换,该部分所包含的变量函数基本上不依赖于特定的软件平台,仅仅与C语言有关,这部分是为二维快速傅里叶服务的。
主要有内容及其作用如表格1所示。
表1一维快速傅里叶变换及反变换功能模块列表
内容
C程序(数据定义、函数声明等)
功能
复数数据类型定义
typedefstruct
{
doublereal;
doubleimg;
}complex;
定义描述快速傅里叶变换及其反变换数据的类型。
复数类型的四则运算
voidadd(complexa,complexb,complex*c);
voidmul(complexa,complexb,complex*c);
voidsub(complexa,complexb,complex*c);
voiddivi(complexa,complexb,complex*c);
这四个函数分别完成两个复数类型数据a和b的加法、减法、乘法和除法运算,运算结果存放于指针c指向的数据空间。
初始化快速傅里叶变换及其反变换变换核
voidinitW(intlegnth);
该函数完成
~
的计算,
~
在碟新运算时需要用到;参数legnth是一次快速傅里叶变换或反变换的数据长度。
“倒位序”处理函数
voidchange(intlegnth,complexsource[]);
该函数完成数据的自然顺序到“倒位序”的变换处理或是“倒位序”到自然顺序的变换处理;参数legnth是一次快速傅里叶变换或反变换的数据长度,source[]是待变换的数据。
快速傅里叶变换
voidfft(intlength,complexsrc[]);
该函数完成对
个复数数据的快速傅里叶变换;参数legnth是一次快速傅里叶变换的数据长度,source[]是待变换的数据。
快速傅里叶反变换
voidifft(intlength,complexsrc[]);
该函数完成对2的N次方个复数数据的快速傅里叶反变换;参数legnth是一次快速傅里叶反变换的数据长度,source[]是待变换的数据
第二部分是二维快速傅里叶变换及其反变换,该部分主要是在一维快速傅里叶变换及其反变换的基础上,完成对一幅二维图像的快速傅里叶变换及其反变换,并将结果显示出来。
主要函数模块及其功能如表格2所示。
表2二维快速傅里叶变换及反变换功能模块列表
3.2.系统的关键问题及解决方法(或思路)
二维图像的快速傅里叶变换及其反变换可以分解成行、列两个方向上的一维快速傅里叶变换及其反变换,由因为快速傅里叶变换和反变换的原理是一致的,所以,在整个系统设计的过程中,最关键的问题就是如何用C语言程序描述模拟整个快速傅里叶变换的运算流程。
为了解决这个问题,根据快速傅里叶变换运算流图,将整个变换过程分层描述,共分解为3个层次:
“级”、“组”和“个”。
一个快速傅里叶变换运算过程分为i个级,每个级包含j个组,每个组又包含k个单个蝶形运算。
例如如图1所示的N=8的快速傅里叶变换的运算流图,该流图共分为3个级:
第一级包含4个组,每个组又1个单个蝶形运算;第二级包含2个组,每个组有2个单个蝶形运算;第三级包含1个组,每个组有4个蝶形运算。
图1N=8的快速傅里叶变换蝶形运算流图
在函数fft(intlength,complexsrc[])实现时使用3重for循环来描述,最外层for循环是对“级”的循环,第二层for循环是对每一级里“组”的循环,最内层for循环是对每一组里“个“,即单个蝶形运算的循环。
程序代码如下所示:
/*快速傅里叶变换*/
voidfft(intlength,complexsrc[])
{
inti=0;//1次FFT蝶形运算"级数"计数器
intj=0;//1级FFT蝶形运算"组数"计数器
intk=0;//1组FFT蝶形运算"个数"计数器
intDistance=0;//1个FFT蝶形运算跨越的"距离"
intStep=0;//计算一级运算当前已经走过的步长
intgrade=0;//FFT蝶形运算级数寄存器
intgroup=0;//FFT蝶形运算组数寄存器
intunit=0;//FFT蝶形运算个数寄存器
complexup;//1个蝶形运算中间结果寄存器
complexdown;//1个蝶形运算中间结果寄存器
complexproduct;//1个蝶形运算中间结果寄存器
/*先对原始数据做"到位序"处理*/
change(length,src);
/*计算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的运算及其总体流程图是相同的,均是按以上流程图来实现。
B.首先,先计算。
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图像(compleximage)以及通过对快速傅里叶变换得到的数据进行快速傅里叶反变换恢复的图像。
从3组实验图片的FFT图片表示中,可以看出图像中央是直流低频成分,四角是高频成分。
从3组图像的源图像与IFFT图像的比较中可知,从快速傅里叶变换结果数据用反变换的来的图像与原始图像几乎是相同的,由此证明程序是正确的。
序号
原始图像
FFT图像
IFFT图像
1
2
3
图5三组实验结果
5.2.项目的创新之处
本设计其实并没有创新之处。
如果要说做的比较好的地方的话,那就是使用malloc()动态分配内存空间,包括快速傅里叶变换及其反变换的缓冲区,用于数组到图像转换的一维数组空间等。
使用动态分配空间可以适应不同大小的图片(图像宽度和高度可以不同,但仍然需要满足2的N次方条件),另外就是动态分配的内存空间使用完后及时回收,节省对内存空间的资源和提高利用率。
5.3.存在问题及改进设想
对本设计中存在的问题是快速傅里叶变换及其反变换所用的时间比较长,原因可能有以下两点:
一是描述complex数据类型的实部虚部成员使用double类型(64位)过大;二是在快速傅里叶变换及其反变换程序实现时,在一些运算量比较大的地方,例如for循环里,不必要的重复运算过多。
针对上面问题,本组认为可以从选择合适的数据类型和优化程序代码等方面入手,较少运算时间。
6.心得体会
6.1.系统开发的体会
在本设计中,本组成员体会比较深刻的是分层和面向过程的程序设计思想。
首先,对于一个比较复杂的程序可以简化思路,提高代码可读性等等,这是对程序设计的纵向优化。
在本系统设计中,主要有两个地方体现了这一思想。
一是对于一维快速傅里叶变换及其反变换的实现过程,结合运算流程的特点,将一个运算流程分解成若干级,每个级中包含若干组,每个组中又分成若干个单个的蝶形运算,这样子分层,可以使得程序设计更为清晰,系统化,也便于理解;二是将一维快速福利叶变换及其反变换与二维的分离开。
其次是面向过程程序设计。
在系统设计中,把不同功能的程序封装成各个独立的函数,使得代码重用性,可读性提高,也便于以后的修改。
例如把一维快速傅里叶变换或反变换封装函数供二维变换调用。
6.2.对本门课程的改进意见或建议
对本门课程的改进意见或建议:
其实,课程的主要目的都是在于提高学生的学习热情和创新意识,这有利于多方面开发学生智力,提高学生的综合素质等。
所以,对于这门课程更有利开展,如果条件允许的话,可以尝试整合课程教学资源,例如包括课程介绍、教学大纲、授课教案、作业习题、实验指导、参考文献目录、授课实况录像等资源,然后整合完毕后都可以发送到每一个学生手上,有了这些资料,学生就可以尝试自己开展课程的学习,更有利于提高学生的积极性与自主性。
如学生可以根据课堂讲授,结合在课后对课堂知识进行消化吸收,加深对课堂内容的理解,深入分析试验数据,对实验结果进行论证。
其次,课程可以更多结合当今的就业工作所需对学生进行专业性知识讲解,使学生对未来就业某个方向有一定了解,也可以使学生提高自己的知识结构。
因为每一个学生最关注的都是未来就业的压力与自己的能力,所以可以适当关注一下这个方向。
附件一
华南农业大学
图像大作业成绩评定表
大作业题目
姓名
年级专业班级
分工
成绩
组长
成员一
成员二
成员三
成绩
评定
标准
评分项目(标准)
分值
得分
选题情况
15%
1
题目的难易程度及题目的工作量
15
实施情况55%
2
自我学习的能力(考察是否自行查阅了较多的文献资料,是否自学了新知识)
15
3
有无创新(是否超出题目预先设定的目标)
15
4
团队合作能力(分工的合理性、是否各成员都全程参与了题目的讨论、方案制订、编程工作)
10
5
题目完成质量(是否完成大作业,程序功能强弱,程序有无必要的注释,对题目重复的小组,特别考察程序是否有copy之嫌)
15
成果质量
30%
6
PPT的制作效果
10
7
程序的演示效果(包括界面设计与演示图片的采用与数量)
10
8
大作业实验报告的质量(考察正文内容与格式)
10
注:
如果小组成员仅仅分工撰写实验报告或制作PPT,没有参与编程,则其成绩要低于编程的同学。