ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:20.99KB ,
资源ID:3664916      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3664916.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(边缘检测算法.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

边缘检测算法.docx

1、边缘检测算法图像处理中各种边缘检测的微分算子简单比较 (Sobel,Robert, Prewitt,Laplacian,Canny)不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中

2、的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。各种算子的存在就是对这种

3、导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位;Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。Sobel算子:Sobel算子和

4、Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。在边沿检测中,常用的一种模板是Sobel算子。Sobel算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的 。Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的 。

5、各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。 由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。在观测一幅图像的时候,我们往往首先注意的是图

6、像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。上面的算子是利用一阶导数的信息,属于梯度算子范畴。Laplacian算子:这是二阶微分算子。其具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;

7、同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影

8、响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。微分算子在图像处理中扮演重要的角色,其算法实现简单,而且边缘检测的效果又较好,因此这些基本的微分算子是学习图像处理过程中的必备方法,下面着重讨论几种常见的微分算子。1.Sobel其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意,算法具体实现很简单,就是3*3的两个不同方向上

9、的模板运算,这里不再写出。2.Robert算子根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素只差3.Prewitt算子 该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。4.Laplacian算子 拉普拉斯算子是一种二阶微分算子,若只考虑边缘点的位置而不考虑周围的灰度差时可用该算子进行检测。对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁的像素的二阶导数异号。5.Canny算子该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强

10、,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。下面算法是基于的算法不可能直接运行,只是我把Canny的具体实现步骤写了出来,若需用还要自己写。该算子具体实现方法:/ anny.cpp: implementation of the Canny class./#include anny.h#include math.h/#include algorithms.h/#include al

11、gorithm.h#include stdlib.h/#include maths.h/using namespace std;/ Construction/Destruction/Canny:Canny(int PicHeight,int PicWidth,double * PicData,double PicSigma,double PicRatioLow,double PicRatioHigh)iHeight=PicHeight;iWidth=PicWidth;iData=PicData;sigma=PicSigma;dRatioLow=PicRatioLow;dRatioHigh=Pi

12、cRatioHigh;Canny:Canny()void Canny:CannyArith(int *iEdgePoint)int i;int *iGradX ; / 指向x方向导数的指针 int *iGradY ; / 指向y方向导数的指针 int *iExtent ; / 梯度的幅度iGradX=new int *iHeight;for(i=0;iiHeight;i+)iGradXi=new intiWidth;iGradY=new int *iHeight;for(i=0;iiHeight;i+)iGradYi=new intiWidth;iExtent=new int *iHeight

13、;for(i=0;iiHeight;i+)iExtenti=new intiWidth;/ 对原图象进行滤波 GaussionSmooth();/计算X,Y方向上的方向导数 DirGrad(iGradX,iGradY); / 计算梯度的幅度 GradExtent(iGradX,iGradY,iExtent); / 应用non-maximum 抑制 NonMaxSuppress(iExtent,iGradX,iGradY,iEdgePoint);/ 应用Hysteresis,找到所有的边界 Hysteresis(iExtent,iEdgePoint);/ 释放内存for(i=0;iiHeight

14、;i+) delete *(iGradX+i); delete iGradX;for(i=0;iiHeight;i+) delete *(iGradY+i); delete iGradY;for(i=0;iiHeight;i+) delete *(iExtent+i); delete iExtent;void Canny:GaussionSmooth()int i,j,k; /循环变量int iWindowSize; /记录模板大小的变量int iHalfLen; /模板大小的一半double *pdKernel; /模板各点的权值double dDotMul; /模板与对应像素点的卷积和do

15、uble dWeightSum; /模板的权值累加和double *dTemp; /记录图像数据的中间变量/开辟空间dTemp=new double *iHeight;for(i=0;iiHeight;i+)dTempi=new doubleiWidth;/获得模板长度和模板的各个权值MakeGauss(&pdKernel,&iWindowSize);/得到模板的一半长度iHalfLen=iWindowSize/2;/对图像对水方向根据模板进行平滑for(i=0;iiHeight;i+)for(j=0;jiWidth;j+)dDotMul=0;dWeightSum=0;for(k=(-iHal

16、fLen);k=0)&(k+jiWidth)dDotMul+=iDataij+k*pdKernelk+iHalfLen;dWeightSum+=pdKernelk+iHalfLen;dTempij=dDotMul/dWeightSum;/对图像垂直方向上根据模板的转置进行平滑(注意图像数据是在水平平滑之后进行的)for(i=0;iiWidth;i+)for(j=0;jiHeight;j+)dDotMul=0;dWeightSum=0;for(k=(-iHalfLen);k=0)&(k+jiHeight)dDotMul+=dTempj+ki*pdKernelk+iHalfLen;dWeightS

17、um+=pdKernelk+iHalfLen;iDataji=dDotMul/dWeightSum;/空间释放 delete pdKernel;pdKernel=NULL;for(i=0;iiHeight;i+) delete *(dTemp+i); delete dTemp;void Canny:MakeGauss(double *pdKernel,int *iWindowSize)int i; /循环变量int nCenter; /确定高斯模板的一半长度double dDistance; /一维高斯模板各点离中心点的距离double PI=3.1415926; /圆周率double dVa

18、lue; /中间变量,记录高斯模板各点的权值(未经归一化)double dSum=0; /中间变量,记录高斯模板各点权值的总和*iWindowSize=int(1+2*int(3*sigma+0.5); /确定一维高斯模板长度,根据概率论的知识,选取-3*sigma, 3*sigma以内的数据。nCenter=(*iWindowSize)/2; /得到一半长度*pdKernel=new double*iWindowSize;/开辟记录各点权值的空间/利用高斯分布函数(正太分布)确定各点的权值,主要是根据高斯分布离中心点的距离越远,所取的值就越小,这与图像有些/相似,离中心点越远,对中心点的影响

19、就越小。for(i=0;i(*iWindowSize);i+)dDistance=double(i-nCenter);/高斯分布函数求值dValue=exp(-1/2)*dDistance*dDistance/(sigma*sigma)/(sqrt(2*PI)*sigma);(*pdKernel)i=dValue;dSum+=dValue;/归一化(因为要不改变原图像的灰度区域,就必须保证各权值之和为1for(i=0;i(*iWindowSize);i+)(*pdKernel)i /= dSum;void Canny:DirGrad(int *iGradX,int *iGradY)int i,

20、j,temp1,temp2;/水平方向的方向导数(下面都是用min和max对边界值做了相应的处理)for(i=0;iiHeight;i+)for(j=0;jiWidth;j+)if(iWidth-1j+1)temp1=iWidth-1;elsetemp1=j+1;if(0j-1)temp2=j-1;elsetemp2=0;iGradXij=int(iDataitemp1-iDataitemp2);/垂直方向的方向导数for(i=0;iiWidth;i+)for(j=0;jiHeight;j+)if(iHeight-1j+1)temp1=iHeight-1;elsetemp1=j+1;if(0j

21、-1)temp2=j-1;elsetemp2=0;iGradYji=int(iDatatemp1i-iDatatemp2i);void Canny:GradExtent(int *iGradX,int *iGradY,int *iExtent)int i,j;double iTemp1,iTemp2;for(i=0;iiHeight;i+)for(j=0;jiWidth;j+)iTemp1=iGradXij*iGradXij;iTemp2=iGradYij*iGradYij;iExtentij=int(sqrt(iTemp1+iTemp2)+0.5);void Canny:NonMaxSupp

22、ress(int *iExtent,int *iGradX,int *iGradY,int *dUnchRst)int i,j;int gx,gy; /记录像素点X,Y 方向的方向导数值int g1,g2,g3,g4; /各个领域的梯度值double weight; /比重double dTemp1,dTemp2,dTemp; /中间变量/处理边缘值(边缘点不可能是边界点for(i=0;iiHeight;i+)dUnchRsti0=0;dUnchRstiiWidth-1=0;for(j=0;jiWidth;j+)dUnchRst0j=0;dUnchRstiHeight-1j=0;/标记有可能是

23、边界点的像素点for(i=1;iiHeight-1;i+)for(j=1;jabs(gx) weight=double(abs(gx)/abs(gy); g2=iExtenti-1j; g4=iExtenti+1j; if(gx*gy0) g1=iExtenti-1j-1; g3=iExtenti+1j+1; else g1=iExtenti-1j+1; g3=iExtenti+1j-1; elseweight=double(abs(gy)/abs(gx);g2=iExtentij+1;g4=iExtentij-1;if(gx*gy0)g1=iExtenti+1j+1;g3=iExtenti-

24、1j-1;elseg1=iExtenti-1j+1;g3=iExtenti+1j-1;dTemp1=weight*g1+(1-weight)*g2;dTemp2=weight*g3+(1-weight)*g4;/当大于的时候就有可能是边界点if(dTemp=dTemp1&dTemp=dTemp2)dUnchRstij = 128 ;elsedUnchRstij=0 ;void Canny:Hysteresis(int *iExtent,int *iEdgePoint)int i,j;int iThreHigh;int iThreLow;SetThreshold(iExtent,&iThreHigh,&iThreLow,iEdgePoint);for(i=0;iiHeight;i+)for(j=0;jiWidth;j+)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1