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

下载本文档

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

文档简介

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

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

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

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

5、发现原图中左边暗,右边亮,中间存在着一条明显的边界。 0 0 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) x f(x,y)y 图6-1 显示屏幕的坐标系为了与f ( x,y)表示法相一致,图像f(i,j)中的i代表列,j代表行。如果用右列减去左列,即每一个像素的值为:G ( i, j ) = f ( i , j )- f ( i-1, j ) 结果如下: 0 1 254 0 0

6、0 0 0 253 -1 1 0 0 0 255 0 -2 0 0 - 1 254 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)

8、 沿方向r的梯度为: (6-2) 的最大值条件是 =0 即:=0 (6-3)梯度是向量,各向同性。梯度方向对应于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)每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的灰

10、度值与其左方的像素的灰度值之差的绝对值。(4)将缓冲区中的图像复制回原图数据区。3程序代码/* *函数名称:ZongXiang() *函数类型:void *功能:对图像进行纵向微分 */void WeiFenDib:ZongXiang()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽p_data=this->GetData ();wide=this->GetWidth ();height=this->GetHeight ();LPBYTE temp=new BYTE wide*height; /开辟图像一缓冲区memset(tem

11、p,255,wide*height);for(int j=1;j<height-1;j+)for(int i=1;i<wide-1;i+)/当前像素的灰度值等于其和左方像素灰度值之差的绝对值tempwide*j+i=abs(p_datawide*j+i-p_datawide*j+(i-1);/将缓冲区中的图像复制回原图数据区memcpy(p_data, temp,wide*height);/删除缓冲区delete temp; 4效果对比图 (a)原图 (b)纵向微分运算 图6-2纵向微分运算6.2.2 横向微分运算1理论基础该算法的数学表达式为:G ( i, j ) = f ( i

12、 , j ) - f ( i , j-1 )+ (6-7)该算法用如下卷积核:2。实现步骤(1)取得原图的数据区指针。(2)开辟一块内存缓冲区,并初始化为255。(3)每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的灰度值与其上方的像素的灰度值之差的绝对值。(4)将缓冲区中的图像复制回原图数据区。3程序代码/* *函数名称:HengXiang() *函数类型:void *功能:对图像进行横向微分 */void WeiFenDib:HengXiang()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽p_data=this->

13、;GetData ();wide=this->GetWidth ();height=this->GetHeight ();LPBYTE temp=new BYTE wide*height; /开辟图像一缓冲区memset(temp,255,wide*height);for(int j=1;j<height-1;j+)for(int i=1;i<wide-1;i+)/当前像素的灰度值等于其和上方像素灰度值之差的绝对值tempwide*j+i=abs(p_datawide*j+i-p_datawide*(j-1)+i);/将缓冲区中的图像复制回原图数据区memcpy(p_d

14、ata, temp,wide*height);/删除缓冲区delete temp;4效果对比图图6-3 横向微分运算6.2.3 双方向一次微分运算1理论基础对灰度图像f在纵方向和横方向两个方向进行微分。该算法是同时增强水平和垂直方向的边缘。该算法的数学表达式为:G(i,j)=sqrtf(i,j)-f(i,j-1)*f(i,j)-f(i,j-1)+f(i,j)-f(i-1,j)* f(i,j)-f(i-1,j) (6-8)对于含小数的G ( i , j )可四舍五入。该算法用如下卷积核: 水平(i方向) 垂直(j方向)使用水平方向卷积核得出像素值为m,使用垂直方向卷积核得出像素值为n,该像素边界

15、强度为:sqrt(m×m)+(n×n)。该算法是同时增强水平和垂直方向的边缘。2实现步骤(1)取得原图的数据区指针。(2)开辟一块内存缓冲区,并初始化为255。(3)每个像素依次循环,原图中当前像素的灰度值与其左方的像素的灰度值之差的绝对值的平方,再加上当前像素的灰度值与其上方的像素的灰度值之差的绝对值的平方,所得的平方根即为新图像当前像素的灰度值。(4)缓冲区中的图像复制回原图数据区。3程序代码/* *函数名称:ShuangXiang() *函数类型:void *功能:对图像进行双向一次微分 */void WeiFenDib:ShuangXiang()LPBYTE p_d

16、ata; /原图数据区指针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;j<height-1;j+)for(int i=1;i<wide-1;i+)/根据双向一次微分公式计算当前像素的灰度值tempwide*j+i=(int)sqrt(p_datawide

17、*j+i-p_datawide*j+(i-1)*(p_datawide*j+i-p_datawide*j+(i-1)+(p_datawide*j+i-p_datawide*(j-1)+i)*(p_datawide*j+i-p_datawide*(j-1)+i);/将缓冲区中的图像复制回原图数据区memcpy(p_data, temp,wide*height);/删除缓冲区delete temp;4处理结果 (a)原图 (b)纵向微分运算 (c) 横向微分运算 (d) 双方向一次微分运算图6-4 微分运算 63梯度锐化 图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需

18、要利用图像鋭化技术,使边缘变得清晰。经过平滑的图像变得模糊的根本原因是图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算),就可以使图像变得清晰。图像处理中最常用的微分方法是求梯度。对于图像f(i,j), 它在点(i,j)处的梯度是一个矢量,定义为:Gf(i,j)的梯度为:Gf(i,j)= ()2+( )2 1/2 (6-9) 对离散图像而言,可用差分法近似上述公式,得到:Gf(i,j)= f(i,j) - f(i-1,j)2+ f(i,j) - f(i,j-1)2 1/2 (6-10)这正是双方向一次微分运算。为了便于编程和提高运算,在某些场合可进一步简化为:Gf(i,j)=| f

19、(i,j)- f(i-1,j)|+| f(i,j)- f(i,j-1)| (6-11)利用差分运算时,图像的第一行和第一列的像素的梯度无法求得,一般用后一行或后一列的梯度值近似代替。微分运算可用来求信号的变化率,因而具有加强高频分量的作用,从上一节效果图上可知仅仅微分处理后的图像非常暗,不适用。如果将前面介绍的各种微分运算应用在图像上,既要求图像的轮廓清晰,又要求保持目标物体的内部灰度不变,这就是图像梯度锐化的目的。梯度锐化常用的方法有:ø 直接以梯度值代替;ø 辅以门限判断;ø 给边缘规定一个特定的灰度级;ø 给背景规定灰度级;ø 根据梯度二

20、值化图像.6.3.1 直接以梯度值代替利用双方向一次微分运算,算出梯度后让梯度值等于该点的灰度值。即f(i,j)= Gf(i,j)。Gf(i,j)= f(i,j) - f(i-1,j)2+ f(i,j) - f(i,j-1)2 1/2或Gf(i,j)=| f(i,j)- f(i-1,j)|+| f(i,j)- f(i,j-1)| 这种方法直截了当。但在均匀的区域,因梯度值Gf(i,j)很小,会表现出图像很暗的特性,这在某些场合是不适宜的。就像在前面看到的微分效果一样,除了黑色的背景,几乎看不出什么边界,所以在这里我们就不作介绍了。6.3.2辅以门限判断1理论基础 门限判断梯度锐化的公式如下:G

21、f(i,j)= f(i,j) - f(i-1,j)2+ f(i,j) - f(i,j-1)2 1/2 Gf(i,j)+100; Gf(i,j)Tg(i,j)= f(i,j); 其它 (6-12)该方法基本上不破坏图像的背景,又可增强边缘。这是因为Gf(i,j)表示的是两个像素点之间灰度差的大小,也就是梯度的大小。对于图像而言,物体和物体之间,背景和背景之间的梯度变化一般很小,灰度变化较大的地方一般集中在图像的边缘上,也就是物体和背景交接的地方,当设定一个合适的阈值T,Gf(i,j)大于T就认为该像素点处于图像的边缘,对结果加100,以使边缘变亮,而对于Gf(i,j)不大于T就认为像素点是同类像

22、素(同是物体或同是背景)。这样既增亮了物体的边界,同时又保留了图像背景原来的状态。2. 实现步骤(1)获得原图像的首地址,及图像的宽和高;(2)开辟一块内存缓冲区,并初始化为255;(3)计算图像的像素的梯度,将结果保存在内存缓冲区;(4)比较像素的梯度是否大于30,是则将梯度值加100,不是则将该像素点的灰度值恢复,如果梯度加100大于255,将其置为255;(5)将内存中的数据复制到图像数据区。 3. 编程代码/* *函数名称:Menxianruihua() *函数类型:void *功能:对图像进行门限梯度锐化 */ void TiDuRuiHuaDib:Menxianruihua() L

23、PBYTE p_data; /原图数据区指针int wide,height; /原图长、宽 p_data=this->GetData (); 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;j<height-1;j+)for(int i=1;i<wide-1;i+)/根据双向一次微分公式计算当前像素的灰

24、度值temp=(int)sqrt(p_datawide*j+i-p_datawide*j+(i-1)*(p_datawide*j+i-p_datawide*j+(i-1)+(p_datawide*j+i-p_datawide*(j-1)+i)*(p_datawide*j+i-p_datawide*(j-1)+i); if (temp>=30) if(temp+100)>255) p_tempwide*j+i=255;else p_tempwide*j+i=temp+100;if (temp<30)p_tempwide*j+i=p_datawide*j+i;/将缓冲区中的图像复

25、制回原图数据区memcpy(p_data,p_temp,wide*height);/删除缓冲区delete p_temp; 4处理效果图 (a) 原图 (b)辅以门限判断效果图图6-5辅以门限判断效果图6.3.3 给边缘规定一个特定的灰度级1理论基础 Gf(i,j)= f(i,j) - f(i-1,j)2+ f(i,j) - f(i,j-1)2 1/2 La; Gf(i,j)Tg(i,j)= f(i,j); 其它 (6-13)La为一指定的灰度值。这种处理实际上是门限锐化的一种特殊形式,它将边界的灰度值统一化,这样可以使边界更加清晰明显。该方法基本上不破坏图像的背景,又可找到边缘,并根据需要增

26、强边缘。2实现步骤(1)获得原图像的首地址,及图像的高和宽。(2)开辟一块内存缓冲区,并初始化为255。(3)计算图像的像素的梯度,将结果保存在内存缓冲区。(4)比较像素的梯度是否大于30,是则将灰度值置为255,否则恢复该像素原来的灰度值。(5)将内存中的数据复制到图像数据区。3 编程代码/* *函数名称:GuDingRuiHua() *函数类型:void *功能:给边缘规定一个特定的灰度级。 */ void TiDuRuiHuaDib:GuDingRuiHua()LPBYTE p_data; /原图数据区指针int wide,height; /原图长、宽p_data=this->Ge

27、tData ();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;j<height-1;j+)for(int i=1;i<wide-1;i+)/根据双向一次微分公式计算当前像素的灰度值temp=(int)sqrt(p_datawide*j+i-p_datawide*j+(i-1)*(p_datawide*j+i-

28、p_datawide*j+(i-1)+(p_datawide*j+i-p_datawide*(j-1)+i)*(p_datawide*j+i-p_datawide*(j-1)+i); if (temp>30) p_tempwide*j+i=255;else p_tempwide*j+i=p_datawide*j+i;/将缓冲区中的图像复制回原图数据区 memcpy(p_data,p_temp,wide*height); /删除缓冲区 delete p_temp;4效果对比图 (a)原图 (b)给边缘规定一个特定的灰度级图6-6给边缘规定一个特定的灰度级6.3.4给背景规定灰度级 Gf(i

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

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

31、: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_temp,255,wide*height); /初始化为255int temp

32、;for(int j=1;j<height-1;j+) for(int i=1;i<wide-1;i+)/根据双向一次微分公式计算当前像素的灰度值temp=(int)sqrt(p_datawide*j+i-p_datawide*j+(i-1)*(p_datawide*j+i-p_datawide*j+(i-1)+(p_datawide*j+i-p_datawide*(j-1)+i)*(p_datawide*j+i-p_datawide*(j-1)+i); if (temp>30) p_tempwide*j+i=255; else p_tempwide*j+i=0;/将缓冲区中

33、的图像复制回原图数据区memcpy(p_data,p_temp,wide*height);/删除缓冲区delete p_temp;4处理效果图 (a) 原图 (b)根据梯度二值化效果图图6-7根据梯度二值化6.4边缘检测图像边缘对图像识别和计算机分析十分有用。边缘能勾划出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息(如方向,阶跃性质、形状等),是图像识别中抽取图像特征的重要属性。从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变等)的反映,它标志着一个区域的终结和另一个区域的开始。边缘提取首先检出图像局部特性的不连续性,然后在将这些不连续的边缘像素连成完备的边界。边缘的特性

34、是沿边缘走向的像素变化平缓,而垂直与边缘方向的像素变化剧烈。所以,从这个意义上说,提取边缘的算法就是检出符合边缘特性的边缘像素的数学算子。边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。有若干种方法可以使用,其中大多数是基于方向导数模板求卷积的方法。边缘模板用于沿着不同的方向检测边缘的四个模板。如下给出了大小为3×3的边缘模板,它们能够在0º、45º、90º 和135º四个方向上检测边缘,将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板为候选模板,其方向表示了该点处边缘的方向,如果所有方向上的边

35、缘模板接近于零,则在该像素点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,则该像素点处没有可靠的边缘方向。 (a)0º模板 (b)90º模板 (c)45º模板 (d)135º模板对于灰度图像f,对以像素f(i,j)为中心的3×3区域施加不同的3×3加权屏蔽窗口,每个3×3窗口称为算子,是一个3×3的整数矩阵,处理时用卷积的方法,即将算子覆盖的区域按相应位置的像素值乘以算子中相应的系数再相加,其结果即为此窗口的相关值,求最大值作为中心点像素的灰度值。由于我们常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微

36、分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线形微分算子。最基本的一类边缘检测算子是微分算子类。包括:梯度算子,Robert梯度算子、Sobel算子、Prewitt边缘检测算子、Krisch边缘检测算子、Laplacian算子等。除了Laplacian算子,其他的算子基于的是一阶方向导数在边缘处取最大值这一变化规律。Robert采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,用Robert梯度检测边缘较好。Sobel算子有一定噪声抑制能力,在检测阶跃边缘时得到的边缘宽度至少为二像素,它不依赖于边缘方向的二阶微分算子,是一个标量而不是向量,具有旋转不变即各向同性的性质,

37、在图像处理中经常被用来提取图像的边缘。Laplacian算子基于的是二阶导数的零交叉。微分算子类边缘检测方法的效果类似于空间域的高通滤波,有增强高频分量的作用。因而,这类算子对噪声是敏感的。对于有噪声的图像,LoG算子对图像先进行高斯滤波,然后应用Laplacian算子来提高边缘提取的能力。当然也可以不先滤除噪声,而是对处理的结果进行统计检测来获得边缘。本节介绍的算子有:ø Roberts边缘检测算子;ø Sobel边缘检测算子;ø Prewitt边缘检测算子;ø Krisch边缘检测;øLoG_Laplacian高斯-拉普拉斯算子。 6.4.

38、1 Roberts边缘检测算子1 理论基础Roberts边缘算子采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位准,对噪声敏感。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:Roberts算子:Gi,j=|fi,j-fi+1,j+1|+|fi+1,j-fi,j+1|; (6-17)Gi,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)是具有整数像素坐标的输入图像,平方根运算使该处理类似于在人类视觉系统

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

40、 pixel4; /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;j<height-1;j+)for(i=0;i<wide-1;i+) /生成Robert算子pixel0=p_dataj*wide+i;

41、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; 4效果对比图 图6-8 Roberts边缘检测效果图 6.4.2 Sobel边缘检测算子1理论基础(1)卷积卷积可以简单

42、的看成加权求和的过程。卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即区域中心像素的新值。比如,对于一个3×3的区域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卷积核中各元素叫卷积系数。卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。大多数常用的卷积核都是3×3

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

44、检测算子的中心与中心像素相对应,进行卷积运算。两个卷积核的最大值作为该点的输出位。运算结果是一幅边缘幅度图像。在边沿检测中,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) - 2f(i+1,j) - f(i+1,j+1);

温馨提示

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

评论

0/150

提交评论