这是OpenCV图像处理模块提供的最后一个边缘检测的例子,canny边缘检测,利用函数Canny()实现。前面分别介绍了Sobel和Laplace边缘检测。
CVer:【3】OpenCV图像处理模块(13)Sobel边缘检测
CVer:【3】OpenCV图像处理模块(14)拉普拉斯边缘检测
理论
Canny边缘检测器是由John Canny[1]于1986年提出的。被称为最佳的边缘检测器,满足下面三个条件:
- 低错误率:只检测存在边缘的地方
- 良好的定位:检测到的边缘像素与真正边缘像素距离最小
- 最小响应:一个边缘只会得到一个响应。
检测步骤
1.使用高斯滤波器滤波。一个大小为5的高斯滤波器核如下:
2.计算图像梯度。这里与Sobel方法类似:
- a.利用两个卷积核,分别计算x和y方向的梯度:
- b.计算总梯度大小和方向:
方向角度圆整到到下面四个角度之一(0,45,90,135)。
3.非极大值抑制。该步移除非边缘像素。只有细线(候选边缘)保留。
4.Hysteresis:最后一步。用两个阈值再次筛选边缘(高upper和低lower):
- a.如果像素梯度高于upper,该像素为边缘
- b.如果像素梯度低于lower,该像素不是边缘
- c.如果像素梯度在两者之间,只有当它连接到一个满足于a的像素时,是边缘
Canny推荐upper:lower在2:1和3:1之间。
5.关于更多的细节,可以参考有关图像处理的书籍。
代码
// @tutorials imgproc module 15
结果
高阈值是低阈值的三倍,注意这里检测的边缘是用原图中的像素值填充过的。
参考
- ^John Canny.A computational approach to edge detection.Pattern Analysis and Machine Intelligence, IEEE Transactions on, (6):679–698, 1986.