收藏 分销(赏)

matlab图像锐化处理及边缘检测.doc

上传人:二*** 文档编号:4594250 上传时间:2024-09-30 格式:DOC 页数:31 大小:3.21MB 下载积分:5 金币
下载 相关 举报
matlab图像锐化处理及边缘检测.doc_第1页
第1页 / 共31页
本文档共31页,全文阅读请下载到手机保存,查看更方便
资源描述
. - Matlab图像锐化处理及边缘检测 本章要点: þ图像边缘锐化的根本方法 þ微分运算 þ梯度锐化 þ边缘检测 6.1 图像边缘锐化的根本方法 物体的边缘是以图像局部特性不连续性的形式出现。本质上边缘常意味着一个区域的终结和另一个区域的开场。图像边缘信息在图像分析和人的视觉中都是十分重要的,是图像识别中提取图像特征的一个重要特性。图像的边缘有方向和幅度两个特性。通常,延边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。边缘的描述包含以下几个方面: 〔1〕 边缘点——它两边像素的灰度值有显著的不同。边缘点也存在于这样一对邻点之间即一个在较亮的区域内部,另一个在外部。 〔2〕边缘法线方向——在某点灰度变化最剧烈的方向,与边缘方向垂直。 〔3〕边缘方向——与边缘法线方向垂直,是目标边界的切线方向。 〔4〕边缘位置——边缘所在的坐标位置。 〔5〕边缘强度——沿边缘法线方向图像局部的变化强度的量度。 粗略地区分边缘种类可以有两种,其一是阶跃状边缘,它两边像素的灰度值有显著的不同,其二是屋顶状边缘,它位于灰度值从增加到减少的变化转折点。这些变化分别对应景物中不同的物理状态。边缘是图像上灰度变化比拟剧烈的地方,如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级的变化带。对这种变化最有用的两个特征是灰度的变化率和方向,在灰度变化突变处进展微分,将产生高值。经典的边缘提取方法是考虑图像的每个像素在某个领域内的变化,利用边缘邻近一阶或二阶方向导数变化规律,来检测边缘。图像灰度值的显著变化可以用一阶差分替代一阶微分的梯度来表示,它们分别以梯度向量的幅度和方向来表示。因此图像中陡峭边缘的梯度值将是很大的;那些灰度变化平缓的地方,梯度值是比拟小的;而那些灰度值一样的地方,梯度值将为零。图像经过梯度运算能灵敏地检测出边界限,这种微分边缘检测算子运算简单易行,但有方向性。 利用计算机进展图像锐化处理有两个目的,一是与柔化处理相反,增强图像边缘,使模糊的图像变得更加清晰起来,颜色变得鲜明突出,图像的质量有所改善,产生更适合人观察和识别的图像,本章的梯度锐化就是介绍这方面的内容。二是希望经过锐化处理后,目标物体的边缘鲜明,以便于计算机提取目标物体的边界、对图像进展分割、目标区域识别、区域形状提取等,为图像理解和分析打下根底,目前它已成为机器视觉研究领域最活泼的课题之一,在工程应用中占有十分重要的地位,本章的边缘检测算子就是介绍这方面的内容。 与图像平滑处理相对应,图像锐化也可以分为空间域图像锐化法和空间频率域图像锐化法两大类型。空间频率域图像锐化的方法将在第九章介绍,本章介绍边缘增强及边缘检测的方法,基于空间域处理,为分割及目标物体特征提取打下根底。 6.2 微分运算 边缘是由相邻域灰度级不同像素点构成的,假设想增强边缘,就应该突出相邻点间灰度级的变化。如下列图所示,不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。 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 0 0 0253 -1 1 0 0 0 255 0 -2 0 0- 1254 0 0 0 可以看出,第3列比其他列的灰度值高很多,在边界附近,灰度值有明显的跳变,人眼观察时,就能发现一条很明显的亮边;在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0,区域都很暗。 这样,G ( i, j ) = f ( i , j )- f ( i-1, j )就起到了垂直边沿检测的作用。 如对于上面那幅图像转置,得到如下列图像数据: 0 1 0 1 0 1 0 1 1 1 0 0 255 254 255 254 255 253 255 254 255 254 253 254 255 254 253 254 该边缘是水平方向的,这时如果还用左列减去右列就得不到边界数据,必须是下一行减去上一行,即每一个像素的值为: 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〕 梯度是向量,各向同性。梯度方向对应于f(i,j)最大变化率方向上,即 梯度最大值 G== 〔6-4〕 为了减少计算量而用G= 〔6-5〕 梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。因此,微分运算应用在图像上,可使图像的轮廓清晰。 本节介绍的微分运算有: ø 纵向微分运算; ø 横向微分运算; ø 双方向一次微分运算。 6.2.1 纵向微分运算 1.理论根底 对灰度图像在纵方向进展微分实现了将图像向左平移一个像素,再用原图像减去平移后图像。相减的结果反映了原图像亮度变化率的大小。原图像中像素值保持不变的区域,相减的结果为零,即像素为黑;原图像中像素灰度值变化剧烈的区域,相减后得到较大的变化率,对应的像素很亮,而且像素灰度值差异越大,那么得到的像素就越亮,所以图像的垂直边缘得到增强。 本程序对灰度图像f在纵方向或横方向进展微分,在数字处理中,微分用差分表近似,并按下式求得: G ( i, j ) = f ( i , j )- f ( i-1, j-1 ) 〔6-6〕 该算法用如下卷积核: 2.实现步骤 〔1〕取得原图的数据区指针。 (2)开辟一块内存缓冲区,并初始化为255。 〔3〕每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的灰度值与其左方的像素的灰度值之差的绝对值。 〔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(temp,255,wide*height); for(int j=1;j<height-1;j++) for(int i=1;i<wide-1;i++) //当前像素的灰度值等于其和左方像素灰度值之差的绝对值 temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*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 , 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->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++) //当前像素的灰度值等于其和上方像素灰度值之差的绝对值 temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*(j-1)+i]); //将缓冲区中的图像复制回原图数据区 memcpy(p_data, temp,wide*height); //删除缓冲区 delete temp; } 4.效果比照图 图6-3 横向微分运算 6.2.3 双方向一次微分运算 1.理论根底 对灰度图像f在纵方向和横方向两个方向进展微分。该算法是同时增强水平和垂直方向的边缘。该算法的数学表达式为: G(i,j)=sqrt{[f(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,该像素边界强度为:sqrt[〔m×m〕+〔n×n〕]。该算法是同时增强水平和垂直方向的边缘。 2.实现步骤 〔1〕取得原图的数据区指针。 (2)开辟一块内存缓冲区,并初始化为255。 〔3〕每个像素依次循环,原图中当前像素的灰度值与其左方的像素的灰度值之差的绝对值的平方,再加上当前像素的灰度值与其上方的像素的灰度值之差的绝对值的平方,所得的平方根即为新图像当前像素的灰度值。 〔4〕缓冲区中的图像复制回原图数据区。 3.程序代码 /************************************************************** *函数名称:ShuangXiang() *函数类型:void *功能:对图像进展双向一次微分 **************************************************************/ void WeiFenDib::ShuangXiang() { 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;j<height-1;j++) for(int i=1;i<wide-1;i++) //根据双向一次微分公式计算当前像素的灰度值 temp[wide*j+i]=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i] -p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i]) *(p_data[wide*j+i]-p_data[wide*(j-1)+i])); //将缓冲区中的图像复制回原图数据区 memcpy(p_data, temp,wide*height); //删除缓冲区 delete temp; } 4.处理结果 (a)原图 (b)纵向微分运算 (c) 横向微分运算 (d) 双方向一次微分运算 图6-4 微分运算 6.3梯度锐化 图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像鋭化技术,使边缘变得清晰。经过平滑的图像变得模糊的根本原因是图像受到了平均或积分运算,因此可以对其进展逆运算〔如微分运算〕,就可以使图像变得清晰。 图像处理中最常用的微分方法是求梯度。对于图像f(i,j), 它在点(i,j)处的梯度是一个矢量,定义为: G[f(i,j)]的梯度为: G[f(i,j)]=[ 〔〕2+〔〕2]1/2 〔6-9〕 对离散图像而言,可用差分法近似上述公式,得到: G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 }1/2 〔6-10〕 这正是双方向一次微分运算。为了便于编程和提高运算,在某些场合可进一步简化为: G[f(i,j)]=| f(i,j)- f(i-1,j)|+| f(i,j)- f(i,j-1)| 〔6-11〕 利用差分运算时,图像的第一行和第一列的像素的梯度无法求得,一般用后一行或后一列的梯度值近似代替。微分运算可用来求信号的变化率,因而具有加强高频分量的作用,从上一节效果图上可知仅仅微分处理后的图像非常暗,不适用。如果将前面介绍的各种微分运算应用在图像上,既要求图像的轮廓清晰,又要求保持目标物体的内部灰度不变,这就是图像梯度锐化的目的。 梯度锐化常用的方法有: ø直接以梯度值代替; ø辅以门限判断; ø 给边缘规定一个特定的灰度级; ø 给背景规定灰度级; ø 根据梯度二值化图像. 6.3.1 直接以梯度值代替 利用双方向一次微分运算,算出梯度后让梯度值等于该点的灰度值。 即f(i,j)= G[f(i,j)]。 G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 }1/2 或G[f(i,j)]=| f(i,j)- f(i-1,j)|+| f(i,j)- f(i,j-1)| 这种方法直截了当。但在均匀的区域,因梯度值G[f(i,j)]很小,会表现出图像很暗的特性,这在某些场合是不适宜的。就像在前面看到的微分效果一样,除了黑色的背景,几乎看不出什么边界,所以在这里我们就不作介绍了。 6.3.2辅以门限判断 1理论根底 门限判断梯度锐化的公式如下: G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 }1/2 G[f(i,j)]+100; G[f(i,j)]≥T g(i,j)= f(i,j); 其它 〔6-12〕 该方法根本上不破坏图像的背景,又可增强边缘。这是因为G[f(i,j)]表示的是两个像素点之间灰度差的大小,也就是梯度的大小。对于图像而言,物体和物体之间,背景和背景之间的梯度变化一般很小,灰度变化较大的地方一般集中在图像的边缘上,也就是物体和背景交接的地方,当设定一个适宜的阈值T,G[f(i,j)]大于T就认为该像素点处于图像的边缘,对结果加100,以使边缘变亮,而对于G[f(i,j)]不大于T就认为像素点是同类像素〔同是物体或同是背景〕。这样既增亮了物体的边界,同时又保存了图像背景原来的状态。 2. 实现步骤 〔1〕获得原图像的首地址,及图像的宽和高; 〔2〕开辟一块内存缓冲区,并初始化为255; 〔3〕计算图像的像素的梯度,将结果保存在内存缓冲区; 〔4〕比拟像素的梯度是否大于30,是那么将梯度值加100,不是那么将该像素点的灰度值恢复,如果梯度加100大于255,将其置为255; 〔5〕将内存中的数据复制到图像数据区。 3. 编程代码 /*************************************************************** *函数名称:Menxianruihua() *函数类型:void *功能:对图像进展门限梯度锐化 ***************************************************************/ void TiDuRuiHuaDib::Menxianruihua() { 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); //初始化为255 int temp; for(int j=1;j<height-1;j++) for(int i=1;i<wide-1;i++) { //根据双向一次微分公式计算当前像素的灰度值 temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i] -p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i]) *(p_data[wide*j+i]-p_data[wide*(j-1)+i])); if (temp>=30) { if((temp+100)>255) p_temp[wide*j+i]=255; else p_temp[wide*j+i]=temp+100; } if (temp<30) p_temp[wide*j+i]=p_data[wide*j+i]; } //将缓冲区中的图像复制回原图数据区 memcpy(p_data,p_temp,wide*height); //删除缓冲区 delete p_temp; } 4.处理效果图 (a) 原图 (b)辅以门限判断效果图 图6-5辅以门限判断效果图 6.3.3 给边缘规定一个特定的灰度级 1理论根底 G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 }1/2 La; G[f(i,j)]≥T g(i,j)=    f(i,j); 其它 〔6-13〕   La为一指定的灰度值。这种处理实际上是门限锐化的一种特殊形式,它将边界的灰度值统一化,这样可以使边界更加清晰明显。该方法根本上不破坏图像的背景,又可找到边缘,并根据需要增强边缘。 2实现步骤 (1)获得原图像的首地址,及图像的高和宽。 (2)开辟一块内存缓冲区,并初始化为255。 (3)计算图像的像素的梯度,将结果保存在内存缓冲区。 (4)比拟像素的梯度是否大于30,是那么将灰度值置为255,否那么恢复该像素原来的灰度值。 (5)将内存中的数据复制到图像数据区。 3. 编程代码 /*************************************************************** *函数名称:GuDingRuiHua() *函数类型:void *功能:给边缘规定一个特定的灰度级。 ***************************************************************/ void TiDuRuiHuaDib::GuDingRuiHua() { 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); //初始化为255 int temp; for(int j=1;j<height-1;j++) for(int i=1;i<wide-1;i++) { //根据双向一次微分公式计算当前像素的灰度值 temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i] -p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i]) *(p_data[wide*j+i]-p_data[wide*(j-1)+i])); if (temp>30) { p_temp[wide*j+i]=255; } else p_temp[wide*j+i]=p_data[wide*j+i]; } //将缓冲区中的图像复制回原图数据区 memcpy(p_data,p_temp,wide*height); //删除缓冲区 delete p_temp; } 4.效果比照图 〔a〕原图 〔b〕给边缘规定一个特定的灰度级 图6-6给边缘规定一个特定的灰度级 6.3.4给背景规定灰度级 G[f(i,j)]; G[f(i,j)]≥T g(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; G[f(i,j)]≥T g(i,j)=    Lb; 其它 〔6-15〕  La 和 Lb 的意义同上。 梯度是向量,各向同性。梯度方向对应于F(i,j)最大变化率方向上,即 Q=arctan[/] 〔6-16〕 梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。这样处理可以使图像锐化的结果更加清晰,把图像中我们关心的局部突出出来,去除了我们不感兴趣的局部。 2实现步骤 (1)获得原图像的首地址,及图像的高和宽; (2)开辟一块内存缓冲区,并初始化为255; (3)计算图像的像素的梯度; (4)将结果保存在内存缓冲区比拟像素的梯度是否大于30,是那么将灰度值置为255,否那么将该像素的灰度值置位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_temp,255,wide*height); //初始化为255 int temp; for(int j=1;j<height-1;j++) for(int i=1;i<wide-1;i++) { //根据双向一次微分公式计算当前像素的灰度值 temp=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)]) *(p_data[wide*j+i]-p_data[wide*j+(i-1)])+(p_data[wide*j+i] -p_data[wide*(j-1)+i])*(p_data[wide*j+i]-p_data[wide*(j-1)+i])); if (temp>30) { p_temp[wide*j+i]=255; } else p_temp[wide*j+i]=0; } //将缓冲区中的图像复制回原图数据区 memcpy(p_data,p_temp,wide*height); //删除缓冲区 delete p_temp; } 4.处理效果图 (a) 原图 〔b〕根据梯度二值化效果图 图6-7根据梯度二值化 6.4边缘检测 图像边缘对图像识别和计算机分析十分有用。边缘能勾划出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息〔如方向,阶跃性质、形状等〕,是图像识别中抽取图像特征的重要属性。从本质上说,图像边缘是图像局部特性不连续性〔灰度突变、颜色突变等〕的反映,它标志着一个区域的终结和另一个区域的开场。 边缘提取首先检出图像局部特性的不连续性,然后在将这些不连续的边缘像素连成完备的边界。边缘的特性是沿边缘走向的像素变化平缓,而垂直与边缘方向的像素变化剧烈。所以,从这个意义上说,提取边缘的算法就是检出符合边缘特性的边缘像素的数学算子。 边缘检测算子检查每个像素的邻域并对灰度变化率进展量化,通常也包括方向确实定。有假设干种方法可以使用,其中大多数是基于方向导数模板求卷积的方法。边缘模板用于沿着不同的方向检测边缘的四个模板。如下给出了大小为3×3的边缘模板,它们能够在0º、45º、90º 和135º四个方向上检测边缘,将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板为候选模板,其方向表示了该点处边缘的方向,如果所有方向上的边缘模板接近于零,那么在该像素点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,那么该像素点处没有可靠的边缘方向。 (a)0º模板 (b)90º模板 (c)45º模板 (d)135º模板 对于灰度图像f,对以像素f(i,j)为中心的3×3区域施加不同的3×3加权屏蔽窗口,每个3×3窗口称为算子,是一个3×3的整数矩阵,处理时用卷积的方法,即将算子覆盖的区域按相应位置的像素值乘以算子中相应的系数再相加,其结果即为此窗口的相关值,求最大值作为中心点像素的灰度值。 由于我们常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线形微分算子。最根本的一类边缘检测算子是微分算子类。包括:梯度算子,Robert梯度算子、Sobel算子、Prewitt边缘检测算子、 Krisch边缘检测算子、Laplacian算子等。除了Laplacian算子,其他的算子基于的是一阶方向导数在边缘处取最大值这一变化规律。Robert采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,用Robert梯度检测边缘较好。Sobel算子有一定噪声抑制能力,在检测阶跃边缘时得到的边缘宽度至少为二像素,它不依赖于边缘方向的二阶微分算子,是一个标量而不是向量,具有旋转不变即各向同性的性质,在图像处理中经常被用来提取图像的边缘。Laplacian算子基于的是二阶导数的零穿插。微分算子类边缘检测方法的效果类似于空间域的高通滤波,有增强高频分量的作用。因而,这类算子对噪声是敏感的。对于有噪声的图像,LoG算子对图像先进展高斯滤波,然后应用Laplacian算子来提高边缘提取的能力。当然也可以不先滤除噪声,而是对处理的结果进展统计检测来获得边缘。 本节介绍的算子有: ø Roberts边缘检测算子; ø Sobel边缘检测算子; ø Prewitt边缘检测算子; ø Krisch边缘检测; øLoG_Laplacian高斯-拉普拉斯算子。 6.4.1 Roberts边缘检测算子 1 理论根底 Roberts边缘算子采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位准,对噪声敏感。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:  Roberts算子:G[i,j]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|; 〔6-17〕 G[i,j]=[(f[i,j]-f[i+1,j+1]) 2+(f[i+1,j]-f[i,j+1]) 2] 1/2; 〔6-18〕 其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。 其中f(i,j)是具有整数像素坐标的输入图像,平方根运算使该处理类似于在人类视觉系统中发生的过程。 该算法的算子如下: 2 实现步骤 (1)取得原图的数据区指针。 (2)开辟一个和原图一样大小的图像缓冲区,并设定新图像初值为全白〔255〕。 (3)每个像素依次循环,用Roberts边缘检测算子分别计算图像中各点灰度值,对它们平方之和,再开方。 (4)将缓冲区中的数据复制到原图数据区。 3 编程实现 /*************************************************************** *函
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服