matlab图像锐化处理及边缘检测_第1页
matlab图像锐化处理及边缘检测_第2页
matlab图像锐化处理及边缘检测_第3页
matlab图像锐化处理及边缘检测_第4页
matlab图像锐化处理及边缘检测_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、-PAGE . z.Matlab图像锐化处理及边缘检测本章要点:图像边缘锐化的根本方法微分运算梯度锐化边缘检测61 图像边缘锐化的根本方法物体的边缘是以图像局部特性不连续性的形式出现。本质上边缘常意味着一个区域的终结和另一个区域的开场。图像边缘信息在图像分析和人的视觉中都是十分重要的,是图像识别中提取图像特征的一个重要特性。图像的边缘有方向和幅度两个特性。通常,延边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。边缘的描述包含以下几个方面:1 边缘点它两边像素的灰度值有显著的不同。边缘点也存在于这样一对邻点之间即一个在较亮的区域内部,另一个在外部。2边缘法线方向在*点灰度变化最剧烈的方向

2、,与边缘方向垂直。3边缘方向与边缘法线方向垂直,是目标边界的切线方向。4边缘位置边缘所在的坐标位置。5边缘强度沿边缘法线方向图像局部的变化强度的量度。粗略地区分边缘种类可以有两种,其一是阶跃状边缘,它两边像素的灰度值有显著的不同,其二是屋顶状边缘,它位于灰度值从增加到减少的变化转折点。这些变化分别对应景物中不同的物理状态。边缘是图像上灰度变化比拟剧烈的地方,如果一个像素落在图像中*一个物体的边界上,则它的邻域将成为一个灰度级的变化带。对这种变化最有用的两个特征是灰度的变化率和方向,在灰度变化突变处进展微分,将产生高值。经典的边缘提取方法是考虑图像的每个像素在*个领域内的变化,利用边缘邻近一阶或

3、二阶方向导数变化规律,来检测边缘。图像灰度值的显著变化可以用一阶差分替代一阶微分的梯度来表示,它们分别以梯度向量的幅度和方向来表示。因此图像中陡峭边缘的梯度值将是很大的;那些灰度变化平缓的地方,梯度值是比拟小的;而那些灰度值一样的地方,梯度值将为零。图像经过梯度运算能灵敏地检测出边界限,这种微分边缘检测算子运算简单易行,但有方向性。利用计算机进展图像锐化处理有两个目的,一是与柔化处理相反,增强图像边缘,使模糊的图像变得更加清晰起来,颜色变得鲜明突出,图像的质量有所改善,产生更适合人观察和识别的图像,本章的梯度锐化就是介绍这方面的内容。二是希望经过锐化处理后,目标物体的边缘鲜明,以便于计算机提取

4、目标物体的边界、对图像进展分割、目标区域识别、区域形状提取等,为图像理解和分析打下根底,目前它已成为机器视觉研究领域最活泼的课题之一,在工程应用中占有十分重要的地位,本章的边缘检测算子就是介绍这方面的内容。与图像平滑处理相对应,图像锐化也可以分为空间域图像锐化法和空间频率域图像锐化法两大类型。空间频率域图像锐化的方法将在第九章介绍,本章介绍边缘增强及边缘检测的方法,基于空间域处理,为分割及目标物体特征提取打下根底。6.2 微分运算边缘是由相邻域灰度级不同像素点构成的,假设想增强边缘,就应该突出相邻点间灰度级的变化。如下列图所示,不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。 0 0

5、1 255 255 255 255 1 1 1 254 253 254 254 0 0 0 255 255 253 253 1 1 0 254 254 254 254注意:由于计算机显示屏幕的坐标原点在视窗的左上角,显示屏幕的坐标系如图6-1所示。 (0,0) * f(*,y)y 图6-1 显示屏幕的坐标系为了与f ( *,y)表示法相一致,图像f(i,j)中的i代表列,j代表行。如果用右列减去左列,即每一个像素的值为:G ( i, j ) = f ( i , j )- f ( i-1, j ) 结果如下: 0 1 254 0 0 0 0 0253 -1 1 00 0 255 0 -2 0 0

6、- 1254 0 0 0 可以看出,第3列比其他列的灰度值高很多,在边界附近,灰度值有明显的跳变,人眼观察时,就能发现一条很明显的亮边;在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0,区域都很暗。这样,G ( i, j ) = f ( i , j )- f ( i-1, j )就起到了垂直边沿检测的作用。如对于上面那幅图像转置,得到如下列图像数据:0 1 0 10 1 0 11 1 0 0255 254 255 254 255 253 255 254255254 253 254255254 253 254该边缘是水平方向的,这时如果还用左列减去右列就得不到边界数据,必须是下一行减去上

7、一行,即每一个像素的值为:G ( i, j ) = - f ( i, j-1 ) + f ( i , j ),图像上得到一条很明显的亮边。这就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,梯度是有方向的,和边沿的方向总是正交(垂直)的。图像灰度的变化情况可以用灰度分布的梯度来反映。图像处理中最常用的微分方法是求梯度。对于图像f(i,j), 它在点(i,j)处的梯度是一个矢量,定义为: 6-1其方向导数在边缘法线方向上取得局部最大值。怎样求f(i,j)梯度的局部最大值和方向呢?我们知道f(i,j) 沿方向r的梯度为: 6-2 的最大值条件是 =0 即:=0 6-3梯度是

8、向量,各向同性。梯度方向对应于f(i,j)最大变化率方向上,即梯度最大值 G= 6-4为了减少计算量而用G= 6-5梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。因此,微分运算应用在图像上,可使图像的轮廓清晰。本节介绍的微分运算有: 纵向微分运算; 横向微分运算; 双方向一次微分运算。6.2.1 纵向微分运算1理论根底对灰度图像在纵方向进展微分实现了将图像向左平移一个像素,再用原图像减去平移后图像。相减的结果反映了原图像亮度变化率的大小。原图像中像素值保持不变的区域,相减的结果为零,即像素为黑;原图像中像素灰度值变化剧烈的区域,相减

9、后得到较大的变化率,对应的像素很亮,而且像素灰度值差异越大,则得到的像素就越亮,所以图像的垂直边缘得到增强。本程序对灰度图像f在纵方向或横方向进展微分,在数字处理中,微分用差分表近似,并按下式求得:G ( i, j ) = f ( i , j )- f ( i-1, j-1 ) 6-6该算法用如下卷积核:2实现步骤1取得原图的数据区指针。(2)开辟一块内存缓冲区,并初始化为255。3每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的灰度值与其左方的像素的灰度值之差的绝对值。4将缓冲区中的图像复制回原图数据区。3程序代码/* *函数名称:Zong*iang() *函数类型:v

10、oid *功能:对图像进展纵向微分 */void WeiFenDib:Zong*iang()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽p_data=this-GetData ();wide=this-GetWidth ();height=this-GetHeight ();LPBYTE temp=new BYTE wide*height; /开辟图像一缓冲区memset(temp,255,wide*height);for(int j=1;jheight-1;j+)for(int i=1;iGetData ();wide=this-GetWidt

11、h ();height=this-GetHeight ();LPBYTE temp=new BYTE wide*height; /开辟图像一缓冲区memset(temp,255,wide*height);for(int j=1;jheight-1;j+)for(int i=1;iGetData ();wide=this-GetWidth ();height=this-GetHeight ();LPBYTE temp=new BYTE wide*height; /开辟图像一缓冲区memset(temp,255,wide*height);for(int j=1;jheight-1;j+)for(i

12、nt i=1;iGetData (); wide=this-GetWidth (); height=this-GetHeight (); LPBYTE p_temp=new BYTE wide*height; /开辟图像一缓冲区memset(p_temp,255,wide*height); /初始化为255int temp;for(int j=1;jheight-1;j+)for(int i=1;i=30) if(temp+100)255) p_tempwide*j+i=255;else p_tempwide*j+i=temp+100;if (tempGetData ();wide=this-

13、GetWidth ();height=this-GetHeight ();LPBYTE p_temp=new BYTE wide*height; /开辟图像一缓冲区memset(p_temp,255,wide*height); /初始化为255int temp;for(int j=1;jheight-1;j+)for(int i=1;i30) p_tempwide*j+i=255;elsep_tempwide*j+i=p_datawide*j+i;/将缓冲区中的图像复制回原图数据区 memcpy(p_data,p_temp,wide*height); /删除缓冲区 delete p_temp;

14、4效果比照图 a原图 b给边缘规定一个特定的灰度级图6-6给边缘规定一个特定的灰度级6.3.4给背景规定灰度级 Gf(i,j); Gf(i,j)Tg(i,j)=Lb; 其它 6-14Lb为一对背景指定的灰度值。这种处理的原理和上一节介绍的给边缘规定一个特定的灰度级的原理是一样的,只不过这种处理将图像的背景灰度值统一化了,因此在这里不重复介绍了。6.3.5 根据梯度二值化图像1理论根底对阶跃边缘,在边缘点其一阶导数取极值。由此,我们对数字图像f(i,j)的每个像素取它的梯度值G(i,j),适当取门限T作如下判断:假设G(i,j)T则(i,j)点为阶跃状边缘点,G(i,j)称为梯度算子的边缘图像。

15、 La; Gf(i,j)Tg(i,j)= Lb; 其它 6-15La 和 Lb 的意义同上。梯度是向量,各向同性。梯度方向对应于F(i,j)最大变化率方向上,即Q=arctan/ 6-16梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。这样处理可以使图像锐化的结果更加清晰,把图像中我们关心的局部突出出来,去除了我们不感兴趣的局部。2实现步骤(1)获得原图像的首地址,及图像的高和宽;(2)开辟一块内存缓冲区,并初始化为255;(3)计算图像的像素的梯度;(4)将结果保存在内存缓冲区比拟像素的梯度是否大于30,是则将灰度值置为255,否则

16、将该像素的灰度值置位0;(5)将内存中的数据复制到原图像的数据区。3. 编程代码/* *函数名称:Erzhirihua() *函数类型:void *功能: 根据梯度二值化图像。 */ void TiDuRuiHuaDib:Erzhirihua() LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽p_data=this-GetData (); wide=this-GetWidth (); height=this-GetHeight (); LPBYTE p_temp=new BYTE wide*height; /开辟图像一缓冲区memset(p_tem

17、p,255,wide*height); /初始化为255int temp;for(int j=1;jheight-1;j+) for(int i=1;i30) p_tempwide*j+i=255; else p_tempwide*j+i=0;/将缓冲区中的图像复制回原图数据区memcpy(p_data,p_temp,wide*height);/删除缓冲区delete p_temp;4处理效果图(a) 原图 b根据梯度二值化效果图图6-7根据梯度二值化6.4边缘检测图像边缘对图像识别和计算机分析十分有用。边缘能勾划出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息如方向,阶跃性质、形状等,

18、是图像识别中抽取图像特征的重要属性。从本质上说,图像边缘是图像局部特性不连续性灰度突变、颜色突变等的反映,它标志着一个区域的终结和另一个区域的开场。边缘提取首先检出图像局部特性的不连续性,然后在将这些不连续的边缘像素连成完备的边界。边缘的特性是沿边缘走向的像素变化平缓,而垂直与边缘方向的像素变化剧烈。所以,从这个意义上说,提取边缘的算法就是检出符合边缘特性的边缘像素的数学算子。边缘检测算子检查每个像素的邻域并对灰度变化率进展量化,通常也包括方向确实定。有假设干种方法可以使用,其中大多数是基于方向导数模板求卷积的方法。边缘模板用于沿着不同的方向检测边缘的四个模板。如下给出了大小为33的边缘模板,

19、它们能够在0、45、90 和135四个方向上检测边缘,将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板为候选模板,其方向表示了该点处边缘的方向,如果所有方向上的边缘模板接近于零,则在该像素点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,则该像素点处没有可靠的边缘方向。(a)0模板 (b)90模板 (c)45模板 (d)135模板对于灰度图像f,对以像素f(i,j)为中心的33区域施加不同的33加权屏蔽窗口,每个33窗口称为算子,是一个33的整数矩阵,处理时用卷积的方法,即将算子覆盖的区域按相应位置的像素值乘以算子中相应的系数再相加,其结果即为此窗口的相关值,求最大

20、值作为中心点像素的灰度值。由于我们常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线形微分算子。最根本的一类边缘检测算子是微分算子类。包括:梯度算子,Robert梯度算子、Sobel算子、Prewitt边缘检测算子、Krisch边缘检测算子、Laplacian算子等。除了Laplacian算子,其他的算子基于的是一阶方向导数在边缘处取最大值这一变化规律。Robert采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,用Robert梯度检测边缘较好。Sobel算子有一定噪声抑制能力,在检测阶跃边缘时得到的边缘宽度至少为二像素,

21、它不依赖于边缘方向的二阶微分算子,是一个标量而不是向量,具有旋转不变即各向同性的性质,在图像处理中经常被用来提取图像的边缘。Laplacian算子基于的是二阶导数的零穿插。微分算子类边缘检测方法的效果类似于空间域的高通滤波,有增强高频分量的作用。因而,这类算子对噪声是敏感的。对于有噪声的图像,LoG算子对图像先进展高斯滤波,然后应用Laplacian算子来提高边缘提取的能力。当然也可以不先滤除噪声,而是对处理的结果进展统计检测来获得边缘。本节介绍的算子有: Roberts边缘检测算子; Sobel边缘检测算子; Prewitt边缘检测算子; Krisch边缘检测;LoG_Laplacian高斯

22、-拉普拉斯算子。 6.4.1 Roberts边缘检测算子理论根底Roberts边缘算子采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位准,对噪声敏感。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:Roberts算子:Gi,j=|fi,j-fi+1,j+1|+|fi+1,j-fi,j+1|; 6-17Gi,j=(fi,j-fi+1,j+1) 2+(fi+1,j-fi,j+1) 2 1/2; 6-18其中Gi,j表示处理后(i,j)点的灰度值,fi,j表示处理前该点的灰度值。其中f(i,j)是具有整数像素坐标的输入图像,平方根运算使该处理类似于

23、在人类视觉系统中发生的过程。该算法的算子如下: 2 实现步骤(1)取得原图的数据区指针。(2)开辟一个和原图一样大小的图像缓冲区,并设定新图像初值为全白255。(3)每个像素依次循环,用Roberts边缘检测算子分别计算图像中各点灰度值,对它们平方之和,再开方。(4)将缓冲区中的数据复制到原图数据区。3 编程实现/* *函数名称:Robert() *函数类型:void *功能:用罗伯特算子对图像进展边缘检测。 */ void BianYuanJianCeDib:Robert() LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽int i,j; /循环

24、变量int pi*el4; /Robert算子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;jheight-1;j+)for(i=0;iwide-1;i+) /生成Robert算子pi*el0=p_dataj*wide+i; pi*el1=p_dataj*

25、wide+i+1;pi*el2=p_data(j+1)*wide+i;pi*el3=p_data(j+1)*wide+i+1;/处理当前像素tempj*wide+i=(int)sqrt(pi*el0-pi*el3)*(pi*el0-pi*el3)+(pi*el1-pi*el2)*(pi*el1-pi*el2);/将缓冲区中的数据复制到原图数据区memcpy(p_data, temp,wide*height);/删除缓冲区delete temp; 4效果比照图 图6-8 Roberts边缘检测效果图 6.4.2 Sobel边缘检测算子1理论根底1卷积卷积可以简单的看成加权求和的过程。卷积时使用的

26、权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小一样。这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即区域中心像素的新值。比方,对于一个33的区域P与卷积核K卷积后,区域P的中心像素p5表示如下:p5=p1*k1+ p2*k2+ p8*k8+ p9*k9其中 p1 p2 p3 k1 k2 k3 p4 p5 p6 k = k4 k5 k6 p7 p8 p9 k7 k8 k9卷积核中各元素叫卷积系数。卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。大多数常用的卷积核都是33的,所有卷积核的行、列都是奇数。进展卷积时会遇到一些较复杂

27、的问题,首先是图像边界的问题。当在图像上逐个移动卷积核时,只要卷积核移到了图像边界,即卷积核悬挂在图像边界上时,就会出现计算上的问题。这时在原图像上就不能完整找到与卷积核中卷积系数相对应的九个对33卷积核图像像素。解决这一问题的两个简单方法是:或者忽略图像边界数据,或者在图像的四周复制图像的边界数据。(2)Sobel边缘检测算子Sobel边缘检测算子是先做成加权平均,再微分,然后求梯度。以下两个卷积核形成了Sobel边缘检测算子,图中的每个点都用这两个核做卷积,其中一个对垂直边缘影响最大,而另一个对水平边缘影响最大。边缘检测算子的中心与中心像素相对应,进展卷积运算。两个卷积核的最大值作为该点的

28、输出位。运算结果是一幅边缘幅度图像。在边沿检测中,sobel算子对于像素的位置的影响做了加权,加权平均边宽2像素,因此效果更好。水平边缘Sobel算子垂直边缘Sobel算子即:f(i-1,j-1)f(i,j-1) f(i+1,j-1)f(i-1,j)f(i,j)f(i+1,j)f(i-1,j+1)f(i,j+1)f(i+1,j+1)G i= f(i-1,j+1) + 2f(i,j+1) + f(i+1,j+1)- f(i-1,j-1) - 2f(i,j-1) - f(i+1,j-1);G j= f(i-1,j-1) + 2f(i-1,j) + f(i-1,j+1)- f(i+1,j-1) -

29、2f(i+1,j) - f(i+1,j+1);Gf(i,j)=|G i |+|G j |;有时为了检测特定方向上的边缘,也采用特殊的方向算子,如检测450或1350边缘的Sobel方向算子检测450 Sobel方向算子检测1350 Sobel方向算子2 实现步骤(1)取得原图的数据区指针。(2)开辟两个和原图一样大小的图像缓冲区,将原图复制到两个缓冲区。(3)分别设置Sobel算子的两个模板,调用Templat()模板函数分别对两个缓冲区中的图像进展卷积计算。(4)两个缓存图像每个像素依次循环,取两个缓存中各个像素灰度值较大者。(5)将缓冲区中的图像复制到原图数据区。编程实现(1)卷积/*函数

30、名称:Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempM*, int tempMY, float *fpArray, float fCoef) *函数类型:void *参数:BYTE* m_pdata:指向原DIB图像指针 * int wide:原图像宽度 * int height:原图像高度 * int tempH:模板高度 * int tempW:模板宽度 * int tempM*:模板的中心元素*坐标(tempW-1) * int tempMY:模板的中心元素Y坐标(tempH-1) *

31、 float *fpArray:指向模板数组的指针 * float fCoef:模板系数 *返回值:处理成功返回TRUE;处理失败返回FALSE。 *功能:用指定模板对图像进展操作。 */void BianYuanJianCeDib:Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempM*, int tempMY, float *fpArray, float fCoef) int i,j,k,l; /循环变量 BYTE* temp=new BYTEwide*height; /新图像缓冲区/初始化新

32、图像为原始图像 memcpy( temp,m_pdata,wide*height); float fResult; /像素值计算结果for(j=tempMY;jheight-tempH+tempMY+1;j+)for(i=tempM*;iwide-tempW+tempM*+1;i+)/计算像素值fResult=0;for(k=0;ktempH;k+)for(l=0;l255)/假设超过255,直接赋值为255 tempj*wide+i=255;else/未超过255,赋值为计算结果 tempj*wide+i=(int)(fResult+0.5); memcpy(m_pdata, temp,wi

33、de*height); /复制处理后的图像delete temp;(2)Sobel水平与垂直边缘检测边缘检测/* *函数名称:Sobel() *函数类型:void *功能:用索伯尔算子对图像进展水平与垂直边缘检测。 */void BianYuanJianCeDib:Sobel() LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽int i,j; /循环变量int tempH; /模板高度int tempW; /模板宽度float tempC; /模板系数int tempMY; /模板中心元素Y坐标int tempM*; /模板中心元素*坐标float

34、 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;t

35、empM*=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,tempM*,tempMY,Template,tempC); /设置Sobel模板参数 Template0=-1.0; Template1=0.0;Template2=1.0;Template3=-2.0;Templa

36、te4=0.0;Template5=2.0;Template6=-1.0;Template7=0.0;Template8=1.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i) temp1j*wide+i= temp2j*wide+i; /将缓存中的图像复制到原图数据区memcpy(p_data, temp1,wide*height);/删除缓冲区delete te

37、mp1;delete temp2;4 处理效果图6-9 Sobel边缘检测 6.4.3 Prewitt边缘检测算子1 理论根底以下两个卷积核形成了Prewitt边缘检测算子。同使用Sobel算子的方法一样,图像中的每个点都用这两个核进展卷积,取最大值作为输出。Prewitt边缘检测算子也产生一幅边缘强度图像。Prewitt边缘检测算子为:2 实现步骤1取得原图的数据区指针。2开辟两个和原图一样大小的图像缓冲区,将原图复制到两个缓冲区。3分别设置Prewitt算子的两个模板,调用Templat()模板函数分别对两个缓冲区中的图像进展卷积计算。4两个缓存图像每个像素依次循环,取两个缓存中各个像素灰

38、度值较大者。5将缓冲区中的图像复制到原图数据区。3 程序代码/* *函数名称:PreWitt() *函数类型:void *功能:用普瑞维特算子对图像进展边缘检测。 */void BianYuanJianCeDib:PreWitt()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽int i,j; /循环变量int tempH; /模板高度int tempW; /模板宽度float tempC; /模板系数int tempMY; /模板中心元素Y坐标int tempM*; /模板中心元素*坐标float Template9; /模板数组p_data=t

39、his-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;tempM*=1;Template0=-1.0;Tem

40、plate1=-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,tempM*,tempMY,Template,tempC);/设置Prewitt模板2参数Template0=1.0;Template1=0.0;Template2=-1.0;Template3=1.0;Template4=0.0;Template5=-1.0;Templ

41、ate6=1.0;Template7=0.0;Template8=-1.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC);/求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i) temp1j*wide+i= temp2j*wide+i; memcpy(p_data, temp1,wide*height); /复制处理后的图像delete temp1;delete temp2;4 处理效果 图6-10 Prewitt边缘检

42、测6.4.4 Krisch边缘检测 1 理论根底以下8个卷积核组成了Kirsch边缘检测算子。图像中的每个点都用8个掩模进展卷积,每个掩模都对*个特定边缘方向作出最大响应,所有8个方向中的最大值作为边缘幅度图像输出。最大响应掩模的序号构成了边缘方向的编码。Kirsch边缘检测算子为:2 实现步骤取得原图的数据区指针。开辟两个和原图一样大小的图像缓冲区,将原图复制到两个缓冲区。分别设置Kirsch算子的模板1和模板2,调用Templat()模板函数分别对两个缓冲区中的图像进展卷积计算。求出两幅缓存图像中每个像素的较大灰度值存放在缓存图像1中,并将缓存图像1拷贝到缓存图像2中。同第三步,以此类推,

43、分别设置Kirsch算子的模板3、模板4、模板5、模板6、模板7和模板8,每次计算后,求出两幅缓存图像中灰度值较大者存放在缓存图像1中。最后将得到的结果缓存图像1复制到原图。3 编程实现/* *函数名称:Krisch() *函数类型:void *功能:用克瑞斯算子对图像边缘检测。 */ void BianYuanJianCeDib:Krisch()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽int i,j; /循环变量int tempH; /模板高度int tempW; /模板宽度float tempC; /模板系数int tempMY; /模板

44、中心元素Y坐标int tempM*; /模板中心元素*坐标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);/设置Kirsch模板1参数temp

45、W=3;tempH=3;tempC=0.5;tempMY=1;tempM*=1;Template0=5.0;Template1=5.0;Template2=5.0;Template3=-3.0;Template4=0.0;Template5=-3.0;Template6=-3.0;Template7=-3.0;Template8=-3.0;/调用Templat()函数Templat( temp1,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC);/设置Kirsch模板2参数Template0=-3.0;Template1=5.0;Tem

46、plate2=5.0;Template3=-3.0;Template4=0.0;Template5=5.0;Template6=-3.0;Template7=-3.0;Template8=-3.0;/调用Templat()函数Templat(temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i)temp1j*wide+i= temp2j*wide+i;/拷贝原图像到缓存图像2中 memcpy( temp2,p_data

47、,wide*height); /设置Kirsch模板3参数 Template0=-3.0; Template1=-3.0;Template2=5.0;Template3=-3.0;Template4=0.0;Template5=5.0;Template6=-3.0;Template7=-3.0;Template8=5.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i

48、) temp1j*wide+i= temp2j*wide+i; /拷贝原图像到缓存图像2中 memcpy( temp2,p_data,wide*height); /设置Kirsch模板4参数 Template0=-3.0; Template1=-3.0;Template2=-3.0;Template3=-3.0;Template4=0.0;Template5=5.0;Template6=-3.0;Template7=5.0;Template8=5.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Templ

49、ate,tempC);/求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i) temp1j*wide+i= temp2j*wide+i;/拷贝原图像到缓存图像2中 memcpy( temp2,p_data,wide*height);/设置Kirsch模板5参数 Template0=-3.0; Template1=-3.0;Template2=-3.0;Template3=-3.0;Template4=0.0;Template5=-3.0;Template6=5.0;Template7=5.0;Template8=5.0;/调用Templa

50、t()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC);/拷贝原图像到缓存图像2中 memcpy( temp2,p_data,wide*height); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i)temp1j*wide+i= temp2j*wide+i;/拷贝原图像到缓存图像2中 memcpy( temp2,p_data,wide*height);/设置Kirsch模板6参数 Template0=-3.0; Template1=-3.0

51、;Template2=-3.0;Template3=5.0;Template4=0.0;Template5=-3.0;Template6=5.0;Template7=5.0;Template8=-3.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i)temp1j*wide+i= temp2j*wide+i;/拷贝原图像到缓存图像2中 memcpy( temp2,p_

52、data,wide*height);/设置Kirsch模板7参数 Template0=5.0; Template1=-3.0;Template2=-3.0;Template3=5.0;Template4=0.0;Template5=-3.0;Template6=5.0;Template7=-3.0;Template8=-3.0;/调用Templat()函数 Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Template,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wi

53、de+i) temp1j*wide+i= temp2j*wide+i;/拷贝原图像到缓存图像2中 memcpy( temp2,p_data,wide*height);/设置Kirsch模板8参数 Template0=5.0; Template1=5.0;Template2=-3.0;Template3=5.0;Template4=0.0;Template5=-3.0;Template6=-3.0;Template7=-3.0;Template8=-3.0;/调用Templat()函数Templat( temp2,wide,height,tempH,tempW,tempM*,tempMY,Tem

54、plate,tempC); /求两幅缓存图像的最大值for(j=0;jheight;j+)for(i=0;i temp1j*wide+i) temp1j*wide+i= temp2j*wide+i;memcpy(p_data, temp1,wide*height); /复制处理后的图像delete temp1;delete temp2;4 处理效果 图6-11 Krisch边缘检测6.5 高斯-拉普拉斯算子1 理论根底因为图像边缘有大的灰度变化,所以图像的一阶偏导数在边缘处有局部最大值或最小值,则二阶偏导数在边缘处会通过零点由正到负或由负到正。考虑坐标旋转变换,设旋转前坐标为(*,y),旋转后

55、为(*,y),则有:*=*cos-ysin y=*sin-ycos 6-19 6-20容易看出,虽然,不是各向同性的,但是它们的平方和是各向同性的。即 6-21定义Laplacian算子为f=拉普拉斯算子是各向同性isotropic的微分算子。6-22因此,Laplacian算子是线性二次微分算子,与梯度算子一样,具有旋转不变性,从而满足不同走向的图像边界的锐化要求。对阶跃状边缘,二阶导数在边缘点出现零穿插,即边缘点两旁二阶导函数取异号,据此,对数字图像f(i,j)的每个像素,Laplacian算子取它关于*轴方向和y轴方向的二阶差分之和。G(i,j)=2f(i,j)*2f(i,j)+y2f(

56、i,j)= f(i+1,j)+ f(i-1,j)+ f(i,j+1)+ f(i,j-1)-4f(i,j) 6-23这是一个与边缘方向无关的边缘检测算子。假设2f(i,j)在(i,j)点发生零穿插,则(i,j)为阶跃边缘点。对屋顶状边缘,在边缘点的二阶导数取极小值。据此,对数字图像f(i,j)的每个像素取它的关于*方向和y方向的二阶差分之和的相反数,即Laplacian算子的相反数:G(i,j)= -2f(i,j)- f(i+1,j) - f(i-1,j) - f(i,j+1) -f(i,j-1)+ 4f(i,j),G(i,j)称作边缘图像。由于我们关心的是边缘点位置而不是其周围的实际灰度差,因此,一般都选择与方向无关的边缘检测算子。用拉普拉斯算子检测边缘就是估算拉普拉斯算子的输出,找出它的零点位置。离散情况下,有几种不同的模板计算形式:或或 6-24 拉普拉斯算子由于拉普拉斯算子是一个二阶导数,它将在边缘处产生一个陡峭的零穿插。由于噪声点对边沿检测有一定影响,所以高斯拉普拉斯算子是效果较好的边沿检测器。他把高斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先平滑掉噪声,再进展边沿检测,所

温馨提示

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

评论

0/150

提交评论