主要解决俩个问题:
Canny算子是什么?是一种经典的图像边缘检测算子
Canny算子怎么用?下面会提及具体的实施步骤
从图像的边缘检测说起:在数字图像中,物体的边缘是以数字图像的局部特征的不连续形式出现即灰度或者结构等信息的突变出成为边缘。边缘能够勾勒出物体的形状、能被局部定义,以及能传递大部分的图像信息等优点。因此边缘检测是处理很多复杂问题的关键。
在图像中的边缘有方向和幅度俩个特性。沿着边缘走向的灰度变化平缓,而垂直于边缘走向的灰度变化剧烈。根据灰度变化的规律,可以把边缘分为三类:阶越型,房顶型和凸缘型。如下图
在边缘上灰度的一阶导数幅度较大,而二阶导数在边缘上的值为零,其左右分别为一正一负两个峰,也就是说边缘点对应于一阶幅度大的点,也对应二阶微分的“过零点”。因此,利用梯度最大值或者二阶导数“过零点”提取边界点成为一种有利的手段。传统的边缘检测的方法大都依据这种特征提取边缘信息。比如梯度算子等。
Canny算子是Canny在综合考虑了传统的边缘检测算子后提出的,他发现这些边缘检测算子都有一些共同的要求:
- 好的检测效果,也就是说对边缘的错误检测要尽可能的低:在图像的边缘出现的地方检测结果中必须有,而且不能出现虚假边缘。在所有使用边缘检测做更深入的研究工作的系统中,它的性能都依赖于边缘检测的误差。
- 对边缘的定位要准确:标记出来的边缘位置要和图像的真正边缘的中心位置充分的接近。
- 对同一个边缘要有低的响应次数。即单个边缘产生多个响应的概率要尽可能的低,而且对虚假边缘的响应要尽可能的抑制。
Canny在明确了这三个要求后提出了经典的Canny算法。并提出Canny算子实现边缘检测的步骤如下:
- 用高斯滤波器平滑图像。
- 计算平滑后的图像的梯度幅值和方向。
- 对梯度幅值采用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非极大值点置零而得到细化的边缘。
- 用双阈值算法检测和连接边缘。
具体的数学过程可见这篇博客。