本文将详细介绍经典Canny边缘检测的算法实现。
Canny边缘检测算法可以分为4步:高斯滤波器平滑处理、梯度计算、非极大值抑制、双阈值边缘检测和边缘连接。
1,高斯滤波器平滑处理。由于图像中经常包含一些高斯噪声,因此在边缘检测前我们要先用高斯滤波器对其进行滤波,为了方便,通常是使用一些高斯模板,这里我们使用如下的高斯滤波器模板。
2,梯度计算。使用一阶导数算子(一般用sobel模板)计算灰度图像每个像素点在水平和竖直方向上的导数Gx、Gy,得出梯度向量 (Gx,Gy),最后得到该像素点的梯度G和相位角D,Sobel模板及梯度公式如下所示。
Fig.1 Sobel模板算子
3,非极大值抑制。对于2中得到的梯度,它其实是一个粗边缘信息,我们通过非极大值抑制来去掉一些非边缘信息。这里将当前像素的梯度与其在梯度方向上的邻域像素的梯度对比,如果当前像素的梯度为最大值,则保留该点梯度信息,否则将该点删除或置为0。
4 ,双阈值边缘检测和边缘连接。由 3 得到的边缘信息中包含较多伪边缘信息,我们通过设置高低双阈值的方法去除它们。首先,设定两个阈值,一个高阈值,一个低阈值,阈值大小根据实际情况设置,一般低阈值为高阈值的 0.4 倍;然后我们判断:梯度值大于高阈值的像素点一定是边缘,该点像素值置为 255 ;梯度值小于低阈值的像素点一定不是边缘点,该点像素之置为 0 ;介于高低阈值之间的像素点为准边缘点,对于这些点,如果其像素点周围 8 邻域的梯度值都小于高阈值,则认为其不是边缘点,该点像素值置为 0 ,否则置为 255 ;
下面给出一份Win8C#的代码,另附一份C#代码在文章 末尾链接。
- ///
- /// Canny edge detect process.
- ///
- /// The source image.
- /// The high threshould value.
- /// The low threshould value.
- ///
- public static WriteableBitmap CannyedgedetectProces