【计算机视觉】Canny算子边缘检测

Canny算子边缘检测

Posted by ZhangPY on March 16, 2020

【计算机视觉】二. Canny算子边缘检测

标签(空格分隔): 【图像处理】


说明:本系列是整理计算机视觉(英语)的笔记所成,不对之处还望指出。


##1. Canny边缘检测基本原理

 (1)图象边缘检测必须满足两个条件:**一能有效地抑制噪声**;二必须尽量精确确定边缘的位置。
 (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。
 (3)类似与Marr(LoG)边缘检测方法,也属于**先平滑后求导数的**方法。

##2. Canny边缘检测算法:

 step1:用高斯滤波器平滑图象;
 step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
 step3:对梯度幅值进行非极大值抑制;
 step4:用双阈值算法检测和连接边缘。

边缘feature,是属于local feature,即图像的局部特征,边缘的特点是什么呢?上面一篇文章中已经讲述过,但还得提一下,就是出现在梯度大的地方,因为像素的局部性说明的是像素通常倾向于与其近邻像素值相近,而不想近的地方大至属于边缘或者噪声等。所以可以用梯度对这种边缘信息进行提取,但是务必要有效的抑制噪声。通常边缘检测可通过先平滑,后求梯度或导数,也可以先通过导数,然后再进行平滑。从算子的角度分析,两种操作作用先后是没有区别的。

###step1:高斯平滑函数

此处输入图片的描述 (可以理解下维基百科上关于卷积函数的定义,如下图移动的红色窗口代表我们的高斯和函数,蓝色为图像灰度函数) 此处输入图片的描述 其实这一步骤在上一篇文中论述的更为详细。 用这个模板对每个像素进行加权平均。

###Step2:一阶微分卷积模板 此处输入图片的描述 ###step3:对梯度幅值进行非极大值抑制 仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS) 解决方法:利用梯度的方向。 此处输入图片的描述 四个扇区的标号为0到3,对应3*3邻域的四种可能组合。在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0。 此处输入图片的描述

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

对非极大值抑制图像作用两个阈值th1和th2,两者关系th1=0.4 th2 。我们把梯度值小于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步:

  • 生成高斯滤波系数;
  • 用生成的高斯滤波系数对原图像进行平滑;
  • 求滤波后图像的梯度;
  • 进行非最大抑制;
  • 统计图像的直方图,对阈值进行判定;
  • 利用函数寻找边界起点;
  • 根据第6步执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的一条边界的所有边界点;

以上部分大部分引自《canny算子

重点提到的就是两个步骤,一是非极大值抑制,二是双梯度阈值链接。非极大值抑制主要是通过比较在梯度方向上的两个像素上的梯度,若比两个都大,则说明是局部最大值,则设置为1。

平台无关的实现可以参看http://www.cnblogs.com/tiandsp/archive/2012/12/13/2817240.html