原理
- Canny Edge detector 在1986年提出,此算法主要满足以下三个准则:
- Low error rate: 尽可能多地检测真实的边缘
- Good localization:检测出的边缘像素点和实际边缘像素点的距离尽可能的小
- Minimal response:图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘
- 算法步骤
- 使用高斯滤波器进行滤波,如:

- 计算图像强度的梯度和方向,和Sobel算子类似:
a. 分别使用 x , y x,y x,y两个方向的卷积核进行处理:

b. 计算梯度 G G G 和方向 θ \theta θ:

把 θ \theta θ 近似到四个方向,分别代表水平,垂直和两个对角线方向(0°,45°,90°,135°)
- 非极大值抑制
非极大值抑制是一种边缘稀疏技术,通常得出来的梯度边缘不止一个像素宽,而是多个像素宽。非最大值抑制能帮助保留局部最大梯度而抑制所有其他梯度值。这意味着只保留了梯度变化中最大的位置,其他都为0。算法如下:
a. 将当前的梯度与正负梯度方向的两个像素的梯度G1、G2进行比较
b. 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制;比如当前点的梯度方向指向正上方90°方向,那它需要和垂直方向的正上方和正下方的像素的梯度进行比较。
伪代码:
if G