边缘检测是为了识别物体的边缘,而边缘是由数字图像中亮度变化明显的点连接而成的,主要可以通过基于图像强度的一阶和二阶导数来寻找到这些点。
边缘检测可以分成三个步骤:
- 滤波。由于导数对噪声敏感,所以在边缘检测之前可以先试着降低图片的噪声,常用的是高斯滤波。
- 增强。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来,可以通过计算梯度幅值来确定。
- 检测。根据梯度幅值就可以检测出物体的边缘,由于经过图像增强,有些店并不是要找的边缘值,我们还可以通过阈值化的方式来筛选。
canny
Canny边缘检测算子是澳洲计算机科学家约翰·坎尼(John F. Canny)于1986年开发出来的一个多级边缘检测算法。更为重要的是Canny创立了“边缘检测计算理论”(computational theory of edge detection)解释这项技术如何工作。
Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
- 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
- 好的定位 - 标识出的边缘要与实际图像中的实际边缘尽可能接近。
- 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。
为了满足这些要求Canny使用了变分法,这是一种寻找满足特定功能的函数的方法。最优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。
—— 维基百科
我们可以使用 OpenCV 中的 Canny() 来做边缘检测。
|
|
- src: 源图像,8位即可
- edges: 输出的边缘图,要求与源图像保持一样的尺寸和类型
- threshold1: 第一个滞后性阈值
- threshold2: 第二个滞后性阈值
- apertureSize: 表示应该用 Sobel 算子的空间大小,默认为 3
- L2gradient: 计算图像梯度幅值的标识,默认为 false
注:threshold1 和 threshold2 中较小