边缘检测算法

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

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

 

Sobel卷积因子为:

 

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

 

 

具体计算如下:

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

 

普利维特算子(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))

 

灰度方向 计算公式为:

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

 

 

 

Canny边缘检测基本原理

 

     (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。

     (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。

     (3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。

 

2. Canny边缘检测算法:

     step1:用高斯滤波器平滑图象

     step2:用一阶偏导的有限差分来计算梯度的幅值和方向

     step3:对梯度幅值进行非极大值抑制

     step4:用双阈值算法检测和连接边缘

 

step1:高斯平滑函数

(可以理解下维基百科上关于卷积函数的定义,如下图移动的红色窗口代表我们的高斯和函数,蓝色为图像灰度函数)

通过高斯函数产生k*k的模板如3*3

 

用这个模板对每个像素进行加权平均

 

Step2:一阶微分卷积模板

step3:对梯度幅值进行非极大值抑制

      仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS)

解决方法:利用梯度的方向。



 

图1非极大值抑制

四个扇区的标号为0到3,对应3*3邻域的四种可能组合。在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0。

即: 

 

 Step4:用双阈值算法检测和连接边缘:  

  对非极大值抑制图像作用两个阈值th1和th2,两者关系th1=0.4th2  。我们把梯度值小于th1的像素的灰度值设为0,得到图像1。然后把梯度值小于th2的像素的灰度值设为0,得到图像2。由于图像2的阈值较高,去除大部分噪音,但同时也损失了有用的边缘信息。而图像1的阈值较低,保留了较多的信息,我们可以以图像2为基础,以图像1为补充来连结图像的边缘。

  链接边缘的具体步骤如下:

  对图像2进行扫描,当遇到一个非零灰度的像素p(x,y)时,跟踪以p(x,y)为开始点的轮廓线,直到轮廓线的终点q(x,y)。

   考察图像1中与图像2中q(x,y)点位置对应的点s(x,y)的8邻近区域。如果在s(x,y)点的8邻近区域中有非零像素s(x,y)存在,则将其包括到图像2中,作为r(x,y)点。从r(x,y)开始,重复第一步,直到我们在图像1和图像2中都无法继续为止。

   当完成对包含p(x,y)的轮廓线的连结之后,将这条轮廓线标记为已经访问。回到第一步,寻找下一条轮廓线。重复第一步、第二步、第三步,直到图像2中找不到新轮廓线为止。

 

3. canny算法程序实现

   Canny算法程序中将上述的4个步骤再加以细分,分成以下7步:

l 生成高斯滤波系数;

l 用生成的高斯滤波系数对原图像进行平滑;

l 求滤波后图像的梯度;

l 进行非最大抑制;

l 统计图像的直方图,对阈值进行判定;

l 利用函数寻找边界起点;

l 根据第6步执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的一条边界的所有边界点;

 

参考:

http://blog.csdn.net/likezhaobin/article/details/6835049

http://blog.csdn.net/likezhaobin/article/details/6892176

http://blog.csdn.net/likezhaobin/article/details/6892629

http://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html

其他参考资料

参考文章:

http://homepages.inf.ed.ac.uk/rbf/HIPR2/featops.htm

http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm

 

posted @ 2016-01-23 08:47  海蟹  阅读(2544)  评论(0编辑  收藏  举报