




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、序号(学号): 长春大学光华学院毕 业 设 计(论 文)基于mfc的图像边缘检测提取算法仿真姓 名系 别信息工程系专 业计算机技术与科学班 级指导教师2011年6月15日基于mfc的图像边缘检测提取算法仿真摘要 本论文是要通过计算机仿真的方法来实现对图像边缘的提取,并生成新的图像,新的图像只含有边缘,无其他的颜色信息。在通过用计算机进行仿真的过程中,演示仿真系统是使用vc+6.0来编写的,应用了面向对象的编程思想,并使用c+语言实现。本论文研究的图像是windows操作系统中的标准图像文件格式(*.bmp)。本论文从介绍mfc编程的基础知识,然后又分析了bmp图像的内部结构。分析比较了六个常用
2、边缘检测算子,最后又分析了边缘提取算子。通过对各个算子的分析比较,最后应用在边缘提取上的边缘检测算子是kirsch算子,其他几个算子在应用后边缘检测后效果一般,但是进行边缘提取后,效果非常不清晰,只有kirsch算子较好的反应了边缘,我所做的边缘检测,是在不分析图像的噪声,和其他因素的条件下进行的。 关键词 边缘检测 边缘提取 算子 图像based on mfc image edge detection extraction algorithm simulationabstract this thesis is to through the computer simulation method
3、 to realize the image edge extraction, and generate new image, the new image contains only edge, no other color information. with a computer simulation in through the process, demo simulation system is using vc +6.0 to write, applied the object-oriented programming ideas, and use the c+ language imp
4、lementation. this paper studies the image is windows operating system standard image file format (*. bmp). this paper introduces the basic knowledge of programming mfc, then analyzes the internal structure of bmp image. analyses and compares the sixcommon edge detection and then analyzes the operato
5、r image edge operator. through the analysis and comparison of various operators, finally used in edge extraction of edge detection operator is on kirsch operator, several other operators in applied after the edge detection effect, but after general on edge after extraction, the effect is very not cl
6、ear, only kirsch operator better response the edge, i did edge detection, is not analysis image noise, and other factors of the conditions. key words edge detection pick operator image 目 录目 录i第1章 绪论11.1引言11.2边缘与边缘检测11.3 边缘检测的研究背景及意义11.4 课题发展状况和目标2第2章 程序框架及编程基础知识介绍32.1 mfc概述32.2 mfc类库32.3 程序设计框架:4第3章
7、 vc+图像处理程序的设计63.1数字图像处理概述63.2图像和颜色系统73.2.1灰度图像和彩色图像83.3位图8第4章 经典的边缘检测提取方法及实现144.1 roberts算子144.2 prewitt 算子和 sobel 算子154.3 kirsch算子174.4 拉普拉斯算子174.5 高斯拉普拉斯边缘检测算子194.6边缘检测算子的实现204.7算子的结果比较23第五章 边缘提取255.1边缘提取的功能与原理255.2 边缘提取的效果与算法实现26结 论28致 谢29参考文献30第1章 绪论1.1引言边缘检测是图像处理的一个重要分支,研究为完成某一任务需要从图像中提取哪些有用的信息
8、,以及如何利用这些信息解释图像。边缘检测技术对于处理数字图像非常重要,因为边缘是所要提取目标和背景的分界线,提取出边缘才能将目标和背景区分开来。在图像中,边界表明一个特征区域的终结和另一个特征区域的开始,边界所分开区域的内部特征或属性是一致的,而不同的区域内部的特征或属性是不同的,边缘检测正是利用物体和背景在某种图像特性上的差异来实现的,这些差异包括灰度,颜色或者纹理特征。边缘检测实际上就是检测图像特征发生变化的位置。由于噪声和模糊的存在,检测到的边界可能会变宽或在某些点处发生间断,因此,边界检测包括两个基本内容:首先抽取出反映灰度变化的边缘点,然后剔除某些边界点或填补边界间断点,并将这些边缘
9、连接成完整的线。边缘检测的方法大多数是基于方向导数掩模求卷积的方法。导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值比较高,因此可将这些导数值作为相应点的边界强度,通过设置门限的方法,提取边界点集。31.2边缘与边缘检测直观上边缘是一组相连像素的集合,它们位于两个不同区域之间,而从根本上说边缘是基于某种算法得到的具有特定特征的点的集合。由此看出边缘的定义与算法有关,同时边缘的定义以像素灰度的跃变为基础。图像上颜色相近的像素连在一起形成了不同的区域而不同的区域间的边缘表现为颜色灰度的跃变。边缘检测就是利用微分等方法通过对灰度跃变的分析寻找图像上区域边缘的技术,对数字
10、图像,通常使用卷积或类似卷积的方法来实现对灰度的分析。1.3 边缘检测的研究背景及意义利用计算机进行图像处理有两个目的:一是生产更适合人类观察和识别的图像;二是希望能由计算机自动识别和理解图像。无论为了哪种目的,图像处理中关键的一步就是对包含大量的各式各样景物信息的图像进行分解。分解最终结果是图像被分解成一些具有某种特征的最小成分,称为图像的基元,相对于整幅图像来说,这种基元比较容易处理。图像的特征是指图像场中可用作标志的属性。它可以分为图像的统计特征和图像的视觉特征。图像的统计特征是指一些人为定义的特征,通过变换才能得到如图像的直方图、矩频谱等。图像的视觉特征是指人的视觉可直接感受到自然特征
11、,如区域的亮度、纹理或轮廓等,利用这两类特征把图像分解成一系列有意的目标或区域的过程称为图像的分割。图像的边缘是图像的最基本特征。所谓边缘是指周围图像灰度有阶跃变化的那些像素的集合,边缘广泛存在于物体与背景之间,物体与物体之间,基元与基元之间。因此边缘检测是图像分割所依赖的重要特征。21.4 课题发展状况和目标边缘检测的研究多年来在业内被人们高度重视。从边缘检测研究的历史和现状来看,边缘检测有几个明显的趋势:1、对原有的算法不断改进。2、新方法、新概念的引入和多种方法的有效综合运用。3、对特殊图像边缘检测的研究越来越得到重视,目前有很多针对立体图像、彩色图像、多光谱图像、合成孔径雷达图像、深度
12、图像、纹理图像、超声图像、计算机断层扫描、磁共振图像、共聚焦激光扫描显微镜图像以及运动图像等特殊图像的边缘检测技术的研究。4、对图像边缘检测评价的研究和对评价系统的研究越来越得到关注。5、将现有的算法应用于工程实际中。在此本可以将使用vc+6.0编程设计软件对边缘检测技术的的各个算法进行仿真编程,来分析和比较各个算法的功能和效果,以便更深入的了解图像边缘检测技术。第2章 程序框架及编程基础知识介绍2.1 mfc概述mfc,微软基础类(microsoft foundation classes),实际上是微软提供的,用于在c+环境下编写应用程序的一个框架和引擎,vc+是windows下开发人员使用
13、的专业c+ sdk(sdk,standard software develop kit,专业软件开发平台),mfc就是挂在它之上的一个辅助软件开发包,mfc作为与vc+血肉相连的部分(注意c+和vc+的区别:c+是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而vc+只是一个编译器,或者说是一种编译器+源程序编辑器的ide。mfc是win api与c+的结合,api,即微软提供的windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,borland就是第三方)的编程语言来进行对windows下
14、应用程序的开发,使这些被开发出来的应用程序能在windows下运行,比如vb,vc+,java,delhpi编程语言函数本质上全部源于api,因此用它们开发出来的应用程序都能工作在windows的消息机制和绘图里,遵守windows作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供api,这个世上对windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到mfc是微软对api函数的专用c+封装,这种结合一方面让用户使用微软的专业c+ sdk来进行windows下应用程序的开发变得容易,因为mfc是对api的封装,微软做了大量的工作,隐藏了好多程序开发人员在win
15、dows下用c+ & mfc编制软件时的大量内节,如应用程序实现消息的处理。2.2 mfc类库cwnd:窗口,它是大多数“看得见的东西”的父类(windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图cview、框架窗口cframewnd、工具条ctoolbar、对话框cdialog、按钮cbutton,一个例外是菜单(cmenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。cdocument文档,负责内存数据与磁盘的交互。最重要的是onopendocument(读入),onsavedocument(写盘),serialize(读写)。cview视图,负责
16、内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是ondraw(重画窗口),通常用cwnd:invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 cdc设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为cdc。cdc与其他gdi(图形设备接口)一起,完成文字和图形、图像的显示工作。把cdc想象成一张纸,每个窗口都有一个cdc相联系,负责画窗口。cdc有个常用子类cclientdc(窗口客户区),画图通常通过cclientdc完成。 cdialo
17、g对话框 cwinapp应用程序类。似于c中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数initinstance():初始化。csize大小,就是(cx,cy)对(宽、高)mfc是在1992年的microsoft 16位版的c/c+编译器的7.0版本中作为一个扩展轻量级的windows api面向对象的c+封装库而引入的。ceditview 提供windows编缉控件的功能。因为ceditview派生于cedit,该对象可同文件和文件模板一同使用 afxext.h。2.3 程序设计框架:1.系统流程图:系统初始化进行算法演示是否为bmp图像以
18、读的方式打开文件将图片显示到屏幕是否为灰度二值图像进行边缘提取将提取效果图显示系统演示结束图2.1 系统流程图第3章 vc+图像处理程序的设计343.1数字图像处理概述数字图像处理(digital image processing)是指用计算机对图像信息进行的处理,也称为(computer image processing)。数字图像处理包括以下几个内容:3(1)点运算点运算主要是针对图像的像素进行加、减、乘、除等运算。图像的点运算可有有效地改变图像的直方图分布,这对提高图像的分辨率以及图像的均衡都是非常有效的。(2)几何处理几何处理主要包括图像的坐标转换、图像的移动、缩小、放大和旋转,多个图
19、像的配准和图像扭曲校正等。几何处理是最常见的图像处理手段,几乎任何图像处理软件都提供了最基本的图像缩放功能。图像的扭曲校正功能可以对变形的图像进行几何校正,从而得出准确的图像。(3)图像增强图像增强主要是突出图像中重要的信息,同时减弱同时减弱或去除不需要的信息。本论文所研究的范围就是属于图像的增强。常用的方法有直方图增强和伪彩色增强等。5(4)图像复原图像复原的主要目的是去除干扰和模糊,从而恢复图像的本来。例如对图像进行去噪声复原处理。(5)图像形态学处理图像形态学是数学形态的延伸,是一门独立的研究科学。利用图像形态学处理技术,可以实现图像的腐蚀、细化和分割等效果。(6)图像编码图像编码研究属
20、于信息论中信息源编码的范畴,主要是利用图像的信号的统计特性和人类视觉特性对图像进行高效编码,从而达到压缩图像的目的。图像编码是数字图像处理中一个经典的研究范畴,有60多年的研究历史,目前已经制定了多种编码标准,如h.261、jpeg和mepg等。(7)图像重建图像的重建起源于ct技术的发展,是一门新兴的数字图像处理技术,主要是利用采集的数据重建出图像。图像重建的主要算法有迭代法、代数法、傅立叶反投影法和和使用最广泛的卷积反投影法等。(8)模式识别模式识别也是数字图像处理的一个新兴的研究方向,目前模式识别方法有三种,即统计识别法、句法结构模式识别法和模糊识别法。应用广泛的有文字识别(orc)技术
21、就是应用模式识别技术开发出来的。3.2图像和颜色系统1.2.3.a)b)1.2.2.31. 图像普通的显示器屏幕是由许多的点构成的,这些点称为像素。显示时采用扫描的方式:电子枪每次从左到右扫描一行,为每个像素着色,然后再从上到下扫描整个屏幕,利用人眼的视觉暂留效应就可以显示出一屏完整的图像。为了防止闪烁,每秒要重复几十次扫描过程。我们常说的屏幕分辨率为1024*768像素,刷新频率为85hz,意思是每行扫描1024像素,一共要扫描768行,每秒重复扫描屏幕85次。一般刷新频率大于80hz时,人眼感受不到因屏幕刷新而产生的闪烁,这种显示器被称为位映像设备。所谓位映像,就是指一个二维的像素矩阵,位
22、图就是采用位映像方法显示和存储的图像。对于彩色图像,它的显示必须从三原色rgb概念说起。众所周知,自然界中的所有颜色都可以由红、绿、蓝三原色组合而成。有的颜色有红色成分多一些,其他成分少一些。针对含有红色成分的多少,可以人为地分成0255共256个等级。0级表示不含红色部分,255级表示含有100%的红色成分。同样,绿色和蓝色也可以被分成256级。这样根据红、绿、蓝各种不同的组合可以表示出256*256*256(约1600万)种颜色。42.调色板如果一幅图像的每个像素都用其rgb分量来表示,那么图像文件将变的非常大,实际上的做法不完全是这样,下面举一个例子:对一副200*200的16色图像,它
23、共有40000个像素,如果没一个像素都用r、g、b3个分量表示,则一个像素需要3个字节(因为每个分量有256个级别,要用8位,即1个字节来表示,所以3个分量需要用3个字节)。这样保存整个 图像要用200*200*3,即120000字节。但是如果采用调用的方法,就能节省很多字节。对于16色图像,图中最多只有16种颜色,如果采用一个颜色表,表中的每一行记录一种颜色的r、g、b值,这样当表示一个像素的颜色时,只需要指出该颜色是第几行,即指出的该颜色在表中的索引值即可。例如表的第0行为(255,0,0),表示红色,那么当某个像素为红色时,只需要标明0即可。通过颜色索引表来表示图像,16种状态可以用4位
24、(bit)表示,所以一个像素要用半个字节。整个图像要用200*200*0.5,即20000字节,再加上颜色表占用3*16=48字节,也不过20048字节。这样一幅图像整个占用的字节数只是用前面方法表示的1/6。22.1.3.12.3.13.2.1灰度图像和彩色图像1. 灰度图像灰度图(grayscale)是指含亮度信息不含彩色信息的图像,是数字图像的基本形式,灰度图像可有由黑白照片数字化得到,或从彩色图像进行去色处理得到。灰度图像只表达图像的亮度信息而没有颜色信息,因此,灰度图像的每个像素点上只包含一个量化的灰度级(即灰度值),用来表示该点的亮度水平,并且通常用1个字节(8个二进制位)来存储灰
25、度值。如果灰度值用1个字节表示,则可以表示的正整数范围是0到255,也就是说,像素灰度值取值在0到255之间,灰度技术为256级。注意到人眼对灰度的分辨能力通常在20到60级,因此,灰度值存储以字节为单位即保证了人眼的分辨能力,又符合计算机数据寻址的习惯。在特殊应用中,可能要采用更高的灰度级数,例如ct图像的灰度级数高达数千,需要采用12位或16位二进制位来存储,但这类图像通常都采用专用的显示设备和软件来进行显示和处理。72.彩色图像彩色图像的数据不仅包含亮度信息,还包含颜色信息。彩色的表示方法是多样化的,最常见的是三基色模型,例如rgb三基色模型,利用rgb三基色可以混合成任意颜色。因此rg
26、b模型在各种彩色成像设备和彩色显示设备中使用,常规的彩色图像也都是用rgb三基色来表示的,每个像素包括rgb三基色数据,每个基色用1个字节(8位二进制位)表示,则每个像素的数据为3个字节(即24位二进制位),这就是人们常说的24位真彩色。3.3位图1.gdi位图gdi是图形设备接口(graphics device interface)的缩写。gdi位图是一种gdi对象,在microsoft基本类(mfc)库中cbitmap类来表示。在cbitmap类对象中,包含一种和windows的gdi模块有关的windows数据结构,该数据结构是与设备相关的。应用程序可以得到gdi位图数据的一个备份,但是
27、其中位图的安排则完全依赖于显示设备。我们可以将gdi位图数据在同一台计算机内的不同应用程序间任意传递,但是由于其对设备的依赖性,在不同类型计算机间的传递是没有任何意义的。cbitmap类封装了windows gdi位图,同时提供了一些位图的成员函数。在使用cbitmap对象时,首先要创建一个cbitmap对象,然后把它选进设备环境中,再调用其成员函数进行处理,使用完毕后,把它从设备环境中选出并删除。2.设备无关位图(dib)dib是设备无关位图(device-independent bitmap)的缩写,它自带颜色信息,因此调色板管理非常容易。dib也使打印时的灰度阴影的控制更加容易。任何运行
28、windows操作系统的计算机都可以处理dib,它通常以bmp文件的形式被保存在磁盘中或者作为资源保存在exe文件和dll文件中。(1)bmp图像的dib结构dib 是标准的windows位图格式,bmp文件中包含了一个dib。一个bmp文件大体上分成如下4个部分:bitmapfileheaderbtype=”mb”位图文件头bfsize(只用于bmp文件)btreserved1btreserved2bfoffbitsbitmapinfoheaderbisize位图信息头biwidthbiheightbiplanesbibitcountbicompressionbisizeimagebixpe
29、lspermeterbiypelspermeterbiclrusedbiclrimportantpolette单色dib有2个表项调色板16色dib有16个表项或更少256色dib诱256个表项或更少真彩色dib没有调色板每个表项长度为4字节(32位)dib pixels像素按照每行每列的顺序排列dib 图像数据每一行的字节数必须是4的整倍数第1部分为位图文件头bitmapfileheader,它是一个结构,其定义如下:typedef struct tagbitmapfileheaderword bftype;dword bfsize;word bfreserved1;word bfreser
30、ved2;dword bfoffbits; bitmapfileheader, far *lpbitmapfileheader, *pbitmapfileheader;该结构的长度是固定的,为14个字节(word为无符号16位整数,dword为无符号32位整数),各个域的说明如下:bftype:指定文件类型,必须是0x4d42,即字符串“mb”,也就是说所有的“.bmp”文件的头两个字节都是“mb”。bfsize:指定文件大小,包括14个字节。bfreserved1,bfreserved2:为保留字,不用考虑。bfoffbits:为从文件头到实际的位图数据的偏移字节数。第2部分为位图信息头bi
31、tmapinfoheader,它也是一个结构,其定义如下:typedef struct tagbitmapinfoheaderdword bisize;long biwidth;long biheight;word biplanes;word bibitconut;dword bicompression;dword bisizeimage;long bixpelspermeter;long biypelspermeter;dword biclrused;dword biclrimportant; bitmapinfoheader, far *lpbitmapinfoheader, *pbitm
32、apinfoheader这个结构的长度也是固定的,为40个字节(word为无符号16位整数,dword为无符号32位整数,long为32位整数)。各个域的说明如下。bisize:指定这个结构的长度,为40字节。biwidth:指定图像的宽度,单位是像素。biheight:指定图像的高度,单位是像素。biplanes:必须是1,不用考虑。bibitcount:指定表示颜色时药用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色)、24(真彩色图),新的“.bmp”格式支持32位色bicompression:指定位图是否压缩,有效的值为bi_rgb,bi_rle8,bi_rle4,
33、bi_bitfields(都是一些windows定义好的常量)。需要注意,windows位图可以采用rle4和rle8的压缩格式,但是使用不经常。bisizeimage:指定实际的位图数据占用的字节数,其实也可以从下面公式计算出来:bisizeimage=biwidth*biheight要注意的是上面的公式中的biwidth必须是4的整数倍(所以不biwidth,而是biwidth,表示大于或等于biwidth的离4最近的整数倍。例如,如果biwidth=240,则biwidth=240;如果biwidth=241,则biwidth=244)。如果bicompression为bi_rgb,则该
34、项可能为零。bixpelspermerter:指定目标设备的水平分辨率,单位是像素/米。biypelspermerter:指定目标设备的垂直分辨率,单位是像素/米。biclrused:指定图像实际用到的颜色数,如果该值为零,则用到的颜色数为2的bibitcount次幂。biclrimportant:指定图像中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。第3部分为调色板(palette)。有些位图需要调色板,有些位图(例如真彩色图)不需要调色板,它们的bitmapinfoheader后面直接是位图数据。调色板实际上市一个数组,共有biclrused个元素(如果该值为零,则有2的bib
35、itcount次幂个元素)。数组中每个元素的类型是一个rgbquad结构,占4个字节,其定义如下:typedef struct tagrgbquadbyte rgbblue; 该颜色的蓝色分量byte rgbgreen; 该颜色的绿色分量。byte rgbred; 该颜色的红色分量。byte rgbreserved; 保留值。rgbquad;第4部分是实际的图像数据。对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值;对于真彩色图,图像数据就是实际的r、g、b值(2)bmp图像的存取bmp文件分为4个部分,那么bmp文件的读入也按照4个人组成部分依次进行处理,即先处理bitmapf
36、ileheader结构,然后是bitmapinfoheader结构、颜色表,最后处理位图数据。首先,有关bitmapfileheader、bitmapinfoheader、rgbquad等结构定义包含在头文件“windows.h”中,应该把它包含进来。(3)dib访问函数windows支持一些重要的dib访问函数。这些函数都没有被封装到mfc中,所以我们需要参考msdn文档来添加。下面介绍本程序用的访问函数:setdibitstodevice:该函数直接在显示器或打印机上显示dib。显示时不进行缩放,位图的每一位对应一个显示像素或一个打印点。不能进行缩放限制了它的实用。该函数不能像bitblt
37、函数那样使用,因为bitblt使用的是逻辑坐标。strechdibits:该函数按照与stretchblt函数类似的方式将dib直接显示在显示器或打印机上。getdibits:该函数利用申请到的内存,由gdi位图来构造dib。可以对dib的格式进行控制,因为我们可以指定每个像素的颜色位数,并且可以指定是否对它进行压缩。如果使用了压缩格式,就必须对getdibits进行两次调用,一次用于计算需要的内存,另一次来产生dib数据。createdibitmap:该函数从dib出发来创建gdi位图。与所有这些dib函数一样,必须提供一个设备环境指针作为参数。这里我们需要一个显示器设备环境,不需要内存设备
38、环境。createdibsection:该函数是一个新的win32函数,它创建一个特殊的dib,称为dib项,然后返回一个gdi位图句柄。该函数为我们提供了dib和gdi位图最好的特性。我们可以直接访问dib的内存,而且利用位图句柄和内存设备环境,还可以再dib中调用gdi函数画图。(4)imgdib类的编写利用windows现有的dib访问函数,可以实现位图的可视化编程。使用mfc编制一个基于单文档、面向过程的位图显示与存储程序。bmp文件读写实例在功能上完全一致的,只不过一个是可视化的编程环境,一个是控制台的程序。声明的这个类叫做imgdib,里面封装了dib位图处理所需要的基本的成员变量
39、和成员函数,这样充分利用了面向对象程序设计的封装、继承等特性,又使得代码易于维护和移植。41.imgdib类的定义imgdib类的定义在头文件”imgdib.h”中,代码如下class imgdibpublic:unsigned char *m_pimagedata;/图像数据的指针;lprgbquad m_pcolortable;/图像颜色表指针;int m_nbitpixel;/每个像素占的位数;private:lpbyte m_pdib;/指向整个dib的指针(包含bitmapfileheheder,bitmatpinfoheader ,和颜色表)lpbitmapinfoheader m
40、_pinfohead;/图像信息头指针;hpalette m_hpalette;/调色板指针;int m_pcolortablelength;/颜色表长度;public:imgdib();/不带参数的构造函数;imgdib(csize size,int nbitpixel,lprgbquad pcolortable,unsigned char *pimagedata);imgdib();/析构函数;bool read(lpctstr lpszpathname);/dib读函数bool ondraw(cdc*pdc,cpoint origin,csize size);/dib显示函数;bool
41、writeon(lpctstr lpszpathname);void makepalette();/调色板生成函数;csize getdibsize();/获取图像dib的宽和高void empty();/清理内存空间;void replacedib(csize size,int nbitpixel,lprgbquad pcolortable,unsigned char *pimagedata);/用新的数据替换当前的dib;int computecolortablelength(int nbitpixel);/计算颜色表的长度;protected:int m_imgwidth;/图像的宽。以
42、像素为单位;int m_imgheight;/图像的高,以像素为单位;;通过bmp文件读取的方式生成dib,也可以通过参数的传递方式生成dib,本类始终都是一次为dib的指针m_pdib分配内存。imgdib类的代码实现在文件imgdib.cpp中构造函数和析构函数:类的构造函数用来完成数据成员的初始化工作,系统在创建类的对象时自动调用构造函数。类的析构函数用来释放被分配的内存空间,当类的对象消失时系统自动调用该函数。第4章 经典的边缘检测提取方法及实现2344.1 roberts算子边缘,是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。图像的边缘对应着图像灰度的不连续性。显然图像的边
43、缘很少是从一个灰度跳到另一个灰度这样的理想状况。真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。 边缘的锐利程度由图像灰度的梯度决定。梯度是一个向量,f指出灰度变化的最快的方向和数量。 公式 4.1梯度的大小和方向是由公式 4.23公式 4.3因此最简单的边缘检测算子是用图像的垂直和水平差分来逼近梯度算子:3 公式 4.4因此当我想寻找边缘的时候,最简单的方法是对每一个像素计算出(4.4)的向量,然后求出它的绝对值,然后进行阈值操作就可以了。利用这种思想就得到了roberts算子: 3公式4.5它是一个两个2*2模板作用的结果(标注“.”的是当前像素的位置)0.1-1 0-11.00 -
44、1-1 能查到的最早的有关边缘检测的文献就是1959 年 b. jule的17,这算是最早的提出边缘检测和边缘检测算子的文章了。 1963 年 roberts23提出了边缘检测和边缘检测的这个简单算子。machine perception of 3-d solids 是 roberts 在 1963 年写的(mit)博士毕业论文。这是一篇大家都应该阅读的论文。它是最早分析图像中的边缘、线、模型和图形学的文章。作者提出的系统是第一个 3d 视觉系统,其中有许多后来被大家常用的算子。它使用了三维物体的多边形模型,通过计算图像中的灰度数据寻找图像中的“块”然后对他最适当的表示,最后通过匹配来寻找物体
45、。复杂的物体是由很多“块”组成的,而“块”是由边缘组成的。作者使用他的简单的22 算子得到了边缘。相邻的边缘点组成线,如果线比较短,那么这条线就被忽略,如果线比较长,那么我们就把它延长直到它与其它的边缘线相交与一点。然后通过对这些线的匹配来识别物体。一旦一个物体识别出来,表示这个物体的边缘就从图像的边缘线表示上删除,然后再对下一个物体进行匹配。4344.2 prewitt 算子和 sobel 算子roberts 算子是直观的也是简单的,但是显然效果不好。实践中人们做了大量的实践,总结出了一些经验。 1970 年左右 prewitt16和 sobel25分别提出了一个算子,这就是 prewitt
46、 算子和 sobel 算子。 prewitt 边缘检测算子使用两个有向算子(一个水平的,一个是垂直的,一般称为模板),每一个逼近一个偏导数:-1-1 -10 0 01 1 1-1-1 -10 0 01 1 1 pv= ph=如果我们用 prewitt算子检测图像 m 的边缘的话,我们可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的 m1,m2,他们分别表示图像 m 中相同位置处的两个偏导数。然后把 m1,m2 对应位置的两个数平方后相加得到一个新的矩阵g,g 表示 m 中各个像素的灰度的梯度值(一个逼近)。然后就可以通过阀值处理得到边缘
47、图像。总的过程是: 公式 4.6sobel 算子和 prewitt算子的不同就在于使用的模板不一样:-1-2 -10 0 0-1-2 -1-1 0 -1-2 0 -2-1 0 -15s1= s2=我们假设图像的灰度满足下面这个关系:7公式 4.7当前像素 33 邻域内像素值为 7公式 4.8定义垂直算子和水平算子形如:-a 0 a-b 0 b-a 0 a-a-b -a0 0 0a b a5之所以这样定义是为了满足对称性和电路设计的需要。 利用这两个模板对当前像素进行卷积,得到的方向导数为 6公式 4.9因此当前像素处的梯度的大小为: 4公式 4.10显然要有: 4公式 4.11如果我们取a=b
48、=1/6则得到的模板就是1/6乘prewitt算子;如果我们取 a=1/8,b=1/4则得到的就是1/8乘 sobel 算子。 哪一个算子比较好?这个问题的答案取决于图像的噪声,如果在每个点噪声都是相同的,那么 prewitt算子是比较好的;如果靠近边缘的噪声是沿着边缘的2倍,那么 sobel 算子是比较好的。也就是算子的好坏取决于噪声的结构。事实上,它们存在一些共同的问题: a.他们的结果对噪声很敏感,图像的离散差分对噪声比对原图像更敏感; b.可以通过先对图像做平滑以改善结果,但是又会产生一个问题:会把一些靠在一起的边缘平滑掉,而且会影响对边缘的定位;54.3 kirsch算子1971年,
49、r.kirsch34提出了一种边缘检测的新方法:它使用了8个模板来确定梯度和梯度的方向。假设原来的 33子图像的如下: 7则边缘的梯度大小为: 5公式 4.12其中 5公式 4.13上面的下标如果超过7就用 8去除取余数。注意到 k=0,1,.7,其实就是使用了 8个模板了4.15.14.4 拉普拉斯算子拉普拉斯算子是对二维函数进行运算的二阶导数算子。通常使用的拉普拉斯算子如下面所示:0-10-14-10-10-1-1-1-18-1-1-1-1 由于拉普拉斯算子是一个二阶导数,它将在边缘处产生一个陡峭的零交叉,如下图所示由于噪声点对边缘检测有一定的影响,所以高斯拉普拉斯算子是效果较好的边缘检测器。它把高
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论