【图像处理】 经常使用边缘检测算法对比分析

边缘的定义
首先介绍什么是边缘。在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变、纹理结构的图标、颜色的图标等。尽管图像的边缘点产生的缘由各不相同,但他们都是图形上灰度不连续或灰度几句辩护的点,图像边缘分为阶跃状、斜坡状和屋顶状。

边缘检测的基本方法
通常图像边缘检测方法主要有以下四个步骤
图像滤波
传统边缘检测算法主要是基于图像强度的一阶和二阶导数,但导数的计算对噪声很敏感,所以必须使用滤波器来改善与噪声有关的边缘检测器的性能。须要指出的是,大多数滤波器在下降噪声的同时也形成了了边缘强度的损失,所以,在加强边缘和下降噪声之间须要一个折衷的选择。
图像加强
加强边缘的基础是肯定图像各点邻域强度的变化值。加强算法能够将邻域(或局部)强度值有显著变化的点突显出来。边缘加强通常是经过计算梯度的幅值来完成的。
图像检测
在图像中有许多点的梯度幅值比较大,而这些点在特定的应用领域中并不都是边缘,因此应该用某种方法来肯定哪些点是边缘点。最简单的边缘检测判断依据是梯度幅值。
图像定位
若是某一应用场合要求肯定边缘位置,则边缘的位置可在子像素分辨率上来估计,边缘的方位也能够被估计出来。近20多年来提出了许多边缘检测算子,在这里咱们仅讨论集中常见的边缘检测算子。

常见边缘检测算子分析
1)  差分边缘检测
处理数字图像的离散域时,能够用图像的一阶差分来代替图像函数的导数。定义二维离散图像函数在 X 轴方向的一阶差分为:
f(i+1,j)-f(i,j)                          (2.3.1)

Y轴方向上的一阶差分定义为:html

f(i,j+1)-f(i,j)       (2.3.2) 算法

利用图像灰度的一阶导数算子在灰度值变化显著的地方获得的极值来检测边缘点。它在某一个点的值就表明了该点的边缘强度值,可经过设置阈值来进一步获得边缘图像。但用差分的方法进行边缘检测必须使差分的方向和边缘的方向相垂直,这就须要对图像的不一样方向分别进行差分运算,增长了运算量。通常可将边缘分为水平边缘、垂直边缘和对角线边缘:编程

图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
显然,差分边缘是最原始、最基础的方法,这种算子具备方向性,而且因为计算不方便等缘由,在如今已经不多应用了,但其思想仍是不少其余算法的基础。

2)Reborts算子函数

Reboerts算子是一种利用局部差分来寻找边缘的算子,Roberts 梯度算子所采用的是对角方向相邻两像素值之差,算子形式以下:post

Gx = f(i,j) - f(i-1,j-1)           (2.3.3)
Gy = f(i-1,j) - f(i,j-1)           (2.3.4)
|G(x,y)| = sprt(Gx^2-Gy^2)         (2.3.5)

Roberts梯度算子对应的卷积模版为:性能

图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
用以上两个卷积算子与图像运算后,可求出图像的梯度幅值 G ( x,y),而后选择

适当的阈值τ ,若 G ( x,y)>τ,则 (i  ,j)为边缘点,不然,判断 (i  ,j)为非边缘点。由此获得一个二值图像 { g (i,j)},即边缘图像。Roberts 算子采用的是用对角线方向上相邻两像素的差近似梯度幅值来检测边缘,它的定位精度高,对于水平和垂直方向的边缘,检测效果较好,而对于有必定倾角的斜边缘,检测效果则不理想,存在着许多的漏检。另外,在含噪声的状况下,Roberts 算子不能有效的抑制噪声,容易产生一些伪边缘。所以,该算子适合于对低噪声且具备陡峭边缘的图像提取边缘。url

Roberts算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感
spa

3)Sobel算子.net

Sobel算子在边缘检测算子扩大了其模版,在边缘检测的同时尽可能削弱了噪声。其模版大小为3×3,其将方向差分运算与局部加权平均相结合来提取边缘。在求取图像梯度以前,先进行加权平均,而后进行未分,增强了对噪声的一致。Sobel算子所对应的卷积模版为:3d

图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
 图像中的每一个像素点和以上水平和垂直两个卷积算子作卷积运算后,再计算获得

梯度幅值 G ( x,y),而后选取适当的阈值τ ,若 G ( x,y)>τ,则 (i  ,j)为边缘点,不然,判断 (i  ,j)为非边缘点。由此获得一个二值图像 { g (i,j)},即边缘图像。Sobel 算子在空间上比较容易实现,不但产生较好的边缘检测效果,同时,因为其引入了局部平均,使其受噪声的影响也较小。若使用较大的邻域,抗噪性会更好,但也增长了计算量,而且获得的边缘比较粗。在对精度要求不是很高的场合下,Sobel 算子是一种较为经常使用的边缘检测算法。

——————————————————————————————————

转载请注明出处:  http://blog.csdn.net/tianhai110

索贝尔算子Sobel operator)主要用做边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量

 

Sobel卷积因子为:

 

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像做平面卷积,便可分别得出横向及纵向的亮度差分近似值。若是以A表明原始图像,GxGy分别表明经横向及纵向边缘检测的图像灰度值,其公式以下:

 

 

具体计算以下:

Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)

      +(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)

      +(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]

 

Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)

      +0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

      +(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

 

其中f(a,b), 表示图像(a,b)点的灰度值;

 

图像的每个像素的横向及纵向灰度值经过如下公式结合,来计算该点灰度的大小:

 

一般,为了提升效率 使用不开平方的近似值:

 

若是梯度G大于某一阀值 则认为该点(x,y)为边缘点。

 

而后可用如下公式计算梯度方向:

 

 

 

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具备平滑做用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为经常使用的边缘检测方法。
  

 


——————————————————————————


4)Prewitt 算子

同 Sobel 算子类似,Prewitt 算子也是一种将方向的差分运算和局部平均相结合的方法,也是取水平和垂直两个卷积核来分别对图像中各个像素点作卷积运算,所不一样的是,Sobel 算子是先作加权平均而后再微分,Prewitt 算子是先平均后求微分,其对应的卷积模版为:

图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
图像中的每一个像素点和以上水平和垂直两个卷积算子作卷积运算后,再计算获得
梯度幅值 G ( x,y),而后选取适当的阈值τ ,若 G ( x,y)>τ,则 (i  ,j)为边缘点,不然,判断 (i  ,j)为非边缘点。由此获得一个二值图像 { g (i,j)},即边缘图像。
在此基础上,有人提出了改进的Prewitt算子,将其扩展到八个方向,依次用这些边缘模板去检测图像,与被检测区域最为类似的样板给出最大值。用这个最大值做为算子的输出值 P[ i ,j],这样就可将边缘像素检测出来。八个方向的 Prewitt 算子模板及其所对应的边缘方向以下所示:
Prewitt 算子经过对图像上的每一个像素点的八方向邻域的灰度加权差之和来进行检测边缘,对噪声有必定抑制做用,抗噪性较好,但因为采用了局部灰度平均,所以容易检测出伪边缘,而且边缘定位精度较低。
——————————————————————————————————————

附带知识:

普利维特算子(Prewitt operate) 

sobel边缘检测外 还有Prewitt算子, 它的卷积因子以下:

 

其余计算 sobel差很少;

Prewitt算子利用像素点上下、左右邻点灰度差,在边缘处达到极值检测边缘。对噪声具备平滑做用,定位精度不够高。

 

罗伯茨交叉边缘检测(Roberts Cross operator

卷积因子以下:

 

灰度公式为:

 

近似公式为:

 

具体计算以下:

G(x,y)=abs(f(x,y)-f(x+1,y+1))+abs(f(x,y+1)-f(x+1,y))

 

灰度方向 计算公式为:

 

——————————————————————
5)Kirsch 算子
Kirsch 算子是一种 3×3 的非线性方向算子。其基本思想是但愿改进取平均值的过程,从而尽可能使边缘两侧的像素各自与本身同类的像素取平均值,而后再求平均值之差,来减少因为取平均值所形成的边缘细节丢失。一般采用八方向 Kirsch 模板的方法进行检测,取其中最大的值做为边缘强度,而将与之对应的方向做为边缘方向。经常使用的八方向 Kirsch 模板以下所示:
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
实际的应用中,一般都是利用简单的卷积核来计算方向差分的,不一样的算子对应着不一样的卷积核。它们在图像的像素点上所产生的两个方向的偏导数用均方值或者绝对值求和的形式来近似代替梯度幅值,而后选取一个合适的阈值,用所获得的梯度幅值和所设定的阈值进行比较来判断边缘点。若大于所取的阈值,则判断为边缘点;不然,判断为非边缘点。很显然,在提取边缘的过程当中,阈值的选取特别重要,尤为在含噪图像中,阈值的选择要折衷考虑噪声形成的伪边缘和有效边缘的丢失。
6)Laplace 算子
拉普拉斯算子是不依赖于边缘方向的二阶导数算子,它是一个标量而不是向
量,具备旋转不变即各向同性的性质。若只关心边缘点的位置而不须要了解一其周围的实际灰度差时,通常选择该算子提取图像的边缘。Laplace算子的定义为:
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
用差分方程近似二阶偏倒数的结果以下 :

图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
  将这两个式子合并,能够获得近似 Laplace 算子的模版:
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
当Laplace算子输出出现过零点时就代表有边缘存在,其中忽略无心义的过零点(均匀零区)。原则上,过零点的位置精度能够经过线性内插方法精确到子像素分辨率。可是拉普拉斯算子在图像边缘检测中并不经常使用。主要缘由有:任何包含有二阶导数的算子比只包含有一阶导数的算子更易受噪声的影响,一阶导数很小的局部峰值也能致使二阶导数过零点,因此Laplace算子对噪声具备没法接受的敏感性; Laplace算子的幅值产生双边元,这是复杂的分割不但愿有的结果;最后,Laplace算子不能检测边缘的方向。为了不噪声的影响,必须采用特别有效的滤波方法。因此,人们提出了改进的功LOG算子。
7) LOG算子 (高斯拉普拉斯算子)
LOG算子基本思想是:先在必定的范围内作平滑滤波,而后再利用差分算子来检测在相应尺度上的边缘。滤波器的选择要考虑如下两个因素:其一是滤波器在空间上要求平稳,即要求空间位置偏差 Δ x要小;其二是平滑滤波器自己要求是带通滤波器,而且在有限的带通内是平稳的,即要求频域偏差 Δω 要小。根据信号处理中的测不许原理, Δx 和 Δ ω是相互矛盾的,而达到测不许下限的滤波器就是高斯滤波器。Marr 和 Hildreth 提出的这种差分算子是各向同性的拉普拉斯二阶差分算子。该边缘检测器的基本特征是:
(1) 所用的平滑滤波器是高斯滤波器
(2) 加强步骤采用的是二阶导数(即二维拉普拉斯函数)
(3) 边缘检测的判据是二阶导数过零点而且对应一阶导数的极大值
该方法的特色是先用高斯滤波器与图像进行卷积,既平滑了图像又下降了噪声,使孤立的噪声点和较小的结构组织被滤除。然而因为对图像的平滑会致使边缘的延展,所以只考虑那些具备局部梯度极大值的点做为边缘点,这能够用二阶导数的零交叉来实现。拉普拉斯函数可用做二维二阶导数的近似,由于它是一种标量算子。为了不检测出非显著的边缘,因此应该选择一阶导数大于某一阈值的零交叉点来做为边缘点。实际应用中,经常使用的LOG算子的模版为:
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
说明: 高斯平滑运算不但能够滤除噪声,还会致使图像中的边缘和其它尖锐不连续部分模糊,而模糊程度取决于空间尺度因子σ 的大小。σ 越大,高斯滤波对噪声的滤除效果越好,但同时也会丢失重要的边缘信息,影响到边缘检测器的性能。若是σ 较小,又可能致使平滑做用不彻底而留有较多的噪声。所以在实际应用中,要根据状况选择适当的σ。
8) Canny算子
1986年,Canny从边缘检测算子应该知足的三个准则出发,推导出了最优边
缘检测算子Canny算子,该算子是目前理论上相对最完善的一种边缘检测算法。
Canny提出的评价边缘检测性能优劣的三个准则分别是:
(1)好的信噪比准则。即将非边缘点判为边缘点的几率要低,将边缘点判为非边缘点的几率要低;
(2)好的定位性能准则。即检测出的边缘点要尽量在实际边缘的中心;
(3)单边缘响应准则。即单一边缘具备惟一响应,单一边缘产生的多个响
应的几率要低,而且对虚假边缘的响应应获得最大抑制。
利用Canny算子检测边缘的土体算法以下:
(1)用式所示的高斯函数h(r)对图像进行平滑滤波,去除图像中的噪声。
(2)在每一点计算出局部梯度和边缘方向,能够利用Sobel算子、Roberts算子等来计算。边缘点定义为梯度方向上其强度局部最大的点。
(3)对梯度进行“非极大值抑制”。在第二步中肯定的边缘点会致使梯度幅度图像中出现脊。而后用算法追踪全部脊的顶部,并将全部不在脊的顶部的像素设为零,以便在输出中给出一条细线。
(4)双阐值化和边缘链接。脊像素使用两个闽值Tl和竹作阂值处理,其中Tl<T2.值大于竹的脊像素称为强边缘像素,Tl和T2之间的脊像素称为弱边缘像素。因为边缘阵列孔是用高闽值获得的,所以它含有较少的假边缘,但同时也损失了一些有用的边缘信息。而边缘阵列Tl的闽值较低,保留了较多信息。所以,能够以边缘阵列几为基础,用边缘阵列Tl进行补充链接,最后获得边缘图像。
Canny算子也存在不足之处:
(1)为了获得较好的边缘检测结果,它一般须要使用较大的滤波尺度,这样容易丢失一些细节
(2)Canny算子的双阈值要人为的选取,不可以自适应

实验与结果分析
实验在MATLAB R2007a平台下进行,实验的结果以下图所示
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
图像算法 - 经常使用边缘检测算法对比分析 - dingmz_frc - dingmz_frc的博客
    
  其余博文参照http://wenku.baidu.com/view/ce3aa547be1e650e52ea9945.html
                          http://wenku.baidu.com/view/d521aee9172ded630b1cb6ed.html


数字图像处理

几种边缘检测算子的比较

边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化一般反映了属性的重要事件和变化。这些包括深度上的不连续、表面方向不连续、物质属性变化和场景照明变化。边缘检测是图像处理和计算机视觉中,尤为是特征提取中的一个研究领域。图像边缘检测大幅度地减小了数据量,而且剔除了能够认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分能够划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法经过寻找图像一阶导数中的最大和最小值来检测边界,一般是将边界定位在梯度最大的方向。基于零穿越的方法经过寻找图像二阶导数零穿越来寻找边界,一般是Laplacian过零点或者非线性差分表示的过零点。

人类视觉系统认识目标的过程分为两步:首先,把图像边缘与背景分离出来;而后,才能知觉到图像的细节,辨认出图像的轮廓。计算机视觉正是模仿人类视觉的这个过程。所以在检测物体边缘时,先对其轮廓点进行粗略检测,而后经过连接规则把原来检测到的轮廓点链接起来,同时也检测和链接遗漏的边界点及去除虚假的边界点。图像的边缘是图像的重要特征,是计算机视觉、模式识别等的基础,所以边缘检测是图象处理中一个重要的环节。然而,边缘检测又是图象处理中的一个难题,因为实际景物图像的边缘每每是各类类型的边缘及它们模糊化后结果的组合,且实际图像信号存在着噪声。噪声和边缘都属于高频信号,很难用频带作取舍。

这就须要边缘检测来进行解决的问题了。边缘检测的基本方法有不少,一阶的有Roberts Cross算子,Prewitt算子,Sobel算子,Canny算子, Krisch算子,罗盘算子;而二阶的还有Marr-Hildreth,在梯度方向的二阶导数过零点。如今就来简单介绍一下各类算子的算法

   1.1   Roberts算子

     Roberts算子是一种利用局部差分算子寻找边缘的算子,它有下式给出:

x,y)=

其中、、 分别为4领域的坐标,且是具备整数像素坐标的输人图像;其中的平方根运算使得该处理相似于人类视觉系统中发生的过程。

      Roberts算子是2X2算子模板。图1所示的2个卷积核造成了Roberts算子。图象中的每个点都用这2个核作卷积。

1

0

0

-1

0

1

-1

0

     


1    Roberts算子

  1.2    Sobel算子

      Sobel算子是一种一阶微分算子,它利用像素邻近区域的梯度值来计算1个像素的梯度,而后根据必定的绝对值来取舍。它由下式给出:

 

Sobel算子是3*3算子模板。图2所示的2个卷积核dx  dy造成Sobel算子。一个核对一般的垂直边缘响应最大,而另外一个核对水平边缘响应最大。2个卷积的最大值做为该点的输出值。运算结果是一幅边缘幅度图像。

-1

0

1

-2

0

2

-1

0

1

1

2

1

0

0

0

-1

-2

-1

2      Sobel算子

     Prewitt算子

     Prewitt算子由下式给出:

 

Prewitt算子是3*3算子模板。图3所示的2个卷积核dx ,dy.造成了Prewitt算子。与Sobel算子的方法同样,图像中的每一个点都用这2个核进行卷积,取最大值做为输出值。Prewitt算子也产生一幅边缘幅度图像。

-1

0

1

-1

0

1

-1

0

1

1

1

1

0

0

0

-1

-1

-1

  1.3 Canny算子

     Canny算子是是一阶算子。其方法的实质是用1个准高斯函数平滑运算fs=f(x,y)*G(x,y),而后以带方向的一阶微分算子定位导数最大值

     平滑后fs(xy)的梯度可使用2*2的一阶有限差分近似式:

P[i,j]≈(fs[i,j+1]-fs[i,j]+fs[i+1,j+1]-fs[i+1,j])/2

Q[i,j] ≈(fs[i,j]-fs[i+1,j]+fs[i,j+1]-fs[i+1,j+1])/2

在这个2x2正方形内求有限差分的均值,便于在图像中的同一点计算二和y的偏导数梯度。幅值和方向角可用直角坐标极坐标的坐标转化来计算:

M[i,j]=

 

M[i,j]反映了图象的边缘强度;反映了边缘的方向。使得M}i,j}取得局部最大值的方向角,就反映了边缘的方向。

Canny算子也可用高斯函数的梯度来近似,在理论上很接近4个指数函数的线性组合造成的最佳边缘算子。在实际工做应用中编程较为复杂且运算较慢。

 

2.1 LOG滤波器

LOG滤波器又称Marr-Hildreth模板或算子

=

式中:G(x,y)是对图像进行处理时选用的平滑函数(Gaussian函数);x,y为整数坐标; σ为高斯分布的均方差。对平滑后的图像fs(fs=f(x,y)*G(x,y))作拉普拉斯变换,得:

h(x,y)=G(x,y)

即先对图象平滑,后拉氏变换求二阶微分,等效于把拉氏变化做用于平滑函数,获得1个兼有平滑和二阶微分做用的模板,再与原来的图像进行卷积。用Marr-Hildreth模板与图像进行卷积的优势在于,模板能够预先算出,实际计算能够只进行卷积。

LOG滤波器有如下特色:

(1)经过图象平滑,消除了一切尺度小于σ的图像强度变化;

(2)若用其它微分法,须要计算不一样方向的微分,而它无方向性,所以能够节省计算量;

(3)它定位精度高,边缘连续性好,能够提取对比度较弱的边缘点。

LOG滤波器也有它的缺点:当边缘的宽度小于算子宽度时,因为过零点的斜坡融合将会丢失细节。

LOG滤波器有无限长的拖尾,若取得很大尺寸,将使得计算不堪重负。但随着:r=的增长,LOG滤波器幅值迅速降低,当r大于必定程度时,能够忽略模板的做用,这就为节省计算量创造了条件。实际计算时,经常取n* n大小的LOG滤波器,近似n=3σ。另外,LOG滤波器能够近似为两个指数函数之差,即DOG ( Difference Of two Gaussians functions):

DOG(σ1,σ2)=-

     σ1/σ2=1.6时,DOG代替LOG减小了计算量。

   

几种算子的比较

Robert算子定位比较精确,但因为不包括平滑,因此对于噪声比较敏感。

Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测的图像边缘可能大于2个像素。这二者对灰度渐变低噪声的图像有较好的检测效果,可是对于混合多复杂噪声的图像,处理效果就不理想了。

LOG滤波器方法经过检测二阶导数过零点来判断边缘点。LOG滤波器中的a正比于低通滤波器的宽度,a越大平滑做用越显著,去除噪声越好,但图像的细节也损失越大,边缘精度也就越低。因此在边缘定位精度和消除噪声级间存在着矛盾,应该根据具体问题对噪声水平和边缘点定位精度要求适当选取。

讨论和比较了几种经常使用的边缘检测算子。梯度算子计算简单,但精度不高,只能检测出图像大体的轮廓,而对于比较细的边缘可能会忽略。Prewitt 和Sobel 算子比Roberts 效果要好一些。LOG 滤波器和Canny 算子的检测效果优于梯度算子,可以检测出图像较细的边缘部分。不一样的系统,针对不一样的环境条件和要求,选择合适的算子来对图像进行边缘检测。