OpenCV提供了一个很方便的名为Canny(以该算法的发明者John F.Canny的名字命名)的函数,它非常受欢迎,不仅因为它的有效性,还因为它在OpenCV程序中的实现很简单(只有一行代码):
Canny的实现结果如图3-4所示,边缘识别非常清晰。
图3-4 Canny算法的实现结果
Canny边缘检测算法比较复杂,但是也很有趣。这是一个5步过程:
(1)用高斯滤波器去除图像的噪声。
(2)计算梯度。
(3)在边缘上应用非极大值抑制(Non-Maximum Suppression,NMS)。这意味着算法从一组重叠边缘中选取最好的边缘,我们将在第7章详细讨论非极大值抑制的概念。
(4)将双阈值应用于所有检测到的边缘,淘汰所有的假正例结果。
(5)分析所有的边缘及其之间的连接,保留真正的边缘,并丢弃弱边缘。
在找到Canny边缘后,我们可以对边缘做进一步分析,以确定它们是否符合常见形状,如线或者圆。霍夫变换就是以这种方式使用Canny边缘的一种算法。我们将在3.10节对其进行实验。
现在,我们将基于寻找相似像素斑点的概念(而不是基于边缘检测)来研究分析形状的其他方法。