Sina Weibo:小锋子Shawn
Tencent E-mail:403568338@qq.com
http://blog.csdn.net/dgyuanshaofeng/article/details/53890282
如果有人问我Canny边缘检测算子是什么?如何检测图像的边缘点?,那么我答不上。。。
坎尼(Canny)边缘检测算子
这个算法由John Canny于1986年,在文章《A Computational Approach to Edge Detection》上提出。
边缘检测的通用准则:
第一,良好的检测。以大概率标记真实边缘点,以小概率标记非边缘点。低错误率要求最大化信噪比。
第二,良好的定位。被标记的边缘点要尽可能靠近真实边缘的中心。
第三,单一边缘具有唯一响应。
为了满足上面的三条准则,坎尼利用变分法(calculus of variations),即寻找一个函数优化一个给定的泛函。最优函数在坎尼检测子中被描述为四个指数项之和,然而它可以由高斯函数的一阶导数逼近。因此,它是一种一阶算子。
步骤:
第一,利用高斯滤波器平滑图像,以移除/减少噪声(缺点:同时平滑了边缘)。
第二,利用导数算子(Prewitt、Sobel)计算沿着两个方向的偏导数,从而计算梯度大小|G|=(Gx^2+Gy^2)^0.5和梯度方向arctan(Gx/Gy)。边缘点被定义为梯度方向上局部强度最大的点。
% Calculate gradients using a derivative of Gaussian filter
[dx, dy] = smoothGradient(a, sigma);
% Calculate Magnitude of Gradient
magGrad = hypot(dx, dy);
% Normalize for threshold selection
magmax = max(magGrad(:));
if magmax > 0
magGrad = magGrad / magmax;
end
说明:第一和第二步一起做,并且将二维卷积转化为2个一维卷积,首先对图像的进行水平平滑,然后对平滑后的图像进行水平梯度计算和梯度平滑;垂直方法类似。接着计算梯度强度,也就是梯度大小。
第三,非最大抑制细化。
第四,双阈值处理/滞后阈值化。
% Determine Hysteresis Thresholds
[lowThresh, highThresh] = selectThresholds(thresh, magGrad, PercentOfPixelsNotEdges, ThresholdRatio, mfilename);
% Perform Non-Maximum Suppression Thining and Hysteresis Thresholding of Edge
% Strength
e = thinAndThreshold(dx, dy, magGrad, lowThresh, highThresh);
thresh = [lowThresh highThresh];
说明,第三和第四步一起做,thinAndThreshold实际上把第五步都做了。
第五,利用合并8连接的弱像素点到强像素点的方法执行边缘连接。
MATLAB内置函数edge.m有说明:The Canny method finds edges by looking forlocal maxima of the gradient of I. The gradient is calculated using the derivative of a Gaussian filter. The method usestwo thresholds, to detect strong and weak edges, and includes the weak edges in the output only if they areconnected to strong edges. This method is therefore less likely than the others to be "fooled" by noise, and more likely to detect true weak edges.
参考:
1、Wikipedia:Canny Edge Detector
2、数字图像处理的MATLAB实现(第2版)
3、数字图像处理学(第3版)