图像处理本科毕业论文_第1页
图像处理本科毕业论文_第2页
图像处理本科毕业论文_第3页
图像处理本科毕业论文_第4页
图像处理本科毕业论文_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、摘 要 本文以 vc+6.0 做为编程语言,对图像降噪技术进行研究。本文通过介绍位图的 基本操作以及在图像中加入椒盐噪声的操作,从而进一步引出几种降噪方法。 本文分别介绍“均值滤波” 、 “中值滤波”以及“傅里叶降噪”和“小波降噪”四种 算法,实现图像降噪。详细介绍了其基本原理、实现方法以及具体算法,并对降噪效 果加以比较与分析。 “均值滤波”把每个像素都用周围的 8 个像素来做均值操作,可以平滑图像,速度 快,算法简单。 “中值滤波”是常用的非线性滤波方法 ,也是图像处理技术中最常用的 预处理技术。同时在“低通滤波”及“小波降噪”中分别引入“快速傅里叶变换”和“mallat 算法”,使得其取

2、得更快速的计算,有效地解决了其计算量太大,运算时间过长的弊端, 从而达到更好的综合降噪效果。 关键词:图像降噪;滤波;傅里叶降噪;小波降噪 abstract taking vc+6.0 as the programming language, this paper is a study about image noise reduction technology. furthermore, introducing several noise reducing measures through the introduction of the basic processing and the op

3、eration to put the salt and pepper noise into the image. the paper introduces averaging filter, median filter,fourier lowpass filtering and wavelet filter to achieve image noise reducing. here we introduce the basic principles, implement methods, detailed arithmetic, and make comparison and analysis

4、 the noise reducing effects. averaging filter operates every pixel by using 8 pixels meanly. it can make the images smoothing, fast and easy to calculate. median filter fourier is a common nonlinear filtering way and also common preprocessing technique when processing images. introducing fft and mal

5、lat algorithm separately into lowpass filtering and wavelet filter, and then we can make faster calculating and solve the massive calculating more efficiently. therefore, we can have a more effective noise reducing. keywords:image noise reduction;filter;fourier filter;wavelet filter 毕业设计(论文)原创性声明和使用

6、授权说明毕业设计(论文)原创性声明和使用授权说明 原创性声明原创性声明 本人郑重承诺:所呈交的毕业设计(论文) ,是我个人在指导教师的 指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和 致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不 包含我为获得 及其它教育机构的学位或学历而使用过的材料。 对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的 说明并表示了谢意。 作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文) 的规定,即:按照学校要求提交毕业设计(论文)的印刷本和

7、电子版本; 学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅 览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在 不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名: 日 期: 目 录 1 绪论.1 1.1 vc+6.0 简介 .1 1.2 数字图像处理基本概念.1 1.3 图像降噪技术研究背景及意义.2 1.4 图像降噪的国内外研究现状.2 1.5 关于图像噪声.2 2 位图操作基本知识.4 2.1 cdib 类的介绍.4 2.2 位图操作.4 2.2.1 图像读取.4 2.2.2 图像显示.5 2.3 程序源代码.6 2.3.1 图像读取.6

8、2.3.2 图像保存.8 3 噪声的添加.13 3.1 基本原理.13 3.2 实现步骤.13 3.3 程序源代码.13 3.3.1 添加响应函数.13 3.3.2 添加成员函数.13 3.4 输出结果.16 4 均值滤波.18 4.1 基本原理.18 4.2实现方法.18 4.3程序源代码.20 4.3.1 添加响应函数.20 4.3.2 添加成员函数.20 4.4 结果输出及分析.23 4.4.1 结果输出.23 4.4.2 结果分析.25 5 中值滤波.26 5.1 基本原理.26 5.2 实现方法.26 5.3 程序源代码.26 5.3.1 添加响应函数.26 5.3.2 添加成员函数

9、.27 5.4 结果输出及分析.32 5.4.1 结果输出.32 5.4.2 结果分析.33 6 傅立叶降噪.34 6.1 基本概念.34 6.1.1 二维傅里叶变换.34 6.1.2 二维离散傅里叶变换.34 6.1.3 快速傅里叶变换.35 6.2 相关原理.35 6.3 程序源代码.35 6.3.1 快速傅里叶变换.36 6.3.2 快速傅里叶逆变换.38 6.3.3 低通滤波.40 6.4 结果输出及分析.43 6.4.1 结果输出.43 6.4.2 结果分析.46 7 小波降噪.47 7.1 基本概念基本概念.47 7.1.1 二维离散小波变换.47 7.2.2 mallat 算法.

10、48 7.2 相关原理.49 7.3 程序源代码.50 7.3.1 lpass_filter 函数.52 7.3.2 hpass_filter 函数.53 7.3.3 dwt_inverse 函数.55 7.4 结果输出及分析.56 7.4.1 结果输出.56 7.4.2 结果分析.59 结 论.60 致 谢.61 参考文献.62 附录 a 英文原文.63 附录 b 中文翻译.74 1 绪论 1.1 vc+6.0 简介 vc+6.0 是 microsoft 公司推出的一个基于 windows 系统平台、可视化的集成开 发环境,它的源程序按 c+语言的要求编写,并加入了微软提供的功能强大的 mf

11、c(microsoft foundation class)类库。mfc 中封装了大部分 windows api 函数和 windows 控件,它包含的功能涉及到整个 windows 操作系统。mfc 不仅给用户提供了 windows 图形环境下应用程序的框架,而且还提供了创建应用程序的组件,这样,开 发人员不必从头设计创建和管理一个标准 windows 应用程序所需的程序,而是从一个 比较高的起点编程,故节省了大量的时间。另外,它提供了大量的代码,指导用户编 程时实现某些技术和功能。因此,使用 vc+提供的高度可视化的应用程序开发工具和 mfc 类库,可使应用程序开发变得简单。 1.2 数字图

12、像处理基本概念 数字图像处理(digitalimageprocessing)是通过计算机对图像进行去除噪声、增强、 复原、分割、提取特征等处理的方法和技术。数字图像处理的产生和迅速发展主要受 三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立 和完善) ;三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增 长。 20 世纪 20 年代,图像处理首次应用于改善伦敦和纽约之间海底电缆发送的图片质 量。到 20 世纪 50 年代,数字计算机发展到一定的水平后,数字图像处理才真正引起 人们的兴趣。1964 年美国喷气推进实验室用计算机对“徘徊者七号”太空船发回的

13、大 批月球照片进行处理,收到明显的效果。20 世纪 60 年代末,数字图像处理具备了比较 完整的体系,形成了一门新兴的学科。20 世纪 70 年代,数字图像处理技术得到迅猛的 发展,理论和方法进一步完善,应用范围更加广泛。在这一时期,图像处理主要和模式 识别及图像理解系统的研究相联系,如文字识别、医学图像处理、遥感图像的处理等。 20 世纪 70 年代后期到现在,各个应用领域对数字图像处理提出越来越高的要求,促进 了这门学科向更高级的方向发展。特别是在景物理解和计算机视觉(即机器视觉)方 面,图像处理已由二维处理发展到三维理解或解释。近年来,随着计算机和其它各有 关领域的迅速发展,例如在图像表

14、现、科学计算可视化、多媒体计算技术等方面的发 展,数字图像处理已从一个专门的研究领域变成了科学研究和人机界面中的一种普遍 应用的工具。 1.3 图像降噪技术研究背景及意义 随着计算机科学和图像处理技术的迅速发展,图像在医学成像、模式识别等方面取 得了广泛应用。但是,图像在形成、传输过程中,不可避免会受到噪声的干扰,而且 有些图像的噪声非常严重,图像中的噪声往往和信号交织在一起,会使图像本身的细 节如边界轮廓、线条等变的模糊不清。引起噪声的原因很多,噪声的种类也很多。因 此,需要对图像进行降噪处理,便于更高层次的图像分析与理解。如何既对图像中出 现的噪声进行合理的抑制、衰减以及去除不需要的信息,

15、又能使有用的信息得到加强, 从而便于目标区分或对象解释,是图像去噪主要研究的主要任务。 1.4 图像降噪的国内外研究现状 图像降噪是图像处理的一个重要环节。目前图像噪声的取出在数字图像处理技术中 的重要性愈加明显。近年来,在小波基础上发展起来的图像去噪仍是一个值得关注的 问题,在理论和实践上都具有重大的研究意义。其中,基于中值滤波和小波变换的图像 去噪小波变换是近年来兴起的信号处理技术,它具有良好的局部化分析特性和多分辨 率分析特性,非常适合于图像处理。 1.5 关于图像噪声 噪声是不可预测的随机信号,通常采用概率统计方法对其进行分析。噪声对图像处 理十分重要,它影响图像处理的、采集、处理的各

16、个环节以及输出结果的全过程。特 别是图像的输入、采集噪声的抑制是十分关键的问题,若输入伴有较大的噪声,必然 影响处理全过程及输出的结果。噪声可以理解为“妨碍人们感觉器官,对所接收的信源 信息理解的因素”。 噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识 的随机误差”。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完 全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。但在很多情 况下,这样的描述方法是很复杂的,甚至是不可能的。而实际应用往往也不必要。通 常是用其数字特征,即均值方差,相关函数等。因为这些数字特征都可以从某些方面 反映出噪声的特征。除此之外,

17、噪声的灰度值与其周围的灰度之间有着明显的灰度差, 也正式这些明显的灰度差才造成了视觉障碍。因此一个良好的图像处理系统,不论是 模拟处理还是用计算机进行的数字处理,无不把减少最前一级的噪声作为主攻目标。 特此根据噪声性质的不同,消除噪声的方法也不同,本文将介绍“均值滤波”、 “中值滤 波”、 “傅里叶降噪”、 “小波变换”四种降噪方法。 根据噪声产生的来源,大致可以分为外部噪声和内部噪声两大类。 外部噪声是指从处理系统外来的影响,如天线干扰或电磁波从电源线窜入系统的噪 声。内部噪声则有一下几种最常见形式: (1)由光和电的基本性质引起的噪声。例如电流可看作电子或空穴运动,这些例 子运动产生随机散

18、粒噪声,导体中电子流动的热噪声,光量子运动的光量子噪声等。 (2)由机械运动引起的噪声。例如,接头振动使电流不稳,磁头或磁带、磁盘抖 动等。 (3)元器件期检噪声。如光学底片的颗粒噪声,磁带、磁盘缺陷噪声,光盘的疵 点噪声等。 (4)系统内部电流的噪声。 从噪声的分类方法来看是多种多样的。但综合来说,噪声是随机产生的量,所以又 可以从统计数学的观点来定义噪声。凡是统计特性不随时间变化的噪声称为平稳的噪 声,而统计特性随时间变化的噪声称作非平稳噪声。 以上所讨论的各种类型的噪声反映在图像画面上,大致可以分为两种经典的图像噪 声。若噪声的幅值基本相同,但是噪声出现的位置是随意的,称这类噪声为椒盐噪

19、声。 若从噪声幅值大小的分布统计来看,其密度函数有高斯型、瑞利型,分别称为高斯噪 声和瑞利噪声,又如频谱均匀分布的噪声称为白噪声等等。 本文着重讨论椒盐噪声。 2 位图操作基本知识 2.1 cdib 类的介绍 大多数图像处理都是基于与设备无关位图(dib)来进行讨论的,而 mfc 中没有 处理 dib 位图的类,这就给编程带来了很大困难。所以需要建立一个处理 dib 位图的 专用类,cdib 类,在其中封装必要而有效的处理函数,该类具有的功能如下: void loadfile(cstring m_filename); /装载 bmp 位图文件 char*getfilename(); /返回位图

20、文件名 dword getsize(); /返回位图文件的大小 uint getwidth(); /返回位图的宽度 uint getheight(); /返回位图的高度 uint getnumberofcolors(); /返回位图颜色数目 rgbquad*getrgb(); /返回颜色表首地址 bitmapinfo*getinfo(); /返回图像信息结构首地址 byte*getdata(); /返回图像数据首地址 根据对 dib 操作的分析,以及参照 cbitmap 的功能设计,cdib 类的基本操作功能 应包括: (1) dib 文件的读写操作; (2) 提供位图宽度、高度、颜色数目等位

21、图相关信息; (3) 提供有关位图占据内存空间的信息,包括:图像数据区首地址、颜色表首地址、 位图信息结构首地址等信息。 2.2 位图操作 2.2.1 图像读取 n y 图 2.1 图像读取流程图 2.2.2 图像显示 得到文件的完整路径名 打开位图文件 读取 bitmapfileheader 结构 文件是 bmp 格式吗? 计算得到 bmp 文件除文件头以外的大小 把 bmp 文件除文件头以外的部分读入内存返回 dib 句 柄 结束 开始 n y n 图 2.2 图像显示流程图 2.3 程序源代码 2.3.1 图像读取 通过 readdibfile()函数实现对函数的读取,参数 cfile

22、开始 设定显示参数,显示位图 恢复原调色板 结束 从 doc 对象中得到位图数据起始位置指针,并得到图像的宽、高等信息 把新创建的调色板作为设备环境的调色板,并保留原调色板 使用文件中颜色表数据创建调色板 位图是 8 位? hdib hdib; lpbyte lpdib; / 获取 dib(文件)长度(字节) dword dwbitssize = file.getlength(); / 尝试读取 dib 文件头 if (file.read(lpbyte) / 判断是否是 dib 对象,检查头两个字节是否是bm if (bmfheader.bftype != dib_header_marker)

23、 / 非 dib 对象,返回 null。 return null; / 为 dib 分配内存 hdib = (hdib) :globalalloc(gmem_moveable | gmem_zeroinit, dwbitssize); if (hdib = 0) / 内存分配失败,返回 null。 return null; / 锁定 lpdib = (lpbyte) :globallock(hglobal) hdib); / 读象素 if (file.readhuge(lpdib, dwbitssize - sizeof(bitmapfileheader) != dwbitssize - si

24、zeof(bitmapfileheader) ) / 大小不对。 / 解除锁定 :globalunlock(hglobal) hdib); / 释放内存 :globalfree(hglobal) hdib); / 返回 null。 return null; / 解除锁定 :globalunlock(hglobal) hdib); / 返回 dib 句柄 return hdib; 2.3.2 图像保存 通过 readdibfile()函数实现将 dib 保存到指定文件中,参数 hdib hdib、cfile / 指向 bitmapinfoheader 的指针 lpbitmapinfoheader

25、 lpbi; if (hdib = null) / 如果 dib 为空,返回 false return false; / 读取 bitmapinfo 结构,并锁定 lpbi = (lpbitmapinfoheader) :globallock(hglobal) hdib); if (lpbi = null) / 为空,返回 false return false; / 判断是否是 win3.0 dib if (!is_win30_dib(lpbi) / 不支持其它类型的 dib 保存 / 解除锁定 :globalunlock(hglobal) hdib); / 返回 false return f

26、alse; / 填充文件头 / 文件类型bm bmfhdr.bftype = dib_header_marker; / 计算 dib 大小时,最简单的方法是调用 globalsize()函数。但是全局内存大小并 / 不是 dib 真正的大小,它总是多几个字节。这样就需要计算一下 dib 的真实大 小。 / 文件头大小颜色表大小 / (bitmapinfoheader 和 bitmapcoreheader 结构的第一个 dword 都 是该结构的大小) dword dwdibsize = *(lpdword)lpbi + palettesize(lpbyte)lpbi); / 计算图像大小 if

27、 (lpbi-bicompression = bi_rle8) | (lpbi-bicompression = bi_rle4) / 对于 rle 位图,没法计算大小,只能信任 bisizeimage 内的值 dwdibsize += lpbi-bisizeimage; else / 大小为 width * height dword dwbmbitssize = widthbytes(lpbi-biwidth)*(dword)lpbi- bibitcount) * lpbi-biheight; / 计算出 dib 真正的大小 dwdibsize += dwbmbitssize; / 更新 bi

28、sizeimage(很多 bmp 文件头中 bisizeimage 的值是错误的) lpbi-bisizeimage = dwbmbitssize; / 计算文件大小:dib 大小bitmapfileheader 结构大小 bmfhdr.bfsize = dwdibsize + sizeof(bitmapfileheader); / 两个保留字 bmfhdr.bfreserved1 = 0; bmfhdr.bfreserved2 = 0; / 计算偏移量 bfoffbits,它的大小为 bitmap 文件头大小dib 头大小颜色表大 小 bmfhdr.bfoffbits = (dword)si

29、zeof(bitmapfileheader) + lpbi-bisize + palettesize(lpbyte)lpbi); / 尝试写文件 try / 写文件头 file.write(lpbyte) / 写 dib 头和象素 file.writehuge(lpbi, dwdibsize); catch (cfileexception, e) / 解除锁定 :globalunlock(hglobal) hdib); / 抛出异常 throw_last(); end_catch / 解除锁定 :globalunlock(hglobal) hdib); / 返回 true return tru

30、e; 3 噪声的添加 3.1 基本原理 定义 saltnoising(hdib hdib)类,用以封装实现添加噪声的相关函数。设置指向源 图像的指针,设置表示行、列的循环变量 i,j。在加噪过程中,存储标准图像象素信 息后,生成一个为随机种子,可以为任意数或系统时间。当 dtemp31500 时,指向源 图像倒数第 j 行,第 i 个象素的指针,将图像中当前点置为黑。即完成一次噪声的添加。 3.2 实现步骤 (1)取得图像大小、数据区,并把数据区复制到缓冲区; (2)循环取得各点像素值; (3)若产生的随机数大于特定值,把该点置黑; (4)把缓冲区中改动的数据复制到原数据区中。 3.3 程序源

31、代码 3.3.1 添加响应函数 cdibview 中添加“加入椒盐噪声”的响应函数: oid cdipsview:onaddnoisingsalt() / todo: add your command handler code here cdipsdoc* pdoc=getdocument(); caddnoising addsalt; addsalt.saltnoising(pdoc-gethdib(); invalidate(); pdoc-setmodifiedflag(true); 3.3.2 添加成员函数 建立 caddnoising 类,其成员函数执行具体操作: void cadd

32、noising:saltnoising(hdib hdib) / 指向源图像的指针 lpstr lpsrc; /循环变量 long i; long j; / 图像每行的字节数 long llinebytes; / 计算图像每行的字节数 lpbyte lpdib=(lpbyte) :globallock(hglobal) hdib); lpbyte lpdibbits; cdib m_add; long lwidth=m_add.dibwidth(lpdib); long lheight=m_add.dibheight(lpdib); lpdibbits=m_add.finddibbits(lp

33、dib); llinebytes = widthbytes(lwidth * 8); for(i=0;illinebytes;i+)/存储标准图像象素信息 for(j=0;jlheight;j+) bmp_stddatai* llinebytes+j=*(byte *)lpdibbits + llinebytes * i + j); if (m_add.dibbitcount(lpdib) != 8) /prompt messagebox(this program can only process 8bits image., prompt , mb_iconinformation | mb_o

34、k); /unlock :globalunlock(hglobal) hdib); /生成伪随机种子 srand(unsigned)2); int tem=0; /在图像中加噪 for (j = 0;j lheight ;j+) for(i = 0;i 31500) / 指向源图像倒数第 j 行,第 i 个象素的指针 lpsrc = (char *)lpdibbits + llinebytes * j + i; /图像中当前点置为黑 *lpsrc = 0; /tem+; /char ctem20; /sprintf(ctem,噪声象素点个数为:%d,tem); /messagebox(ctem

35、); 3.4 输出结果 图 3.1 原图像 图 3.2 加入椒盐噪声后的图像 4 均值滤波 4.1 基本原理 所谓均值滤波实际上就是用均值替代原图像中的各个像素值。 均值滤波的方法如下:设被噪声污染后的信号为,原始信号为,噪声为 ( )g t( )f t ,则 ( )( )( )g tf tn t 。均值滤波公式如下: ( )n t 1 ( ) ()(1)( )(1)()g tg tng tmg tg tg tm n (4.1) 经过均值滤波后的图像,可以看到噪声明显的被抑制了。 下面推导均值滤波对抑制的原理。因为 ( )( )( )g tf tn t (4.2) 等式两边取数学期望(即统计中

36、) ,得 ( )( )( )g tf tn t (4.3) 如果噪声椒盐噪声,则有 ( )0n t (4.4) 所以 ( )( )( )g tf tn t (4.5) 按照如上的定义可知,因为出现的为椒盐噪声,其幅值基本相同,但是数据中, 还存在一些点没有噪声,这样,可以将未输出的噪声的点等同的认为噪声幅值为 0,这 样就有 ( )( )n tn t (4.6) 所以,经过均值滤波之后,中所包含的噪声强度值低于。( )g t( )g t 椒盐噪声的抑制,只是将某点出现的噪声强度,让周围的数据平均分担了。 4.2 实现方法 根据上述对以为均值滤波的原理介绍,将其宽展到二维信号的处理,就可以事先对

37、 图像噪声的抑制。 均值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其近邻的若干像 素组成,用模板中像素的均值来替代原像素的方法。 如图 图 4.1 均值滤波原理示意图 序号为 0 的是当前像素,序号为 18 的像素是其模板中的邻家像素。求模板中所 有像素的均值,再把该均值赋予当前像素点,作为处理后图像在该点上的灰度( , )x y ,即( , )g x y 1 ( )( , ) fs g xf x y m (4.7) 其中,s 为模板,m 为该模板中包含当前像素在内的像素总个数。 考虑到数据分布的平衡性,本文中模板选择为 33,待处理像素放在模板的中心。 为了使输出像素值保持在原理

38、的灰度值范围内,模板的权值总和应该维持为 1。模板与 模板像素的乘积要除以一个系数(通常是模板系数之和) ,这个过程也被称为模板的归 一化。 模板的描述还可以采用矩阵的形式,入 33 的均值滤波可以描述如下: 1 1 1 1 1 1 1 9 1 1 1 h (4.8) 该模板的响应计算为 1 ( , ) (1,1)(1, )(1,1)( ,1)( , ) 9 ( ,1)(1,1)(1, )(1,1) g x yf xyf xyf xyf x yf x y f x yf xyf xyf xy (4.9) 以式(4.8)对椒盐噪声图片进行均值滤波后,所得到的结果可知,均值滤波器对椒 123 804

39、 765 盐噪声的滤波效果不是很理想。因为椒盐噪声的幅值都是基本相同的,只是出现噪声 点的位置是随机的,所以在统计意义下的噪声均值也不为 0,因此,即使是理想情况也 无法完全去除。但是从模板的含义来理解,经过均值处理之后,噪声部分被弱化到周 围像素点上,所以得到的结果是噪声幅值减小,但是噪声点的颗粒面积同时变大。 另外,均值滤波有一个非常致命的缺点,就是在求均值的计算中,会同时将景物 的边缘也同时进行均值处理,这样就使得景物的清晰度降低,画面变的模糊。 4.3 程序源代码 4.3.1 添加响应函数 在 cdipsview 类中,得到均指滤波响应函数 ondenoisingaveraging()

40、: void cdipsview:ondenoisingaveraging() / todo: add your command handler code here cdipsdoc* pdoc = getdocument(); / call class cdenoising cdenoising clsdenoising; clsdenoising.averagingfilter(pdoc-gethdib(); /refresh the view invalidate(); /set flag in order to indicate modification pdoc-setmodifie

41、dflag(true); 4.3.2 添加成员函数 建立类 cdenoising,其成员函数 averagingfilter(hdib hdib)执行具体算法: void cdenoising:averagingfilter(hdib hdib) / variables definition long i,j; int intensity1,intensity2,intensity3,intensity4,intensity5,intensity6,intensity7,intensity8,intensity; / a pointer to bitmapfileheader lpbyte l

42、pdib; / a point to start of bitmapdata lpbyte lpdibbits; /lock and get pointer of dib lpdib = (lpbyte) :globallock(hglobal) hdib); /get pointer of bitmapdata lpdibbits = m_clsdib.finddibbits(lpdib); /if dibbitcount equal 24,then give a prompt and exit this program if (m_clsdib.dibbitcount(lpdib) !=

43、8) /prompt messagebox(this program can only process 8bits image., prompt , mb_iconinformation | mb_ok); /unlock :globalunlock(hglobal) hdib); /exit return; /let cursor in wait status beginwaitcursor(); /get width of the image long lwidth = m_clsdib.dibwidth(lpdib); /get height of the image long lhei

44、ght = m_clsdib.dibheight(lpdib); /get bytes of each line long llinebytes = widthbytes(lwidth * 8); /accesss every pixel for (i = 1; i lheight-1; i +) for (j = 1; j gethdib(); /refresh the view invalidate(); /set flag in order to indicate modification pdoc-setmodifiedflag(true); 5.3.2 添加成员函数 在类 cdeno

45、ising 中,其成员函数 midfilter(hdib hdib)执行具体算法: void cdenoising:midfilter(hdib hdib) /1*5 中值滤波 / variables definition long i,j,m,n; int intensity6; lpbyte lpdib; lpbyte lpdibbits; /lock and get pointer of dib lpdib = (lpbyte) :globallock(hglobal) hdib); lpdibbits = m_clsdib.finddibbits(lpdib); /if dibbitc

46、ount equal 24,then give a prompt and exit this program if (m_clsdib.dibbitcount(lpdib) != 8) /prompt messagebox(this program can only process 8bits image., prompt , mb_iconinformation | mb_ok); /unlock :globalunlock(hglobal) hdib); /exit return; /let cursor in wait status beginwaitcursor(); long lwi

47、dth = m_clsdib.dibwidth(lpdib); long lheight = m_clsdib.dibheight(lpdib); /get bytes of each line long llinebytes = widthbytes(lwidth * 8); /accesss every pixel for (i = 0; i lheight; i+) for (j =2; j llinebytes-2; j +) intensity0=*(byte *)lpdibbits + llinebytes * i + j-2); intensity1=*(byte *)lpdib

48、bits + llinebytes * i + j-1); intensity2=*(byte *)lpdibbits + llinebytes * i + j); intensity3=*(byte *)lpdibbits + llinebytes * i + j+1); intensity4=*(byte *)lpdibbits + llinebytes * i + j+2); for(m=0;m3;m+) for(n=m+1;nintensityn) intensity5=intensitym; intensitym=intensityn; intensityn=intensity5;

49、/write new value *(byte *)lpdibbits + llinebytes * i + j ) = (byte)intensity2; / unlock :globalunlock(hglobal) hdib); /计算均方根误差 /acc_targets(lheight,lwidth,lpdibbits); /let cursor in normal status endwaitcursor(); void cdenoising:smoothing(hdib hdib) / variables definition long i,j,m; int intensity10

50、,avintensity; / a pointer to bitmapfileheader lpbyte lpdib; / a point to start of bitmapdata lpbyte lpdibbits; /lock and get pointer of dib lpdib = (lpbyte) :globallock(hglobal) hdib); lpdibbits = m_clsdib.finddibbits(lpdib); /if dibbitcount equal 24,then give a prompt and exit this program if (m_cl

51、sdib.dibbitcount(lpdib) != 8) /prompt messagebox(this program can only process 8bits image., prompt , mb_iconinformation | mb_ok); :globalunlock(hglobal) hdib); return; /let cursor in wait status beginwaitcursor(); long lwidth = m_clsdib.dibwidth(lpdib); long lheight = m_clsdib.dibheight(lpdib); lon

52、g llinebytes = widthbytes(lwidth * 8); /accesss every pixel intensity9=0; for (i = 1; i lheight-1; i+) for (j =1; j llinebytes-1; j +) intensity0=*(byte *)lpdibbits + llinebytes * (i-1) + j-1); intensity1=*(byte *)lpdibbits + llinebytes * (i-1) + j); intensity2=*(byte *)lpdibbits + llinebytes * (i-1

53、) + j+1); intensity3=*(byte *)lpdibbits + llinebytes * i + j-1); intensity4=*(byte *)lpdibbits + llinebytes * i + j); intensity5=*(byte *)lpdibbits + llinebytes * i + j+1); intensity6=*(byte *)lpdibbits + llinebytes * (i+1) + j-1); intensity7=*(byte *)lpdibbits + llinebytes * (i+1) + j); intensity8=

54、*(byte *)lpdibbits + llinebytes * (i+1) + j+1); for(m=0;mgethdib(); invalidate(); pdoc-setmodifiedflag(true); 2.函数 fft()来实现快速傅里叶变换。 参数:complex * td,指向时域数组的指针;complex * fd 指向 频域数组的指针;r2 的幂数,即迭代次数。函数无返回值。 void winapi fft(complex * td, complex * fd, int r) long count; / 傅里叶变换点数 inti,j,k; / 循环变量 intbfsi

55、ze,p; / 中间变量 double angle; / 角度 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); / 将时域点写入 x1 memcpy(x1, td, sizeo

56、f(complex) * count); / 采用蝶形算法进行快速傅里叶变换 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

57、count; j+) p = 0; for(i = 0; i r; i+) if (j invalidate(); pdoc-setmodifiedflag(true); 2.函数 ifft()来实现实现快速逆傅里叶变换。 参数:complex * td,指向时域数组的指针;complex * fd 指向频 域数组的指针;r2 的幂数,即迭代次数。函数无返回值。 bool winapi ifft(complex * fd, complex * td, int r) / 傅里叶变换点数 long count; / 循环变量 inti; complex *x; / 计算傅里叶变换点数 count

58、= 1 r; x = new complexcount; memcpy(x,fd,sizeof(complex)*count); /将频域点写入 x /求共轭 for(i = 0; i count; i+) xi=complex(xi.real(),-xi.imag(); fft(x,td,r); / 调用快速傅里叶变换 / 求时域点的共轭 for(i = 0; i count; i+) tdi=complex(tdi.real()/count,-tdi.imag()/count); delete x; return(true); 6.3.3 低通滤波 有了上面的的 fft()和 ifft()

59、函数,就可以非常方便的进行而为离散数字图像的傅 里叶变换,即低通滤波。 fourier()函数来对图像进行傅里叶变换。 参数:lpstr lpdibbits,指向源 dib 图像指针;long lwidth,源图像宽度(象素 数) ;long lheight,源图像高度(象素数) 。 返回值:bool,成功返回 true,否则返回 false。 bool winapi fourier(lpstr lpdibbits, long lwidth, long lheight) / 指向源图像的指针 unsigned char*lpsrc; / 中间变量 double dtemp; / 循环变量 lo

60、ng i; long j; / 进行傅里叶变换的宽度高度长度(2 的整数次方) long w; long h; /long ftlong; intwp; inthp; /intftcount; / 图像每行的字节数 long llinebytes; / 计算图像每行的字节数 llinebytes = widthbytes(lwidth * 8); / 赋初值 w = 1; h = 1; ftlong=1; wp = 0; hp = 0; ftcount=0; / 计算进行傅里叶变换的长度(2 的整数次方) while(ftlong*2=lwidth*lheight) ftlong*=2; ft

温馨提示

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

评论

0/150

提交评论