Canny边缘检测详解及编程实现
Canny边缘检测算法一直是边缘检测的经典算法。下面详细介绍Canny边缘检测算法的原理以及编程实现。
Canny边缘检测基本原理:
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化近算子。这就是Canny边缘检测算子。
(3)类与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
(1)好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
(2)好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
(3)最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像雜訊不应标识为边缘。
Canny边缘检测算法的步骤:
(1)去噪
任何边缘检测算法都不可能在未经处理的原始数据上很好地處理,所以第一步是对原始数据与高斯 mask 作卷积,得到的图像与原始图像相比有些轻微的模糊(blurred)。canny边缘检测详解及编程实现这样,单独的一个像素雜訊在经过高斯平滑的图像上变得几乎没有影响。
(2)用一阶偏导的有限差分来计算梯度的幅和方向。
(3)对梯度幅进行非极大抑制。
仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,必须保留局部梯度最大的点,而抑制非极大。(non-maxima suppression,NMS)
解决方法:利用梯度的方向。

四个扇区的标号为0到3,对应3*3邻域的四种可能组合。在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度不比沿梯度线的两个相邻象素梯度大,则令M=0。
(4)用双阈算法检测和连接边缘。
减少假边缘段数量的典型方法是对N[i,j]使用一个阈。将低于阈的所有赋零。但问题是如何选取阈?
解决方法:双阈算法。canny边缘检测详解及编程实现双阈算法对非极大抑制图象作用两个阈τ1和τ2,且2τ1≈τ2,从而可以得到两个阈边缘图象N1[i,j]和N2[i,j]。由于N2[i,j]使用高阈得到,因而含有很少的假边缘,但有间断(不闭合)。双阈法要在N2[i,j]中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1[i,j]的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在N1[i,j]中收集边缘,直到将N2[i,j]连接起来为止。
在连接边缘的时候,用数组模拟队列的实现。以进行8-连通域搜索。
更详细的资料请参考维基百科:%E7%AE%97%E5%AD%90
下面是我编程实现的Canny边缘检测代码,如有错误,请大家包涵、指正:
I = imread('rice.png');
I = double(I);
[height,width] = size(I);
J = I;
conv = zeros(5,5);%高斯卷积核
sigma = 1;%方差
sigma_2 = sigma * sigma;%临时变量
sum = 0;
for i = 1:5
for j = 1:5
conv(i,j) = exp((-(i - 3) * (i - 3) - (j - 3) * (j - 3)) / (2 * sigma_2)) / (2 * 3.14 * sigma_2);%高斯公式
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33947-1.html
告诉我康师傅是哪的