John Canny于1986年提出Canny边缘检测算法。
John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:
1.好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
2.高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
3. 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。
Canny算子求边缘点具体算法步骤如下:
1. 用高斯滤波器平滑图像;
2. 用一阶偏导有限差分计算梯度幅值和方向;
3. 对梯度幅值进行非极大值抑制;
4. 用双阈值算法检测和连接边缘。
在opencv里面提供了cvCanny函数来求canny算子,该算法没有进行高斯平滑图像。首先在x和y方向求一阶导数,使用sobel算子,核的大小由用户输入(可以是3、5、7),然后组合成为4个方向的导数,分别判断相应方向上是否为极大值。这些方向导数达到局部最大值的点就是边缘的候选点。Canny算法最重要的一个新特点是试图将独立边的候选像素拼装成轮廓。轮廓的形成是对这些像素运用滞后性阈值。这意味着有两个阈值,上限和下限。如果一个像素的梯度大于上限阈值,则被认为是边缘像素,如果低于下限阈值,则被抛弃,如果介于二者之间,只有当其与高于上限阈值的像素连接时才会被接受。Canny推荐的上下限阈值比为2:1到3:1之间。具体算法如下:
1、使用sobel算子求每个像素x和y方向的梯度;
2、求每个像素的方向。若|dy|< |dx