基于VC的图像边缘检测算法的研究与比较.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流基于VC的图像边缘检测算法的研究与比较.精品文档.目录摘要IIIAbstractIV第一章 绪论- 1 -1.1数字图像基础- 1 -1.1.1数字图像概述- 1 -1.1.2数字图像处理- 1 -1.2边缘检测介绍- 2 -第二章 图像边缘检测- 3 -2.1边缘检测- 3 -2.1.1边缘检测概念- 3 -2.1.2微分算子- 3 -2.2边缘检测基本思想- 4 -2.3边缘检测算法- 5 -2.3.1边缘检测算法步骤- 5 -2.3.2边缘检测算法流程图- 5 -2.4边缘检测算法中算子的分类- 5 -2.5经典边缘检测算子- 6 -2.5.1 Roberts边缘检测算子- 6 -2.5.2 Sobel边缘检测算子- 7 -2.5.3 Prewitt边缘检测算子- 8 -第三章 Visual C+图像编程- 10 -3.1用C+实现图像处理编程的原因- 10 -3.2 VC+的特点- 10 -3.3 VC+的组成- 11 -3.4 VC与matlab的比较- 12 -第四章 边缘检测算子的编程实现- 14 -4.1程序运行界面- 14 -4.2 Roberts算子程序及结果- 14 -4.3 Sobel算子程序及结果- 17 -4.4 Prewitt算子程序及结果- 23 -4.5结果分析与比较- 27 -第五章 边缘检测技术的发展及应用- 29 -5.1新的边缘检测方法- 29 -5.1.1小波变换和小波包的边缘检测方法- 29 -5.1.2基于数学形态学的边缘检测方法- 29 -5.2边缘检测技术的应用- 30 -5.2.1边缘检测在储粮害虫方面的应用- 30 -5.2.2图像边缘检测技术在电厂中的应用- 31 -结语- 33 -参考文献- 34 -致谢- 35 -基于VC的图像边缘检测算法的研究与比较摘要图像的边缘是图像最基本的特征,它是灰度不连续的结果。图像分析和理解的第一步是边缘检测,因此边缘检测在图像处理中有着重要的作用。图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。本文介绍了三种经典的图像边缘检测算子,并且运用强大的VC软件通过一个图像边缘检测的例子比较了它们的检测效果,分析了它们各自的特点,对学习边缘检测和具体工程应用具有很好的参考价值。关键词: 图像处理,边缘检测, 算子,比较研究,VCComparison And Analysis For Image Edge Detection Algorithms Based On VCAbstractEdge is the most basic feature of the image, it is the result of discontinuous gray. The first step in image analysis and understanding is edge detection, so edge detection plays an important role in image processing. Image edge detection significantly reduces the amount of data and removes irrelevant information,retains the important structural properties of images.This article describes three types of classical edge detection operators, and the use the powerful software called VC to do the edge detection through a comparison of examples of the effect of their detection, analysis the characteristics,this is good reference value for their learning edge detection and application of specific projects.Key Words: Image processing ,Edge detection ,Operator ,Comparative Study ,VC第一章 绪论1.1数字图像基础1.1.1数字图像概述人眼能识别的自然景象或图像原也是一种模拟信号,为了使计算机能够记录和处理图像、图形,必须首先使其数字化。数字化后的图像、图形称为数字图像、数字图形,一般也简称为图像、图形。数字图像可以看成一个矩阵,或一个二维数组,这是在计算机上表示的方式。一幅M×N个像素的数字图像,其像素灰度值可以用M行、N列的矩阵G表示: (11)在存储数字图像时,一幅M行、N列的数字图像(M×N个像素),可以用一个M×N的二维数组T表示。图像的各个像素灰度值可按一定顺序存放在数组T中1。1.1.2数字图像处理数字图像处理(Digital Image Processing)是利用计算机的计算功能,实现与光学系统模拟处理相同效果的过程。数字图像处理具有如下特点:(1)处理精度高,再现性好。利用计算机进行图像处理,其实质是对图像数据进行各种运算。由于计算机技术的飞速发展,计算精度和计算的正确性都毋庸置疑;另外,对同一图像用相同的方法处理多次,也可得到完全相同的效果,具有良好的再现性。(2)易于控制处理效果。在图像处理程序中,可以任意设定或变动各种参数,能有效控制处理过程,达到预期处理效果。这一特点在改善图像质量的处理中表现更为突出。(3)处理的多样性。由于图像处理是通过运行程序进行的,因此,设计不同的图像处理程序,可以实现各种不同的处理目的。(4)图像数据量庞大。图像中包含有丰富的信息,可以通过图像处理技术获取图像中包含的游泳的信息,但是,数字图像的数据量具大,一幅数字图像是由图像矩阵中的像素组成的,通常每个像素用红、绿、蓝三种颜色表示,每种颜色用8bit表示灰度级。则一幅1024×1024不经压缩的真彩色图像,数据量达3MB(即1024×1024×8bit×3=24Mb)。如此庞大的数据量给存储、传输和处理都带来巨大的困难。如果精度及分辨率再提高,所需处理时间将大幅度增加。(5)处理费时。由于图像数据量大,因此处理比较费时。特别是处理结果与中心像素邻域有关的处理过程花费时间更多。(6)图像处理技术综合性强。数字图像处理涉及的技术领域相当广泛,如通信技术、计算机技术、电子技术、电视技术等,当然,数学、物理学等领域更是数字图像处理的基础。1.2边缘检测介绍图像的边缘对人的视觉具有重要意义,一般而言,当人们看见一个有边缘的物体的时候,首先感觉到的便是边缘。边缘是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合,灰度或结构等信息的突变处成为边缘。边缘或许对应着图像中物体(的边界)或许并没有对应着图像中物体(的边界),但是边缘具有十分令人满意的性质,它能大大地减少所要处理的信息但是又保留了图像中物体的形状信息,边缘是图像的最基本特征。边缘在边界检测、图像分割、模式识别、机器视觉等中有很重要的作用。边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括(i)深度上的不连续、表面方向不连续、物质属性变化和场景照明变化。边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。第二章 图像边缘检测2.1边缘检测2.1.1边缘检测概念图像的边缘是图像最基本的特征,它是灰度不连续的结果。通过计算一阶导数或者二阶导数可以方便检测出图像中每个像素在其领域内的灰度变化,从而检测出边缘。图像中具有不同灰度的相邻区域之间总存在边缘。常见的边缘类型有斜坡型、线状型和屋顶型。阶跃型边缘是一种理想的边缘,由于采样等缘故,边缘处总有一些模糊,因而边缘处会有灰度斜坡,形成了斜坡边缘。斜坡边缘的坡度与被模糊的程度成反比,模糊程度高的边缘往往表现为厚边缘。线状型边缘有一个灰度突变,对应图像中的细线条;而屋顶型边缘两侧的灰度坡度相对平缓,对应粗边缘2。2.1.2微分算子图2.1给出了几种典型的边缘及其相应的一阶导数和二阶导数。对于斜坡型边缘,在灰度斜坡的起点和终点,其一阶导数均有一个阶跃,在斜坡处为常数,其它地方为零;其二阶导数在斜坡起点产生一个向上的脉冲,在终点产生一个向下的脉冲,其它地方为零,在两个脉冲之间有一个过零点,可以确定边缘的中心位置。对应线状型边缘,在边缘的起点和终点处,其一阶导数都有一个阶跃,分别对应极大值和极小值;在边缘的起点与终点处,其二阶导数都对应一个向上的脉冲,在边缘中心对应一个向下的脉冲,在边缘中心两侧存在两个过零点。因此,通过检测二阶差分的两个过零点,就可以确定线状型边缘的范围;检测二阶差分的极小值,可以确定边缘中心位置。屋顶型边缘的一阶导数和二阶导数与线状型类似,通过检测其一阶导数的过零点可以确定屋顶的位置。灰度斜面一阶导数二阶导数(a) 斜坡型(b) 线状型(c) 屋顶型图2.1 典型边缘的一阶导数和二阶导数由上述分析可以得出以下结论:一阶导数的幅度值可以用来检测边缘的存在;通过检测二阶导数的过零点可以确定边缘的中心位置;利用二阶导数在过零点附近的符号可以确定边缘像素位于边缘的暗区还是亮区。另外,一阶导数和二阶导数对噪声非常敏感,尤其是二阶导数。因此,在边缘检测之前应考虑图像平滑,减弱噪声的影响。在数字图像处理中,常利用差分近似微分来求取导数。边缘检测可借助微分算子在空间域通过模板卷积来实现。2.2边缘检测基本思想边缘检测的基本思想是首先利用边缘增强算子,突出图像中的局部边缘,然后定义像素的“边缘强度”,通过设置阈值的方法提取边缘点集 。但是由于噪声和图像模糊的原因,检测到的边界可能会有间断的情况发生,所以边缘检测包含2 个内容:(1)用边缘算子提取边缘点集。(2)在边缘点集合中去除某些边缘点并填充一些边缘点,将得到的边缘点集连接为线。2.3边缘检测算法2.3.1边缘检测算法步骤边缘检测算法包含有以下四个步骤:(1)滤波 边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,因此必须使用滤波器来改善与噪声有关的边缘检测器的性能。需要指出 ,大多数滤波器在降低噪声的同时也导致了边缘强度的损失。因此增强边缘和降低噪声之间需要折中。(2)增强 增强边缘的基础是确定图像各点邻域强度的变化值 ,增强算法可以将邻域(或局部)强度值有显著变化的点显现出来,边缘增强一般是通过计算梯度幅值来完成的。(3)检测 在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,所以应该用某种方法来确定哪些点是边缘点。最简单的边缘检测判据是梯度幅值阈值判据。(4)定位 如果某一应用场合要求确定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也可以被估计出来。2.3.2边缘检测算法流程图图像获取滤波增强检测边缘点定位边缘方位图像输出图2.2 边缘检测流程图边缘检测流程图比较形象直观地描述了边缘检测的步骤,通过滤波、增强、检测、定位来达到边缘检测的目的。2.4边缘检测算法中算子的分类在大部分情况下,都是把图像的边缘全部看作是阶梯形边缘, 然后求得检测这种边缘的各种最优滤波器,用于实践中。边缘检测主要是(图像的)灰度变化的度量、检测和定位。有很多种不同的边缘检测方法,同一种方法使用的滤波器也不尽相同。边缘检测就是研究更好的边缘检测方法和检测算子。检测出的边缘并不等于实际目标的真实边缘。由于图像数据是二维的,而实际物体是三维的,从三维到二维的投影必然会造成信息的丢失,再加上成像过程中的光照不均和噪声等原因的影响,使得有边缘的地方不一定能被检测出来,而检测出来的边缘也不一定代表实际边缘。这就需要我们根据不同类型的图像,来选取合适的边缘检测算子。就一些经典的边缘检测算子分类,如图2.3。基础边缘检测算子Roberts微分算子Sobel微分算子Prewitt微分算子Laplace微分算子Wallis算子Kirsch算子Log算子Dog算子二阶导数过零点Canny算子图2.3 数字图像边缘检测算子分类2.5经典边缘检测算子2.5.1 Roberts边缘检测算子1、理论基础3Roberts边缘算子采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位准,对噪声敏感。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,它有下式给出。Roberts算子: (31) (32)其中表示处理后点的灰度值,表示处理前该点的灰度值。是具有整数像素坐标的输入图像,平方根运算使该处理类似于在人类视觉系统中发生的是过程。 该算法的算子如下: (33)2.5.2 Sobel边缘检测算子理论基础:(1)卷积卷积可以简单的看成加权求和的过程。卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。这种权矩阵叫做卷积核,区域中的每一个像素分别与卷积核中的每个元素相乘,所有乘积之和即区域中心像素的新值。比如,对于一个3×3的区域p与卷积核k卷积后,区域p的中心像素p5表示如下: (34)其中 (35)卷积核中各元素叫做卷积系数。卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。大多数常用的卷积核都是3×3的,所有的卷积核的行、列都是奇数。进行卷积时会遇到一些复杂的问题,首先是图像边界的问题。当在图像上逐个移动卷积核时,只要卷积核移动到了图像边界,即卷积核悬挂在图像边界上时,就会出现计算上的问题。这时在原图像上就不能完整的找到与卷积核中系数相对应的9个图像像素。解决这个问题的两个简单方法是:或者忽略图像边界数据,或者在图像的四周复制图像的边界数据。Sobel边缘检测算子是先做加权平均再微分,然后求梯度,即 (36) (37) (38)以下两个卷积核形成了Sobel边缘检测算子,图中的每个点都用这两个核做卷积,一个核对通常的垂直边缘影响很大,而另一个对水平边缘影响很大。边缘检测算子的中心与中心像素相对应,进行卷积运算。两个卷积核的最大值作为该点的输出位。运算结果是一幅边缘幅度图像。在边缘检测中,Sobel算子对于像素的位置的影响做了加权,加权平均边宽像素,因此效果更好。 (39)2.5.3 Prewitt边缘检测算子理论基础以下两个卷积核形成了Prewitt边缘检测算子。同使用的Sobel算子的方法一样,图像中的每个点都用这两个核进行卷积,取最大值作为输出。Prewitt边缘检测算子也产生一幅边缘增强图像。Prewitt边缘检测算子为: (310)除此之外,还有Krish边缘检测算子、拉普拉斯边缘检测算子、Canny边缘检测算子等都是比较常用的图像边缘检测算子。第三章 Visual C+图像编程3.1 Visual C+概述 VC+是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C+的一个开发平台。严格的来说VC+不是门语言,虽然它和C+之间有密切的关系,如果形象点比喻的话,可以把C+看作为一种“工业标准”,而VC+则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。采用VC+来实现图像编程的主要原因是,与Java和C#等现代编程语言相比,C+在程序运行的效率、内存使用的可控性和编程的灵活性上具有优势。图像处理需要大量的图像数据运算,经常使用复杂、费时的算法,因此图像处理程序的运行效率非常重要。C+代码被编译成汇编语言,可以直接在处理器上运行,效率很高。对庞大的图像数据进行处理需要使用大量的内存,而计算机的物理内存往往是有限的,因此需要有效地控制内存的操作。C+直接控制内存的分配和释放,这虽然很繁琐,而且容易出错,但却能有效地控制内存的使用。C+中大量使用指针,使得编程的灵活性很高,便于程序员施展编程技巧来提高程序的效率4。3.2 VC+的特点本文介绍的Visual C+是数字图像处理运动检测系统的开发工具,本运动检测系统是以VC+为软件平台建立起来的。Visual C+是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。从功能上来看,它除了继承了MFC1.0的全部功能外,还增加了以下新的特性:全面支持文件的Open、Save和Save As等菜单项,并且采用了最近才使用的文件列表形式。可以方便地进行打印和打印预显。支持滚动窗口和切分窗口(Splitter Window)。支持工具条(Toolbar)和状态条(Status bar).能够处理Microsoft Visual Basic控制。能够方便地实现上下文相关帮助(Context Sensitive Help)。能够自动处理进入对话框中的数据。实现OLE的接口更加简单、方便。因此,它现在已经成为开发Win32程序,包括图像处理程序的主要开发工具。3.3 VC+的组成Visual C+包含了两套完整的Windows应用开发系统。由以下的部分组成:(1)Visual工作平台和创建过程:这是一个运行于Windows上的交互式开发环境,它是直接从Microsoft QuickC for Windows演化而来的。(2)App Studio资源编辑器:堪称是Windows应用,同时它本身就是通过使用Visual C+工具及类库编写而成的,可以对自身的资源进行编辑。(3)C/C+编译器:Visual C+的编译器可以处理C和C+源代码,它通过源代码文件后缀来识别代码本身所使用的语言。(4)连接器:为了生成EXE文件,Visual C+的连接器需要对编译器所生成的OBJ文件进行处理。(5)资源编译器:在编译状态和联编状态都要用到资源编译器。(6)调试器:为了能够对程序进行调试,在创建程序时必须设置编译器和连接器相应的选项以便产生相应的可调试信息。(7)AppWizard:它会按照用户通过对话框指定的特性、类名及源代码文件名来产生Windows应用的工作构架。(8)ClassWizard:能够给出原型、函数体以及将消息同应用框架相联系的相应代码。(9)源程序浏览器:能够使人们从类或函数的角度来了解程序。(10)联机帮助:有关WindowsSDK参考手册及类库参考手册的全部内容都包含在Visual C+的联机帮助中。(11)Windows诊断工具:用于对手工编制的make文件进行处理的NMAKE程序。结束开始编译源代码编译编译错误链接链接错误运行程序运行时错误?是否是是否否图3.1 VC+运行流程图3.4 VC+与matlab的比较Matlab比较适合于做研究,因为它提供了大量的算法库,只用写简简单单的几句代码就可以完成某一算法或者某一功能,因此对于算法研究它具有较好的优势。同时它也提供了接口供VC使用,并且Matlab的开发速度比较快,见效也比较快,也比较容易实现。但是,如果你要写应用程序的话,最好用VC,不要用Matlab,也不要和Matlab集成,然后自己完成所有的算法,这样便于后续的扩展,在构建应用程序的时候也非常方便,而且还可以不断升级以适应更加复杂的情况,使用起来也更加灵活。VC本来就是一个功能很强大的软件,可以完成几乎所有的事情。缺点就是开发进度比较慢,特别是对于初学者来说,需要一段时间来适应VC的开发环境和开发理念,如果以后要跨平台了,实现起来也是很容易的。主要看做图像处理的目的了,是研究用还是做项目用!如果做项目用,那就用VC。本次毕业设计主要用VC来实现数字图像边缘检测算法,原因主要有二:一是VC使用C+语言来实现的,C+语言与Java和C#相比在程序运行效率、内存使用可控性、编程灵活性上都具有优势;二是VC是注重应用的,这将为今后的工作在项目的研发上打下良好的基础。第四章 边缘检测算子的编程实现4.1程序运行界面通过VC来实现边缘检测算子的功能,先对Roberts算子、Sobel算子、Prewitt算子进行函数定义,然后再进行函数调用,从而达到边缘检测的不同效果。图4.1 程序运行界面每种算子都是在此界面下进行功能实现的,左半边显示原图,右半边实现边缘检测的实现结果。4.2 Roberts算子程序及结果实现步骤:(1)取得原图的数据区指针(2)开辟一个和原图相同大小的图像缓冲区,并设定新图像初值为全白(255)(3)每个像素依次循环,用Roberts边缘检测算子分别计算图像中各点灰度值,对它们先求平方之和;再开方;将缓冲区中的数据复制到原图数据区。编程实现:函数名称:Roberts()函数类型:void功能:用罗伯特算子对图像进行边缘检测void BianYuanJianCedib:Robert LPBYTE p_data; /原图数据区指针 int wide ,height; /原图高、宽 int i,j; /循环变量 int pixe4; / Roberts算子p_data=this->Getdata();wide=this->GetWidth();height=this->Getheight();LPBYTE temp=new BYTEwide*height; /新图像缓冲区/设定新图像初值为255Memset(temp,255, wide*height)/由于使用2×2的模板,为防止越界,所以不处理最下边两行和最右边的两列像素for(j=0;j<height-1;j+)for(i=0;j<wide-1;i+)/生成Roberts算子pixel0=p_dataj*wide+i;pixel1=p_dataj*wide+i+1;pixel2=p_data(j+1)*wide+i;pixel3=p_data(j+1)*wide+i+1;/处理当前像素tempj*wide+i=(int)sqrt(pixel0-pixel3)*(pixel0-pixel3)+(pixel1-pixel2)*(pixel1-pixel2)/将缓冲区中的数据复制到原图数据区memcpy(p_data,temp, wide*height);/删除缓冲区Delete temp;调用程序:void CDynSplitView2:OnRobert() clearmem();CDibNew1->Robert(); /调用Robert算子检测处理函数 Invalidate();实现结果:图4.2 Robert算子实现结果4.3 Sobel算子程序及结果实现步骤:(1)取得原图像的数据区指针(2)开辟两个和原图相同大小的图像缓冲区,将原图复制到两个缓冲区(3)分别设置Sobel边缘检测算子的两个模板,调用Templat()模板函数分别对两个缓冲区的图像进行卷积运算;(4)两个缓冲图像每个像素依次循环,取两个缓冲中各个像素灰度值较大者(5)将缓冲区的图像复制到原图数据区编程实现:卷积:函数名称:Templat(BYTE *m_pdata,int wide,int height,int tempH,int tempW,int tempMX,int tempMY,float *fpArray,float fCoef)函数类型:void参数:BYTE*m_pdata,指向DIB图像指针 int wide, 原图像宽度 int height,原图像高度 int tempH, 模板高度 int tempW, 模板宽度 int tempMX,模板的中心元素X坐标(<tempW-1)int tempMY, 模板的中心元素Y坐标(<tempH-1)float*fpArray,指向模板数组的指针float fCoef,模板系数返回值:处理成功返回true;处理失败返回flase功能:用指定模板对图像进行操作void BianYuanJianCedib: Templat(BYTE *m_pdata,int wide,int height,int tempH,int tempW,int tempMX,int tempMY,float *fpArray,float fCoef) int i,j,k,l; /循环变量 BYTE*temp=new BYTEwide*height; /新图像缓冲区/初始化新图像为原图像memcpy(temp,m_pdata,wide*height);float fResult; /像素值计算结果for(j=tempMY;j<height-tempH+tempMY+1;j+)for(j=tempMX;j<height-tempW+tempMX+1;i+)/计算像素值fResult=0;for(k=0;k<tempH;k+)for(l=0;l<tempW;l+)fResult= fResult+m_pdata(j-tempMY+k)*wide+(i-tempMX+1)*fpArrayk*tempW+1;/乘上系数fResult*=fCoef;/取绝对值fResult=(float)fabs(fResult);/判断是否超过255if(fResult>255)/若超过255,直接赋值为255tempj*wide+i=255;else/未超过255,赋值为计算结果 tempj*wide+i=(int)(fResult+0.5);memcpy(m_pdata,temp,wide*height); /复制处理后的图像delete temp;sobel水平和垂直边缘检测函数名称:Sobel()函数类型:void功能:用Sobel算子对图像进行水平和垂直边缘检测void BianYuanJianCedib:Sobel LPBYTE p_data; /原图数据区指针 int wide ,height; /原图高、宽 int i,j; /循环变量int tempH; /模板高度int tempW; /模板宽度int tempC; /模板系数int tempMY; /模板中心元素Y坐标int tempMX; /模板中心元素X坐标float template9; /模板数组p_data=this->Getdata();wide=this->GetWidth();height=this->GetHeight();LPBYTE temp1=new BYTEwide*height; /新图像缓冲区LPBYTE temp2=new BYTEwide*height; /新图像缓冲区/复制原图像到缓冲图像memcpy(temp1,p_data, wide*height);memcpy(temp2,p_data, wide*height);/设置Sobel模板参数tempW=3;tempH=3;tempC=1.0;tempMY=1;tempMX=1; Template0=-1.0;Template1= -2.0;Template2= -1.0;Template3=0.0;Template4= 0.0;Template5= 0.0;Template6=1.0;Template7= 2.0;Template8= 1.0;/调用Templat()函数Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);/设置Sobel模板参数Template0=-1.0;Template1= 0.0;Template2= 1.0;Template3=-2.0;Template4= 0.0;Template5= 2.0;Template6=-1.0;Template7= 0.0;Template8= 1.0;/调用Templat()函数Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);/求两幅缓冲图像的最大值for(j=0;j<height;j+)for(i=0;i<wide;i+) if(temp2j*wide+i>temp1j*wide+i)temp1j*wide+i=temp2j*wide+i;memcpy(p_data,temp1,wide*height); /复制处理后的图像/删除缓冲区delete temp1;delete temp2;调用程序:void CDynSplitView2:OnSobel() clearmem();CDibNew1->Sobel(); /调用Sobel算子检测处理函数 Invalidate();实现结果:图4.3 Sobel算子实现结果4.4 Prewitt算子程序及结果实现步骤(1)取得原图像的数据区指针(2)开辟两个和原图相同大小的图像缓冲区,(3)分别设置Prewitt边缘检测算子的两个模板,调用Templat()模板函数分别对两个缓冲区的图像进行卷积运算;(4)两个缓冲图像每个像素依次循环,取两个缓冲中各个像素灰度值较大者(5)将缓冲区的图像复制到原图数据区编程实现:函数名称:Prewitt()函数类型:void功能:用Prewitt算子对图像进行边缘检测void BianYuanJianCedib: prewittLPBYTE p_data; /原图数据区指针 int wide ,height; /原图高、宽 int i,j; /循环变量int tempH; /模板高度int tempW; /模板宽度int tempC; /模板系数int tempMY; /模板中心元素Y坐标int tempMX; /模板中心元素X坐标float template9; /模板数组p_data=this->Getdata();wide=this->GetWidth();height=this->GetHeight();LPBYTE temp1=new BYTEwide*height; /新图像缓冲区LPBYTE temp2=new BYTEwide*height; /新图像缓冲区/复制原图像到缓冲图像memcpy(temp1,p_data, wide*height);memcpy(temp2,p_data, wide*height);/设置prewitt模板1参数tempW=3;tempH=3;tempC=1.0;tempMY=1;tempMX=1;Template0=-1.0;Template1= -1.0;Template2= -1.0;Template3=0.0;Template4= 0.0;Template5= 0.0;Template6=1.0;Template7= 1.0;Template8= 1.0;/调用Templat()函数Templat( temp1,wide,height,tempH,tempW,tempMX,tempMY,Template,tempC);/设置Prewitt模板2函数Template0=1.0;Template1= 0.0;Template2= -1.0;Template3=1.0;Template4= 0