边缘检测算法

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

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

 

Sobel卷积因子为:函数

 

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

 

 

具体计算以下:spa

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

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

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

= [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)]get

 

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

      +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

相关文章
相关标签/搜索