Canny算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jamence/article/details/84645554

Canny

Canny分为5个步骤

1)、使用高斯滤波器,以平滑图像,滤除噪声。

高斯滤波器是一种平滑空间滤波器,用于模糊处理和降低噪声。我们的高斯滤波器通过以下公式得到。
在这里插入图片描述
我们运用该公式计算出高斯卷积核,如k越大,检测器对噪声的敏感度越低(即可以更好地筛去噪声),但是检测边缘的定位误差也会相应增加,一般我们设置5*5的高斯卷积核是一个比较好的衡量

2)、计算图像中每个像素点的梯度强度和方向。

我们将一个像素点的方向分为在x方向以及在y方向的分量,通过使用sobel算子与原图像做相关操作,计算该像素点在该水平方向Gx和垂直方向的梯度Gy,由此得到像素点的梯度G。由此我们可以得到该像素点的方向theta
在这里插入图片描述
对于计算一阶微分f:

在这里插入图片描述
我们通过以上公式近似,可以得到相应的sobel算子为:
在这里插入图片描述
G_x即为sobel在x方向的算子与原图像进行相关操作的结果
G_y即为sobel在y方向的算子与原图像进行相关操作的结果

3)、应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。

我们对图像进行梯度计算后,仅仅基于梯度提取的边缘依旧非常模糊,因为存在多个对边缘的梯度响应。我们希望在一个梯度方向上有且仅有一个局部最大值的梯度响应,而将其余的梯度抑制为0。我们的一个初步算法为:
1)将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
2)如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。
图示所示:
在这里插入图片描述
若中心点梯度方向为上下左右或者斜对角线方向(即指向E,NE,N,NW方向)时,我们的做法比较简单,直接将C点的梯度值和对应点的梯度值相比较。但是如果中心梯度方向为上图所示(即P1和p2方向),那么由于该点不存在(也称亚像素),我们无法直接通过sobel算子直接来得到该点梯度值。
我们可以通过对应点两边的可以明确确定梯度点来预估该对应点的梯度,具体公式为(针对上图)
通过一维线性插值,我们以tan⁡(θ)为自变量,以相邻两边的点的梯度为因变量,由于角度已经分隔为0,45,90等以45°为间隔的区间,所以不存在tan90°的情况出现。(很多博客都没有注意到这一点,或者说都没有着重介绍这一点。我们可以把两个极端情况带入进去,即 tan0 和 tan45 ,那么基本可以验证这个线性插值的准确性)
可以得到以下表达式,通过近似,我们可以得到:
G_p1=(1-tan⁡(θ) )*E+tan⁡(θ)*NE
G_p2=(1-tan⁡(θ) )*W+tan⁡(θ)*SW
其中G表示该点的梯度绝对值
所以我们最终的目标就是计算p点的梯度和p1以及p2的大小关系。

4)、应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

经过前三个步骤,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,我们采取措施为:
如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。

5)、通过抑制孤立的弱边缘最终完成边缘检测

对于强边缘像素,我们可以确定它们就是原图像的边缘,但是对于弱边缘像素,将会有一些争论,因为这些像素可以从真实边缘提取也可以是因噪声或颜色变化引起的。为了获得准确的结果,应该抑制由后者引起的弱边缘。通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。


感谢 http://www.cnblogs.com/techyan1990/p/7291771.html
感谢 https://blog.csdn.net/kezunhai/article/details/11620357
感谢 《数字图像处理》(第三版),冈萨雷斯

猜你喜欢

转载自blog.csdn.net/Jamence/article/details/84645554