Canny算子边缘检测

来源:互联网 发布:频谱仪软件下载 编辑:程序博客网 时间:2024/04/29 01:55

最近有用到Canny算子做边缘检测。回顾一下Canny算子的基本原理:总的来说,图像的边缘检测必须满足两个步骤

(1)有效的抑制噪声,使用高斯算子对图像进行平滑;

(2)尽量精确的确定边缘的位置;

Canny算子的边缘检测可以分为三个步骤:

Step 1: 高斯平滑函数。目的是为了平滑以消除噪声;

Step 2:一阶差分卷积模板。目的是为了达到边缘增强。

该步骤有点类似于与两个方向模板进行卷积运算。这两个方向模板为(a)和(b)所示:左图体现的是在X方向上的差异,右图体现的是在y方向上的差异。同时获得梯度幅值的大小以及方向角。通过该步,获得在边缘位置处特征被加强的图像。

Step 3:非极大值抑制(NMS)。目的是保留梯度方向上的最大值。

这一步是比较关键的一点:

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

图2非极大值抑制


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

——假设上一步骤得到的梯度图为G(x,y);对G(x,y)进行初始化:N(x,y)=G(x,y)

——在梯度和反梯度方向上各找n个像素点。若G(x,y)不是这些点中的最大点,则将N(x,y)置为0,否则保持N(x,y)不变。

Step4: 双线性阈值

首先是一个较大的阈值:Nmax.使用该阈值二值化后的图像含有较少的假的边缘点,但是端点较多!

使用较小的阈值:Nmin,使用该阈值二值化后的图像含有较多的假的边缘点;

通过上一步获取的边缘点,判断其8邻域内有无第二步获得的边缘点,然后进行连接!


另一种简单的方法是,把梯度方向简化为4个方向:『0,45,90,135』

最后一步为对N(x,y)进行阈值化处理:

大的阈值会得到——少量的边缘点以及众多的空隙

小的阈值会得到——大量的边缘点以及众多的错误检测。

一般Low=0.4High。




1.Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
2.Canny边缘检测算法:
step1:用高斯滤波器平滑图象;
step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:对梯度幅值进行非极大值抑制;
step4:用双阈值算法检测和连接边缘。
step1:高斯平滑函数
以一维信号为例加以讨论.一维高斯滤波函数G(x)定义为

 (转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客


(转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客
step3:非极大值抑制
仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS)
解决方法:利用梯度的方向。
(转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客
图2非极大值抑制
四个扇区的标号为0到3,对应3*3邻域的四种可能组合。
在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0。
即: (转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客
step4:阈值化
减少假边缘段数量的典型方法是对N[i,j]使用一个阈值。将低于阈值的所有值赋零值。但问题是如何选取阈值?
解决方法:双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值τ1和τ2,且2τ1≈τ2从而可以得到两个阈值边缘图象N1[i,j]和N2[i, j]。由于N2[i,j]使用高阈值得到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2[i,j]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1[i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在N1[i,j]中收集边缘,直到将N2[i,j]连接起来为止。
4 边缘算子应满足的准则
(转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客

(转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客
若满足此准则,就能保证单边缘只有一个响应。
对一个算法的性能评价可分为两个阶段进行:计算假边缘与丢失边缘的数目;测量用于估计位置和方向的误差(或误差分布)。边缘检测算法的优劣也可用品质因数(Figure of Merit)来描述。Pratt品质因数是其中一种,它着重考虑了丢失了有效的边缘、边缘定位误差和将噪声判断为边缘等三种误差。
(转)canny算子的理论分析 - zhaowei0425 - zhaowei0425的博客
5 结束语
边缘检测在图象分割、模式识别、机器视觉等中都有重要作用,人们已研究出很多种边缘检测算法,而哈夫变换和canny边缘算子等是最经典的算法,人们已在这些经典算法基础上提出一些新的改进算法。

参考文献
[1]贾云德.机器视觉[M].北京:科学出版社,2000
[2]章毓晋.图象处理和分析[M].北京:清华大学出版社,1999
[3]郎锐.数字图象处理学.北京:希望电子出版社,2002
[4]王娜,李霞.一种新的改进Canny边缘检测算法.深圳大学学报,2005,4(2),149-152
====================================================================================

边缘提取以及边缘增强是不少图像处理软件都具有的基本功能,它的增强效果很明显,在用于
识别的应用中,图像边缘也是非常重要的特征之一。图像边缘保留了原始图像中相当重要的部分信息,
而又使得总的数据量减小了很多,这正符合特征提取的要求。在以后要谈到的霍夫变换(检测图像中的几
何形状)中,边缘提取就是前提步骤。
这里我们只考虑灰度图像,用于图像识别的边缘提取比起仅仅用于视觉效果增强的边缘提取要
复杂一些。要给图像的边缘下一个定义还挺困难的,从人的直观感受来说,边缘对应于物体的边界。图
像上灰度变化剧烈的区域比较符合这个要求,我们一般会以这个特征来提取图像的边缘。但在遇到包含
纹理的图像上,这有点问题,比如说,图像中的人穿了黑白格子的衣服,我们往往不希望提取出来的边
缘包括衣服上的方格。但这个比较困难,涉及到纹理图像的处理等方法。
好了,既然边缘提取是要保留图像的灰度变化剧烈的区域,从数学上,最直观的方法就是微分
(对于数字图像来说就是差分),在信号处理的角度来看,也可以说是用高通滤波器,即保留高频信号。
这是最关键的一步,在此之前有时需要对输入图像进行消除噪声的处理。
用于图像识别的边缘提取往往需要输出的边缘是二值图像,即只有黑白两个灰度的图像,其中
一个灰度代表边缘,另一个代表背景。此外,还需要把边缘细化成只有一个像素的宽度。总的说来边缘
提取的步骤如下:
1,去噪声
2,微分运算
3,2值化处理
4,细化
第二步是关键,有不少书把第二步就直接称为边缘提取。实现它的算法也有很多,一般的图像
处理教科书上都会介绍好几种,如拉普拉兹算子,索贝尔算子,罗伯特算子等等。这些都是模板运算,
首先定义一个模板,模板的大小以3*3的较常见,也有2*2,5*5或更大尺寸的。运算时,把模板中心对
应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素进行数学运算,算出
的结果作为输出图像对应像素点的值。
需要说明的是,模板运算是图像的一种处理手段--邻域处理,有许多图像增强效果都可以采用
模板运算实现,如平滑效果,中值滤波(一种消除噪声的方法),油画效果,图像的凹凸效果等等。这些
算法都比较简单,为人们常用。
关于前面提到的几种边缘提取算子(拉普拉兹算子,索贝尔算子,罗伯特算子),教科书上都有
较为详细的介绍,我这里不多说了,(手头上没有教科书,也懒得翻译英文资料),如果你们有时间,可
以把这些方法的具体情况仔细介绍一下。这里对拉普拉兹算子和索贝尔算子补充两句。拉普拉兹算子是
2阶微分算子,也就是说,相当于求取2次微分,它的精度还算比较高,但对噪声过于敏感(有噪声的情
况下效果很差)是它的重大缺点,所以这种算子并不是特别常用。索贝尔算子是最常用的算子之一(它是
一种一阶算子),方法简单效果也不错,但提取出的边缘比较粗,要进行细化处理。另外,索贝尔算子
也可提取出图像边缘的方向信息来,有文章论证过,在不考虑噪声的情况下,它取得的边缘信息误差不
超过7度。
顺便说一句,往往我们在进行边缘提取时只注意到位置信息,而忽略了边缘的方向。事实上,
图像的边缘总有一定的走向,我们可以用边缘曲线的法线方向(和切线垂直的直线)来代表边缘点的方向
。在图像识别的应用中,这个方向是非常重要的信息。
上面的几种算子是属于比较简单的方法,边缘提取的精度都不算特别高,下面介绍几种高级算
法。首先是马尔(Marr)算子,马尔是计算机视觉这门学问的奠基人,很了不起,但这些理论很难懂。他
提出的边缘提取方法可以看成两个步骤,一个是平滑作用来消除噪声,另一个是微分提取边缘,也可以
说是由两个滤波器组成,低通滤波去除噪声,高通滤波提取边缘。人们也称这种方法为LOG滤波器,这也
是根据它数学表达式和滤波器形状起的名字。也可以采用模板运算来实现这种算法,但模板的大小一般
要在7*7以上,所以运算复杂程度比索贝尔算子等要大不少,运算时间当然也长许多。
另外一种非常重要的算法是坎尼(Canny)算子,这是坎尼在1986年写的一篇论文里仔细论述的。
他给出了判断边缘提取方法性能的指标。而坎尼算子也是图像处理领域里的标准方法,也可以说是默认
的方法。比较奇怪的是,国内的图像处理教科书中,介绍坎尼算子的很少。本人见过的书中,郑南宁的
‘计算机视觉与模式识别’(1998年),算是介绍的比较详细的。坎尼算子在使用时要提供给一些参数,
用于控制算法的性能,实际上,对于不同的图像或不同的边缘提取目的,应该提供不同的参数,以达到
最佳效果。它也有模板运算方法,模板的大小也比较大,和提供的参数有关,标准的大小差不多是17*17
,可以根据算子的可分离性用快速算法(否则就会慢的一塌糊涂),坎尼算子的2值化也很有特色,具有
一定的智能性。
还有一种算法:Shen-Castan算子,大概可称为沈峻算子,总之是中国人的成果,效果和坎尼
算子不相上下,这种算法在对边缘提取好坏的判别标准上有些不同。(这种方法我没用过,好象编起程
序来,要比坎尼算子还复杂)
在实际的图像处理与识别应用中,有时需要根据被处理图像的种类以及实际目的,量身定做算
法,边缘提取也是一样,但是基本原理都是一样的。



0 1