图像边缘提取算法源程序文档格式.docx
《图像边缘提取算法源程序文档格式.docx》由会员分享,可在线阅读,更多相关《图像边缘提取算法源程序文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
图像边缘检测是图像处理与计算机视觉共同的基本课题,1960年以来,相继发展了一系列采用梯度算子和拉普拉斯算子的边缘检测技术;
为了降低图像噪声对边缘检测算法的干扰,1980年以来,又建立了高斯低通滤波与拉普拉斯算子复合的过零点检测Marr-Hildreth理论;
在另一个方向上,1980年代初期,Canny从信号处理的角度出发,使边缘检测算法更具有实用性。
本报告主要介绍以上以上几个方面的内容,通过matlab程序实现以上几种算法,对比各种算法的性能。
算法介绍及相应程序
一、基于微分算子的边缘检测
检测图像边缘信息,可以把图像看做曲面,边缘就是图像的变化最剧烈的位置。
这里所讲的边缘信息包含两个方面:
一是边缘的具体位置,即像素的坐标;
而是边缘的方向。
微分算子有两个重要性质:
定域性(或局部性)、敏感性(或无界性)。
敏感性就是说,它对局部的函数值变化很敏感,但是因其对变化过于敏感又有了天然的缺陷——不能抵抗噪声。
局部性意思是指,每一点的导数只与函数在该点邻近的信息有关。
主要有两大类基于微分算子的边缘检测技术:
一阶微分算子边缘检测与二阶微分算子边缘检测。
这些检测技术采用以下的基本步骤:
(1)将相应的微分算子简化为离散的差分格式,进而简化为模板(记为T)。
(2)利用模板对图像f(m,n)进行运算,获得模板作用后的结果Tf(m,n)。
(3)提出阈值h,在采用一阶微分算子情形记录下高于某个阈值h的位置坐标
(而采用二阶微分算子情形,一般是对某个阈值确立
)
(4)对集合进行整理,同时调整阈值h。
Roberts算子
Roberts算子是一种利用局部差分算子寻找边缘的算子,两个模板分别为
则,=
=
算法的步骤为:
(1)首先用两个模板分别对图像作用得到和;
(2)对,进行阈值判决,若大于阈值则相应的点
位于便于边缘处。
对于阈值选取的说明:
由于微分算子的检测性能受阈值的影响较大,为此,针对具体图像我们采用以下阈值的选取方法,对处理后的图像统计大于某一阈值的点,对这些数据求平均值,以下每个程序均采用此方法,不再做说明。
具体程序如下:
%-----filename:
Roberts.m-------------------------
%-----Useage:
edgedetectingbytheRobertsoperator-----
%-----Writer:
Subailong-------------------------
functionedgeRb=Roberts(oimage);
[xlenylen]=size(oimage);
%readthesize
edgeX=zeros(xlen,ylen);
%horizontaldirection
edgeY=zeros(xlen,ylen);
%verticaldirection
edgeXY=zeros(xlen,ylen);
%synthesizethetwodirections
%--------------processtheoringinimagewiththeoperator----------------
fori=1:
xlen-1
forj=1:
ylen-1
edgeX(i,j)=oimage(i,j)-oimage(i+1,j+1);
edgeY(i,j)=oimage(i+1,j)-oimage(i,j+1);
end
end
edgeX=abs(edgeX);
edgeY=abs(edgeY);
edgeXY=sqrt(edgeX.*edgeX+edgeY.*edgeY);
%---------Threshestimate--------------------
rsum=0;
counter=0;
fori=2:
forj=2:
ylen-1
if(edgeXY(i,j)>
15)
rsum=rsum+edgeXY(i,j);
counter=counter+1;
threshold=rsum/counter;
%threshold=2*sum(sum(edgeXY(1:
xlen-1,1:
ylen-1)))/((xlen-1)*(ylen-1));
%-------edgedetecting---------------
if(edgeXY(i,j)>
threshold)
edgeimage(i,j)=255;
else
edgeimage(i,j)=0;
edgeRb=edgeimage;
Sobel算子
Sobel算子采用中心差分,但对中间水平线和垂直线上的四个邻近点赋予略高的权重。
两个模板分别如下:
该算法的处理过程同Roberts算字,在这个程序中,我们采用两个方向分别进行阈值判断,程序如下:
%-----filename:
Sobel.m-------------------------
edgedetectingbytheSobeloperator-----
functionedgeS=Sobel(oimage);
d=zeros(xlen,ylen);
%directionoftheconrespondingpoints
edgeimage=zeros(xlen,ylen);
%theresultimage
H1=[-101;
-202;
-101];
%horizontaloperator
H2=[-1-2-1;
000;
121];
%verticaloperator
xlen
ylen
form=1:
3
forn=1:
updateX=i-m+2;
updateY=j-n+2;
if((updateX>
=1)&
&
(updateX<
=xlen)&
(updateY>
(updateY<
=ylen))
edgeX(i,j)=edgeX(i,j)+H1(m,n)*oimage(updateX,updateY);
%processtheoringinimagewithH1operator
edgeY(i,j)=edgeY(i,j)+H2(m,n)*oimage(updateX,updateY);
ifedgeX(i,j)>
edgeY(i,j)
d(i,j)=1;
%savethedirection
d(i,j)=2;
end
%edgeX=abs(edgeX);
%edgeY=abs(edgeY);
%edgeXY=sqrt(edgeX.*edgeX+edgeY.*edgeY);
if(edgeX(i,j)>
20)
rsum=rsum+edgeX(i,j);
%threshold=4*sum(sum(edgeXY(2:
xlen-1,2:
ylen-1)))/((xlen-2)*(ylen-2));
if(d(i,j)==1&
edgeX(i,j)>
edgeX(i,j+1)&
edgeX(i,j-1)&
edgeimage(i,j)=1;
elseif(d(i,j)==2&
edgeY(i,j)>
edgeY(i+1,j)&
(edgeY(i,j)>
edgeY(i-1,j))&
edgeS=edgeimage;
Prewitt算子
Prewitt算子也属于中心差分类型,但没有给最邻近点较高的权重,两个模板如下:
Prewitt.m-------------------------
edgedetectingbythePrewittoperator-----
functionedgeP=Prewitt(oimage);
edgeimage=zeros(xlen,ylen);
d=zeros(xlen,ylen);
H1=[-10