2023年MATLAB实验报告 (二)_第1页
2023年MATLAB实验报告 (二)_第2页
2023年MATLAB实验报告 (二)_第3页
2023年MATLAB实验报告 (二)_第4页
2023年MATLAB实验报告 (二)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于canny算子的边沿检测

报告题目:基于canny算子的边沿检测

学院:

专业:

年级:__________________;_________________

学号:

学生姓名:

指导教师:

日期:

目录

摘要..........................................错误!未定义书签。

1Canny边沿检测基本原理.....................错误!未定义书签。

2Canny边沿检测算法(数学描述)..............错误!未定义书签。

3算法过程....................................错误!未定义书签。

4实现过程....................................错误!未定义书签。

5结果显示偌误!未定义书签。

6总结和体会................................错误!未定义书签。

7参考文献偌误!未定义书签。

摘要

图象的边沿是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是

一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。

图象的边沿部分集中了图象的大部分信息,图象边沿的拟定与提取对于整个图象场景的

辨认与理解是非常重要的,同时也是图象分割所依赖的重要特性,边沿检测重要是图象的灰

度变化的度量、检测和定位,自从1959提出边沿检测以来,通过五十数年的发展,已有许多

中不同的边沿检测方法。

本文重要讨论通过canny算子,来获取图像的边沿区域的方法。

1Canny边沿检测基本原理

具有既能滤去噪声又保持边沿特性的边沿检测最优滤波器,其采用一阶微分滤波器。采

用二维高斯函数的任意方向上的一阶方向导数为噪声滤波器,通过与图像卷积进行滤波;

然后对滤波后的图像寻找图像梯度的局部最大值,以此来拟定图像边沿。根据对信噪比与定

位乘积进行测度,得到最优化逼近算子,这就是Canny边沿检测算子。类似与Marr(LOG)

边沿检测方法,也属于先平滑后求导数的方法。

2Canny边沿检测算法(数学描述)

stepl:用高斯滤波器平滑图象。

O(x.y)=_L_fJxLzl?)

二维为高斯函数为:I"5I26')

G=aG=

在某一方向n上是G(x,y)的一阶方向导数为:合«

cosedG'

11=~dx~

sind▽G=

dG

式中:n式方向矢量,是梯度矢量。将图像与Gn作卷积,同时改变n的方

向,Gn*取得最大值时的n就是正交于检测边沿的方向。

step2:用一阶偏导的有限差分来计算梯度的幅值和方向。A(x,y)反映了图像(x,y)

点处的边沿强

度,。是图像(x,y)点处的法向矢量。

step3:对梯度幅值进行非极大值克制。仅仅得到全局的梯度并局限性以拟定边沿,因

此为拟定边沿,必须保存局部梯度最大的点,而克制非极大值,如图lo解决方法:运用梯度

的方向。四个扇区的标号为0到3,相应3*3邻域的四种也许组合。在每一点上,邻域的中

心像素M与沿着梯度线的两个像素相比。假如M的梯度值不比沿梯度线的两个相邻像素梯

度值大,则令M=0,即G(x,y)=NMS(M[x,y],§[x,y])。

step4:用双阈值算法检测和连接边沿•减少假边沿段数量的典型方法是对G(x,y)

使用一个阈值,并将低于阈值的所有值赋零值。通常选取阈值的方法:双阈值算法进行边沿判

别和连接边沿。

①一方面是边沿判别:凡是边沿强度大于高阈值的一定是边沿点;凡是边沿强度小于低

阈值的一定不是边沿点;假如边沿强度大于低阈值又小于高阈值,则看这个像素的邻接像素

中有没有超过高阈值的边沿点,假如有,它就是边沿点,假如没有,它就不是边沿点。

②另一方面是连接边沿:双阈值算法对非极大值克制图像作用两个阈值T1和T2,且

2T1T2,从而可以得到两个阈值边沿图像Gl(x,y)和G2(x,y)。由于G2(x,y)

使用高阈值得到,因而具有很少的假边沿,但有间断(不闭合)。双阈值法要在G2(x,y)中把

边沿连接成轮廓,当到达轮廓的端点时,该算法就在Gl(x,y)的8邻点位置寻找可以

连接到轮廓上的边沿,这样,算法不断地在G1(x,y)中收集边沿,直到将G1(x,y)连接起

来为止。

检测阶跃边沿的基本思想是在图像中找出具有局部最大梯度幅值的像素点。虽然Canny

边沿检测算法也有自身的针对性和局限性,但canny算子边沿检测算法则既能滤去噪声又

保持边沿特性的边沿检测的一阶微分算法中的最佳选择方法。

3算法过程

4实现过程

1)读入图像:

c1ear;

clc;Ai=imread(z1ight.jpg');—二rgb2y(i)获取h分量,即亮度分量

根据边沿的定义,边沿检测的目的是标记数字图像中亮度变化明显的点。

又根据公式B「ightness=0.3*R+0.6*G+0.1*B;计算出亮度分量y;

functionk=rgb2y(z)A%i必须为rgb三维矩阵A[m,n,p]=size(z);

k=zeros(m,n);

z=double(z);

fori=l:mAforj=l:n

k(i,j)=0.3*z(i,j,1)+0.6*z(iJ,2)+0.1*z(i,j,3);aend

end

2)用3x3高斯滤波器进行滤波,消除噪声;

functionj=gaosi(i);A%i必须为二维double矩阵Aj=i;

[h,w]=size(i);Aform=2;h-1

forn=2:w-1Aj(m,n)=(i(m,n-l)+2*i(m,n)+i(m,n+1))/4;%横向高斯

滤波

end

end

运用上面自定义的gaosi函数对图像进行二维3x3滤波,

kl=gaosi(k);%横向滤波叱1=k「;%对图像进行转置,为下一步纵向滤波作准备(纵向滤波

二=转置后横向滤波)

k1=gaosi(kl);

k1=kl';%还原

3)针对每一个像素,计算横向与纵向两方向的微分近似,以得到像素的梯度大小和方向;

由此得到梯度的大小M和方向0:

Mzzsqrt3p+q*q)

arctan(g//>)

运用上式,易知p,q分别为计算出的横向、纵向的微分近似,由此再计算出梯度的大小和方

向。

%计算梯度的大小和方向

[h,w]=size(k);

form=2:h-Uforn=2:w—1

zzl=kl(m,n-l)+k1(m+l,n-l);

zz2=kl(m,n)+kl(m+l,n);

zz3=k1(m,n-l)+k1(m,n);

zz4=kl(m+1,n-1)+kl(m+l,n)泠kp(m,n)=0.5*(zz2-zzl);A

kq(m,n)=0.5*(zz3-zz4);

kfu(m,n)=sqrt((kp(m,n)'2)+(kq(m,n)人2));%梯度大小Akj

iao(m,n)=atan(kq(m,n)/(kp(m,n)+0.001));%梯度方向,0.001防止分母为0

end

end

4)对梯度进行〃非极大克制〃(非局部最大值置0);

1.先将梯度方向归类为四个重要方向,左右、上下、左斜、右斜。

%非极大值克制破一方面将梯度方向划分为4个方向0,45,90,135(以及他们的反向延长

线)Morm=2:h-1

forn=2:w-1Aifkjiao(m,n)>=3/8*pi^kjiao

(m,n)=2;

e1seifkjiao(m,n)>=l/8*pi-*kjiao(m,n)=1泠

elseifkjiao(m,n)>=-1/8*pi

kjiao(m,n)=0;

elseifkjiao(m,n)>=-3/8*pi

kjiao(m,n)=3;

else

kjiao(m,n)=2;

endAendAend

end

end

end

根据划分后的4个方向,判断该点是否是8邻域的局部最大值(梯度方向),比如,梯度方向

为左右方向的点,判断其是否比左右两点的值来的大,假如不是,使该点的值为0.

%按照各个方向分别判断

k2=kl;

form=2:h-lAforn=2:w—1

ifkjiao(m,n)==Oifkl(m,n)>kl(m,n-l)&&kl(m,n)>kl(m,

n+1);Aelsek2(m,n)=0;AendAen»if

kjiao(m,n)==l

ifkl(m,n)>k1(m+l,n-l)&&kl(m,n)>kl(m-l,n+1);

elsek2(m,n)=0;

endAendAifkjiao(m,n)==2

ifk1(m,n)>kl(m-l,n)&&k1(m,n)>kl(m+1,n);

e1sek2(m,n)=0;

endAend

ifkjiao(m,n)==3

ifkl(m,n)>kl(m-1,n-1)&&k1(m,n)>k1(m+1,n+1);Ae1se

k2(m,n)=0泠end^end^end

end

5)对梯度取两次阈值;

用两个阈值tl和t2(t2>tl,一般取t2=2*tl),我们把梯度值小于t1的像素的灰度设为

0,得到图像1,然后我们把梯度值小于t2的像素的灰度设为0,得到图像2。由于图像2的

阈值较高,噪音较少(但同时也损失了有用的边沿信息,而图像1的阈值较低,保存了较多信

息,因此我们可以以图像2为基础,以图像1为补充来连接图像的边沿。

%两次阈值分割43=k2;%以11为阈值分割后的矩阵

1<4=1<2;%以12为阈值分割后的矩阵

tl=50;

t2=2*tl;Aform=2:h-Uforn=2:W-1Aifkfu(m,n)<tl

k3(m,n)=0;Aen»ifkfu(m,n)<t2^

k4(m,n)=0;aenMendAend

A5)对边沿进行连接;

a.扫描图像2,当我们碰到一个非零值的像素p时(跟踪以p为开始点的轮廓线直到该轮廓

线的终点q»b.在图像1中,考察与图像2中p点位置相应的点P'的8邻域,假如在p'点

的8邻域中有非零像素q'存在,将其涉及到图像2中,作为点r,从r开始(反复第a步,直

到我们在图像1和图像2中都无法继续为止;我们已经结束了对包含P的轮廓线的连接,

将这条轮廓标记为已访问过,回到第a步,寻找下一条轮廓线,反复第(a)(b)(c)步直到图

像2中再也找不到新轮廓线为止.

findline.m:

function[ff,f1agl]=findline(k3,k4,flag,m,n)AAflag1=flag;Aml=m+l;nl=n+l

while(m~=ml||n〜=nl)%若m和n都不发生变化,表白line已到终点Aflagg=0for

i=l:3Aif(flagg==1)break;aend

forj=l:3

ifk3(m-2+i,n-2+j)~=Ok4(m-2+i,n-2+j)=255;A

m1=m-2+i;nl=n-2+j;%新的[m,n]点

flagl(m,n)=1;%标记已检测过

flagg=1;break*end

end

end-*m=m1;n=n1;

endAff=k4;

主函数里写上:

figure;

subp1ot(221);imshow(i);tit1e('原图像');

subplot(222);imshow(k3,[]);tit1ef阈值为50的分割图像');Asubp1ot(223);ims

how(k4,[]('阈值为100的分割图像D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论