资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
图像处理中各种边缘检测的微分算子简单比较 (Sobel, Robert,Prewitt, Laplacian, Canny)不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明 的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间 的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可 能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维 到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可 避免的重要因素。正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级 难题,目前研究者正在试图在边缘提取中加入高层的语义信息。在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导 数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以 上的导数信息往往失去了应用价值。二阶导数还可以说明灰度突变的类型。在有些情况下, 如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的 信息。二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声, 再进行边缘检测。不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数 比较少,有利于后继的处理和识别工作。 各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用 的一种计算单位;Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割oRoberts 边缘检测算子是一种利用局部差分算子寻找边缘的算子Robert算子图像处理后结果边缘不 是很平滑。经分析,由于 Robert 算子通常会在图像边缘附近的区域内产生较宽的响应,故 采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。Prewitt 算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。Sobel 算子: Sobel 算子和 Prewitt 算子都是加权平均,但是 Sobel 算子认为,邻域的像素对 当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的 影响也不同。一般来说,距离越远,产生的影响越小。Isotropic Sobel 算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测 边缘时梯度幅度一致,就是通常所说的各向同性。在边沿检测中,常用的一种模板是Sobel算子。Sobel算子有两个,一个是检测水平边沿的; 另一个是检测垂直平边沿的。Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子, 也有两个,一个是检测水平边沿的,另一个是检测垂直平边沿的。各向同性Sobel算子和 普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一 致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方 向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效, 因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换 言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉 生理特征,所以提取的图像轮廓有时并不能令人满意。 在观测一幅图像的时候,我们往往 首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可 以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优 的。上面的算子是利用一阶导数的信息,属于梯度算子范畴。Laplacian 算子:这是二阶微分算子。其具有各向同性,即与坐标轴方向无关,坐标轴旋转 后梯度结果不变。但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处 理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生 成一个新的模板。Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算 子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果; 最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利 用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面; 一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算, 利用 LoG 卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普 拉斯是一样的。所以在 LoG 公式中使用高斯函数的目的就是对图像进行平滑处理,使用 Laplacian 算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪 声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影 响。微分算子在图像处理中扮演重要的角色,其算法实现简单,而且边缘检测的效果又较好,因 此这些基本的微分算子是学习图像处理过程中的必备方法,下面着重讨论几种常见的微分算 子。1.Sobel 其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度 的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel 算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征, 所以提取的图像轮廓有时并不能令人满意,算法具体实现很简单,就是3*3的两个不同方向 上的模板运算,这里不再写出。2. Robert 算子根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素只差3. Prewitt 算子该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经 验得知Sobel要比Prewitt更能准确检测图像边缘。4. Laplacian 算子 拉普拉斯算子是一种二阶微分算子,若只考虑边缘点的位置而不考虑周围的灰度差时可用该算子进行检测。对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁的像 素的二阶导数异号。5. Canny 算子该算子功能比前面几种都要好,但是它实现起来较为麻烦, Canny 算子是一个具有滤波,增 强,检测的多阶段的优化算子,在进行处理前, Canny 算子先利用高斯平滑滤波器来平滑图 像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过 程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连 接边缘。下面算法是基于的算法不可能直接运行,只是我把Canny的具体实现步骤写了出来,若需 用还要自己写。该算子具体实现方法:/ anny.cpp: implementation of the Canny class./#include anny.h#include math.h/#include algorithms.h/#include algorithm.h#include stdlib.h/#include maths.h/using namespace std;/ Construction/Destruction/Canny:Canny(intPicHeight,intPicWidth,double*PicData,doublePicSigma,double PicRatioLow,double PicRatioHigh)iHeight=PicHeight; iWidth=PicWidth; iData=PicData; sigma=PicSigma; dRatioLow=PicRatioLow;dRatioHigh=PicRatioHigh;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; 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;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;/模板与对应像素点的卷积和double dWeightSum;/模板的权值累加和double *dTemp;/开辟空间/记录图像数据的中间变量dTemp=new double *iHeight;for(i=0;iiHeight;i+)dTempi=new doubleiWidth; /获得模板长度和模板的各个权值 MakeGauss(&pdKernel,&iWindowSize);/得到模板的一半长度iHalfLen=iWindowSize/2;/对图像对水方向根据模板进
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号