Canny算子理解,及Matlab实现

JohnCanny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。本文对根据上述的边缘检测过程对Canny检测算法的原理进行介绍。 并结合实验,对canny算法进行理解,指出参数选取中容易产生的问题。

canny边缘检测一共四个部分:
1. 用高斯滤波器平滑图像;(图像去噪)
2. 用一阶偏导有限差分计算梯度幅值和方向;(特征增强)
3. 对梯度幅值进行非极大值抑制 ;(边缘检测)
4. 用双阈值算法检测和连接边缘。(形态学处理)

平滑去噪

canny边缘检测的前两步相对不复杂,所以我就直接调用系统函数了。

IM=imread('2.tif');
IM=imnoise(IM); %imnoise对uint8类型加噪为0-255,e对double类型加噪为0-1,
[m,n]=size(IM);
IM=double(IM);
%高斯滤波
w=fspecial('gaussian',[9 9]);
img=imfilter(IM,w,'replicate');

值得注意的是,在选取滤波窗口w时,根据我的实验(无噪声情况实验,若有噪声,也会影响后续的非极大值抑制),滤波窗口w边长为偶数时,将导致得到的梯度只有单像素最大幅值。而对边缘分析可知,应该产生双像素的梯度幅值才符合实际情况,所以滤波窗口w的选取一定要为基数边长。

实例如下,当选偶数边长时,幅值结果如下
边界(200、201)处梯度的幅值,只有一个最大值

当选基数边长时,幅值结果如下
边界(200、201)处梯度的幅值,有两个最大值

计算幅值

%%sobel边缘检测
w_h=[1,2,1;0,0,0;-1,-2,-1];              %Sobel算子,梯度方向朝上为正
img_h=imfilter(img,w_h,'replicate');       %梯度是竖着的边缘,即横边缘
w_w=[-1,0,1;-2,0,2;-1,0,1];              %Sobel算子,梯度方向朝右为正
img_
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值