dsp-Canny算子实现图像的边缘检测(董书月组)要点_第1页
dsp-Canny算子实现图像的边缘检测(董书月组)要点_第2页
dsp-Canny算子实现图像的边缘检测(董书月组)要点_第3页
dsp-Canny算子实现图像的边缘检测(董书月组)要点_第4页
dsp-Canny算子实现图像的边缘检测(董书月组)要点_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

SHIJIAZHUANGUNIVERSITY

DSP课程设计报告

题目:Canny算子实现图像的边缘检测___________________________

院系:_电气信息工程系—专业:一通信工程

组长:__学号:_

组员1:__学号一

组员2:__学号:

组员3:__学号一

组员4:__学号一

指导老师:_

电气信息工程系课程设计总结报告

一、选题目的和意义

边缘检测是图像处理中的重要内容。边缘是图像的最基本特征。所谓图像

的边缘是指图像局部区域亮度变更显著的部分,该区域的灰度剖面一般可以看

作是一个阶跃,即从一个灰度值在很小的缓冲区域内急剧变更到另一个灰度相

差较大的灰度值。图像的边缘部分集中了图像的大部分信息,图像边缘的确定

与提取对整个图像场景的识别与理解是特殊重要的,同时也是图像分割所依靠

的重要特征,边缘检测主要是图像的灰度变更的度量、检测和定位。边缘与图

像中物体的边界有关,但又是不同的。边缘反映的是图像灰度的不连续性C

边缘在边界检测、图像分割、模式识别、机器视觉等等中有很重要的作用。

边缘是边界检测的基础,也是外形检测的基础。边缘广泛存在于物体与背景之

间、物体与物体之间以及基元与基元之间,因此它也是图像分割所依靠的重要

特征。

边缘检测对于物体的识别也是很重要的。主要有以下几个理由:首先,人

眼通过追踪未知物体的轮廓(轮廓是由i段的边缘片段组成的)而扫视一个未

知的物体。其次,阅历告知我们:假如我们能成功地得到图像的边缘,那么图

像分析就会大大简化,图像识别就会简洁得多。第三,许多图像并没有具体的

物体,对这些图像的理解取决于他们的纹理性质,而提取这些纹理性质与边缘

检测有极其密切的关系。然而自从1959年文献上最早提出边缘检测,从那以

后每年都会出现许多关于边缘检测的文章。经过了四十多年的发展,已有许多

种不同的边缘检测方法。典型一阶边缘检测算子包括Roberts算子,Sobel算子,

Prewitt算子以及梯度算子等;典型二阶边缘检测算子包括Laplacian算子,LOG

算子,canny算子。

Canny算法适用于不同的场合。它的参数允许依据不同实现的特定要求进

行调整以识别不同的边缘特性。对于PC上的实时图像处理来说可能慢得无法

运用,尤其是在运用大的高斯滤波器的状况下。但是,我们探讨计算实力的时

候,也要考虑到随着处理器速度不断提升,有望在将来儿年使得这不再成为一

个问题。

学生姓名任务分工学生姓名任务分工

董书月课题设计范广杰查找资料

董立尧软件仿真付腾飞软件仿真

董花撰写报告

二、主要探讨内容

Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘

检测算法。更为重要的是Canny创立了边缘检测计算理论(Computalional

theoryofedgedetection)说明这项技术如何工作,

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

像素点。检测阶跃边缘的大部分工作集中在找寻能够用于实际图像的梯度数字

靠近。由于实际的图像经过了摄像机光学系统和电路系统(带宽限制)固有的低

通滤波器的平滑,因此,图像中的阶跃边缘不是特殊陡立。图像也受到摄像机

噪声和场景中不希望的微小环节的干扰。图像梯度靠近必需满足两个要求:首

先靠近必需能够抑制噪声效应;其次必需尽量精确地确定边缘的位置。抑制噪

声和边缘精确定位是无法同时得到满足的,也就是说,边缘检测算法通过图像

平滑算子去除了噪声,但却增加了边缘定位的不确定性;反过来,若提高边缘

检测算子对边缘的敏感性,同时也提高了对噪声的敏感性。有一种线性算子可

以在抗噪声干扰和精确定位之间供应最佳折中方案,它就是高斯函数的一阶导

数。

(一)Canny依据检测的要求,定义了下面三个最优准则:

1.最优检测。定真实边缘不漏检,非边缘点不错检,即要求输出信噪比

最大。

2.最优检测精度。检测的边缘点的位置距实际的边缘点的位置最近。

3.检测点与边缘点一一对应。每一个实际存在的边缘点和检测的边缘点是

对应的关系。

用一句话说,就是希望在提高对景物边缘的敏感性的同时,可以抑制噪声

的方法才是好的边缘提取方法。

(二)Canny边缘检测的算法内容为:

1.首先用2D高斯滤波模板与原始图像进行卷积,以消退噪声;

2.用一阶偏导的有限差分来计算梯度的幅值和方向;

3.对梯度幅值进行非极大值抑制;

4.用双阈值算法检测和连接边缘。

Canny算子边缘检测的方法是找寻图像梯度的局部最大值。梯度是用高斯

滤波器的导数计算的cCanny方法运用两个阈值来分别检测强边缘和弱边缘,

而且仅当强边缘和弱边缘相连时,弱边缘才会包含在输出中。因此,此方法不

简洁受噪声的干扰,能够检测到真正的弱边缘。

本文基于matlab软件实现对图像的边缘检测,通过用相关的函数实现了

canny算子的最优检测方法,完成了对图像的最优边缘检测。从而达到了本次

基于matlab对canny算子图像边缘检测的仿真。

三、试验设计(相关原理框图)

本文是用matlab编程来实现图像的处理,整体流程图如1:

图1整体流程图

Canny算子流程图如图2:

图2canny算子选程图

四、设计的方法及步骤

(-)canny算子的设计方法

依据图2所给出的流程图,实现canny算子的理论原理如下:

1.高斯平滑

用/("J)表示输入图像,运用可分别滤波方法求图像与高斯平滑滤波器卷

积,得到的结果是一个已平滑的数据矩阵

S(5=GC,j)

其中。是高斯函数的标准差,它限制着平滑程度。

二维高斯函数为:

1((丁+力、

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

6G

cos6dT

n=VG=

sin。dG

°y.

式中:n式方向矢量,VG是梯度矢量。

将图像/(兀),)与伉作卷积,同时变更n的方向,G“*/(x,y)取得最大值

时的n就是正交于检测边缘的方向。

2.梯度幅值及方向角计算

已平滑数据矩阵的梯度可以运用2x2一阶有限差分近似式来计算x与y偏

导数的两个矩阵与。口力:

P(i,;)«(S(i+1,j)—S(i,j)+S(z+l,J+l)-S(i,;+l))/2

Q(i,j)a(S(i,J+1)—S(i,j)+S(i+1J+1)-S(i+1,j))/2

在这个2x2方形内求有限差分的均值,以便在图像中的同一点计算x和y

的偏导数梯度。幅值和方向角可用直角坐标到极坐标的坐标转化公式来计算。

M(i,j)=dP(i,j)2+Q(i,j)2

,(i,j)=arctanQ3j)

P(i,J)

M(i,力反映了图像的边缘强度;。(。力反映了边缘的方向。使得用亿力取

得局部最大值的方向角0(i,力就反映了边缘的方向。

3.非极大值抑制

幅值图像阵列M(i,j)的值越大,其对应的图像梯度值也越大,但这还不足

以确定边缘,因为这里仅把图像快速变换的问题转化成求幅值矩阵M(i,j)的局

部最大值问题。为确定边缘,必需细化幅值图像中的屋脊带(Ridge),即只保留

幅值局部变更最大的点。这一过程叫非极大值抑制(Non—MaximaSuppression,

NMS),它会生成细化的功缘。

非极大值抑制通过抑制梯度线上全部非屋脊峰值的幅值来细化M(i,j)中的

梯度幅值屋脊。这一算法首先将梯度角j)的变更范围减小到圆周的四个扇

区,也即方向角的规范化,如图3所示:

^[iJ]=Sector(0[iJ])

图3方向角规范化

四个扇区的标号分别为0到3,对应着3x3邻域内的四种可能组合,任何

通过邻域中心的点必通过其中一个扇区,梯度线可能方向的圆周分区用度来标

记。该算法运用一个3x3邻域作用于幅值矩阵列M(i,j)的全部点。在每一点上,

邻域的中心像素M(i,j)与沿着梯度线的两个元素进行比较,其中梯度线是由邻

域的点处的扇区值给出的.假如在邻域中心点处的幅值M(i,j)不比沿线

梯度线方向上的两个相邻点幅值大,则M(i,j)赋值为零。这一过程可以把M(i,j)

宽屋脊带细化成只有一个像素点宽。在非极大值抑制过程中,保留了屋脊的高

度值。设

表示非极大抑制过程。N(iJ)中的非零值对应着图像强度阶跃变更处的对比

度。尽管在边缘检测的第一步对图像进行了平滑,但非极大值抑制幅值图像

仍会包含许多由噪声和纹理引起的假边缘。实际中,假边缘的对比度一

般是很小的。

4.双门限检测

Canny还提出一种对噪声的估计的好用方法。假设边缘信号的响应是匕较

少的而且是比较大的值而噪声的响应是许多的但是值相对较小,那么阀值就可

以通过滤波后的图像的统计累积直方图得到(后面的改进算法中,将通过最大

端算法来获得Canny算法的高门限阈值并据此求出低门限值)。

削减假边缘数量的典型方法是对N(i,j)运用一个阈值,将低于阈值的全部

值赋零值。对非极大值抑制幅值进行阈值化的结果是一个图像I(ij)的边缘阵

列。阈值化后得到的边缘阵列照旧有假边缘存在,缘由是阈值太低(假正确)以

及阴影的存在,使得边缘对比度减弱,或阈值T取得太高而导致部分轮廓丢失

(假错误)。选择合适的阈值是困难的,须要经过反复试验。为了解决这个问题,

Canny提出了一种双阀值方法。首先利用累计统计直方图得到一个高阀值7;,

然后再取一个低阀值本文用MATLAB实现时使乙=0.57;)。假如图像信号的

响应大于高阀值,那么它确定是边缘;假如低于低阀值,那么它确定不是边缘;

假如在低阀值和高阀值之间,我们就看它的8个邻接像素有没有大于高阀值的

边缘,假如有,那么它是边缘,否则它不是边缘。

(二)图像边缘检测的基本步骤:

1.滤波,边缘检测主要基于导数计算,但受噪声的影响。但滤波器在降低

噪声的同时也导致了边缘强度的损失。

2.增加,增加算法将邻域唤度有显著变更的点突出显示。一般通过计算梯

度幅值完成。

3.检测,但在有些图像中梯度幅值较大的并不是边缘点。最简洁的边缘检

测是梯度幅值阈值的判定。

4.定位,精确确定边缘的位置.

综上所述,Canny算子的具体算法步骤如下:

1).用高斯滤波器对图像进行滤波,去除图像中的噪声;

2).用高斯算子的一阶微分对图像进行滤波,得到每个图像的梯度强度和

方向;

3).对梯度进行“非极大抑制”梯度的方向可以被定义为如下图所示:

图4梯度方向图

标识为1,2,3,4的属于四个区之一,各个区用不同的邻近像素来进行

比较,以确定局部极大值。例如,假如中心像素x的梯度方向属于第4区,则

把x的梯度值与它左上和右下相邻像素的梯度值比较,看x的梯度值是否是极

大值。假如不是,就把像素x的灰度设为0。这个过程称为“非极大抑制”。

4).对梯度取两次阈值,即取阈值7A和04,两者关系为他=0.4刀小我们

把梯度值小于他的像素的灰度设为0,得到的图像设为结果一。然后把梯度值

小于77%的像素的灰度设为0,得到的图像设为结果二。由于结果二阈值较高,

去除大部分噪声,但同时也损失了有用的边边缘缘信息。而结果一阈值较低,

保留了较多的信息。我们以结果二为基础,以结果一为补充来连接图像的边缘。

5).链接边缘的具体步骤如下:

(1)对结果二进行扫描,当遇到一个非零灰度的像素P时,跟踪以P为

起先点的轮廓线,直到轮廓线的终点Q。

(2)考察结果一中与结果二中Q点位置对应的点。的8邻近区域。假如

在。'点的8邻近区域中有非零像素*存在,则将其包括到图像2中,作为R

点。从R起先重复第一步,直到我们在结果一和结果二中都无法接着为止,

(3)当完成对包含P的轮廓线的连接之后,将这条轮廓线标记为已访问。

回到第(1)步,找寻下一条轮廓线,重复Canny算子的具体算法步骤第1步

第2步第3步,直到结果二中找不到打新轮廓线为止。至此完成Canny算子的

边缘检测。

(三)canny算子边缘检测程序

functioncan()

I=imread('ll.jpg');

gray=rgb2gray(I);

a=im2single(gray);

[m,n]=size(a);

%用于输出的边界位图

c=faisc(m,n);

GaussianDieOff=.0001;

PercenlOfPixelsNotEdges=.7;%用于阈值选择

ThrcsholdRatio=.4;%低阈值相对高阀值的比值

sigma=1;%设置sigma

thresh=[];

%设计滤波器-agaussian和它的导数

pw=1:30;

ssq=sigmaA2;

width=find(exp(-(pw.*pw)/(2*ssq))>GaussianDieOff,1,'Iast');

ifisempty(width)

width=1;

end

t=(-width:\vidth);

gau=cxp(-(t.*t)/(2*ssq))/(2*pi*ssq);%高斯一维港波

[x,y]=meshgrid(-width:width,-width:width);

dgau2D=-x.*exp(-(x.*x+y.*y)/(2*ssq))/(pi*ssq);%二维高斯方向导数

%用一阶高斯滤波器平滑图像

aSmoolh=imfiller(a,ga」,'conv','replicale');

aSmooth二imfilter(aSmooth,gau',‘conv','replicate');

%应用方向导数

ax=imfiker(aSmooth,dgau2D.conv','replicate');

ay=imfilter(aSmooth,dgau2D','conv','replicate');

%计算梯度复制

mag=sqrt((ax.*ax)+(ay.*ay));

rnagrnax=inax(mag(:));

ifmagmax>0

mag=mag/magmax;

end

%选择凹凸两个阈值,用于双阈值算法检测盒连接边缘

ifisempty(thresh)

counts=imhist(mag,64);

highThresh=find(cumsum(counts)>PercentOfPixelsNotEdges*m*n,1,'first')/64;

lowThrcsh=ThrcsholdRatio*highThrcsh;

thresh=[lowThrcshhighThresh];

elseiflength(thrcsh)==l

highThresh=thresh;

ifthresh>=I

eid=sprintfCImages:%s:thresholdMustBeLessThanOne',rnfilename);

msg=Thethresholdmustbelessthan1

crror(eid,'%s',insg);

end

lowThresh=ThresholdRatio*thresh;

thresh=[lowThreshhighThresh];

elseiflength(thresh)==2

lowThresh=thresh(1);

highThresh=thresh(2);

if(lowThrcsh>=highThresh)||(highThresh>=1)

eid=sprintfCImages^sithresholdOutOfRange',mfilename);

msg='Threshmustbe[lowhigh],wherelow<high<I.";

error(eid,'%s',msg);

end

end

idxStrong=[];

fordir=1:4

idxLocMax=cannyFindLocalMaxima(dir,ax,ay,mag);

idxWeak=idxLocMax(mag(idxLocMax)>lowThresh);

e(idxWeak)=l;

idxStrong=[idxStrcng;idxWeak(niag(idxWeak)>highThresh)];

end

if-isempty(idxStrong)

rsirong=rem(idxStrong-i,m)+1;

cstrong=floor((idxStrong-1)/m)+1;

e=bwselect(e,cstrong,rstrong,8);

e=bwmorph(e,'thin',I);

end

imshow(c);

functionidxLocMax=cannyFindLocalMaxima(direction.ix,iy,mag)

[m,n]=size(mag);

idx=find((iy<=0&ix>-iy)|(iy>=0&ix<-iy));

if-isempty(idx)

v=mod(idx,m);

extldx=find(v==l|v==0|idx<=m|(idx>(n-l)*m));

idx(extldx)=[];

end

ixv=ix(idx);

iyv=iy(idx);

gradmag=mag(idx);

d=abs(iyv.Zixv);

gradniag1=mag(idx+m).*(l-d)+mag(idx+m-l).*d;

gradmag2=magCidx-mJ.^CI-d)+

温馨提示

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

评论

0/150

提交评论