![](https://csdnimg.cn/release/download_crawler_static/87710635/bg6.jpg)
1)用高斯滤波来平滑图像,去除噪声;
2)找寻图像的梯度强度和方向;(用一阶偏导有限差分计算梯度幅值和方向)
3)用非最大抑制(non-maximum suppression)技术来消除边缘检测带来的杂散响应(本来
不是但检测出来是);
4)应用双阈值检测来确定真实的和潜在的边缘;(检测和连接边缘)
5)用滞后技术来跟踪边界(通过抑制孤立的弱边缘最终完成边缘检测)。
1. 图像平滑(去噪声)
任何边缘检测算法都不可能在未经处理的原始数据上很好地工作,所以第一步是对原始
数据与高斯 mask 作卷积,得到的图像与原始图像相比有些轻微的模糊(blurred)。这样,
单独的一个像素噪声在经过高斯平滑的图像上变得几乎没有影响。
2. 寻找图像中的强度梯度
Canny 算法的基本思想是找寻一幅图像中灰度强度变化最强的位置。所谓变化最强,即
指梯度方向。平滑后的图像中每个像素点的梯度可以由 Sobel 算子(一种卷积运算)来获得
(opencv 中有封装好的函数,可以求图像中每个像素点的 n 阶导数)。首先,利用如下的
核来分别求得沿水平(x)和垂直(y)方向的梯度 G_X 和 G_Y。
K_{GX} = [-1 0 1 ; -2 0 2 ; -1 0 1], K_{GY} = {-1 -2 -1 ; 0 0 0 ; 1 2 1}
之后便可利用公式来求得每一个像素点的梯度幅值。
,有时为了计算简便,也会使用 G_X 和 G_Y 的无穷大范数来代替
二范数。把平滑后的图像中的每一个点用 G 代替,可以获得如下图像。从下图可以看出,在
变化剧烈的地方(边界处),将获得较大的梯度度量值 G,对应的颜色为白色。然而,这些
边界通常非常粗,难以标定边界的真正位置。为了做到这一点(参考非极大抑制 Non-maximum
suppression 一节),还必须存储梯度方向,其公式如下图所示。也就是说在这一步我们会
存数两块数据,一是梯度的强度信息,另一个是梯度的方向信息。
3. 非极大抑制 Non-maximum suppression
这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了
每个像素点上梯度强度的极大值,而删掉其他的值。非极大值抑制的作用在于“瘦”边。对
于每个像素点,进行如下操作:
a) 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和