图像的边缘检测
边缘检测是图像处理和计算机视觉中的基本问题,其目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化
边缘检测的一般步骤
滤波
边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要是高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核,然后基于高斯核哈数对图像灰度矩阵的每一点进行加权求和。
增强
增强边缘的基础是确定图像各点邻域强度变化的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在开发中,可以通过计算梯度幅值来确定。
检测
经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是要找的边缘点,所以应该采用某种方法对这些点进行取舍。在实际的工程中,常用的方法是阈值化检测。
Canny算子
Canny算子的简介
Canny边缘检测算子是一个多级边缘检测算法,在当今被推崇为最优的边缘检测方法。具有低错误率、高定位性、最小响应。
Canny边缘检测的步骤
消除噪声
一般情况下,使用高斯平滑滤波器卷积降噪
计算梯度幅值和方向
非极大值抑制
排除非边缘像素,仅仅保留了一些细线条(候选边缘)。
滞后阈值
滞后阈值需要两个阈值(高阈值和低阈值)。
若某一像素位置的幅值超过了高阈值,该像素被保留为边缘像素
若某一像素位置的幅值低于低阈值,该像素则被排除。
若某一像素位置的幅值在两个阈值之间,该像素仅仅在连接一个高于高阈值的像素时保留。
Canny()函数
/*
@param image 8-bit input image.
@param edges output edge map; single channels 8-bit image, which has the same size as image .
@param threshold1 first threshold for the hysteresis procedure.
@param threshold2 second threshold for the hysteresis procedure.
@param apertureSize aperture size for the Sobel operator.
@param L2gradient a flag, indicating whether a more accurate \f$L_2\f$ norm
\f$=\sqrt{(dI/dx)^2 + (dI/dy)^2}\f$ should be used to calculate the image gradient magnitude (
L2gradient=true ), or whether the default \f$L_1\f$ norm \f$=|dI/dx|+|dI/dy|\f$ is enough (
L2gradient=false ).
*/
// 这个函数的阈值1和阈值2 两者中较小的值用于边缘连接,而较大的值用来控制边缘的初始段。 推荐高低阈值比在2:1和3:1之间
CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );