Canny边缘检测算法有自己的理论和经验性的推导, 没仔细看/没看明白.
它的步骤如下:
- 对原图的灰度图进行高斯滤波
- 求一阶导数, 得到每个像素点的梯度强度和方向.
- 非最大抑制. 对每个edge candidate像素点, 在它的edge方向上, 它的(3 imes 3)邻域内, 有两个相邻点. 如果当前像素点处的梯度强度比任意一个相邻点弱, 则将其置为0. 需要注意的是, edge的方向的计算方式见下图.
- double thresholding, 然后将点连接成线.
single thresholding值不好选. double threshing的做法是取一大一小两个threshold, 分别得到两张新图:(T_H, T_L), 后者非零点的个数与前者非零点的个数比值在1到3之间. (T_H)上的非零点一定也是(T_L)上的非零点. 令: (T_L = T_L - T_H). 然后对于(T_H)上的每一个非零点, 找到它们在(T_L)上的所有非零邻接点, 两者并集就是最后的edge points.
Canny Edge Detector比Sobel, LoG edge detector 的效果都要好.
第二行第一个为LoG的结果, 第二个为Canny的结果. 从图中可以看出, Canny对edge的定位更准确, edge点的连通性也更好.