大部分人认为Canny边缘检测是最优的边缘检测方法,Canny边缘检测方法可以得到清晰明了的边缘;大部分图像处理包都提供了一个专门的canny边缘检测函数;这篇文章我们来看看Canny边缘检测的原理。
Canny边缘检测需要经过一下几步:
1.预处理
2.计算梯度
3.非极值抑制
4.阈值与滞后效应(此处不知翻译的对不对,英文表达是:Thresholding with hysterysis)
<1>预处理
边缘检测是对噪声敏感的,所以在边缘检测前要作平滑处理,一般用的是 Gaussian blur ,一个标准差为1.4的5*5 高斯滤波器
<2>计算梯度值
对图像中的每一个pixel,计算其梯度值,包括梯度的大小和方向;梯度的大小决定了该点是不是边缘点,梯度值大说明在该点周围的灰度值变化快,是个边缘点,梯度值小说明该点不是边缘点;梯度的方向指明了边缘的方向。
计算梯度值一般用的是sobel边缘算子。
梯度值大小计算公式:
方向计算公式:
其中
Gx = L(x+1,y) - L(x-1,y)
Gy = L(x,y+1) - L(x,y-1)
<3>非极值抑制
这一步的作用很明显,就是如果一个像素不是最大值,就被抑制了。
遍历所有像素,对于每一个像素,梯度方向分布在四个域。
如下图所示:
对于中间的灰色像素,他的边缘有四个可能方向:黄色方向,蓝色方向,红色方向,绿色方向。在上一步中计算出了该像素的梯度方向,根据梯度方向可以估计出边缘方向。
接下来以一个例子来说明非极大值抑制。
如图所示:
Gradient orientation from 22.5 to 67.5 degrees
如果梯度方向在上图所示的范围内,说明梯度的变化是从左上角到右下角,而边缘就是右上角到左下角方向的。
要检测这个中心红点是不是边缘点,就需要检测这个点的梯度值和左上角以及右下角的点的梯度值相比是不是极大值。如果是极大值并且它的梯度值大于upper threshold,就把它当作边缘点。
<4>阈值与滞后效应
在上一步中,我们已经找到了梯度值比上限阈值大的像素。这一步利用梯度的方向和下限阈值。
Here’s the idea:
1.如果当前像素不是边缘点,选下一个。
2.如果是边缘点,再选择边缘方向上的两个点(垂直于之前选择的边缘点的梯度方向)。如果有一个点或者两个点都满足一下条件:
1>和中心像素有相同的方向
2>梯度值比下限阈值大
3>他们的梯度值比相邻像素大