基于sobel和canny算法的水珠边缘检测.doc

上传人:本田雅阁 文档编号:2548731 上传时间:2019-04-06 格式:DOC 页数:19 大小:958.01KB
返回 下载 相关 举报
基于sobel和canny算法的水珠边缘检测.doc_第1页
第1页 / 共19页
基于sobel和canny算法的水珠边缘检测.doc_第2页
第2页 / 共19页
基于sobel和canny算法的水珠边缘检测.doc_第3页
第3页 / 共19页
基于sobel和canny算法的水珠边缘检测.doc_第4页
第4页 / 共19页
基于sobel和canny算法的水珠边缘检测.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《基于sobel和canny算法的水珠边缘检测.doc》由会员分享,可在线阅读,更多相关《基于sobel和canny算法的水珠边缘检测.doc(19页珍藏版)》请在三一文库上搜索。

1、基于sobel和canny算法的水珠边缘检测李建国,李幸汶,卜祥洲,陈涛(1.河南宏博测控技术有限公司;2.河南工业大学)摘要:水珠识别分析方法是利用数字图像处理及模式识别技术实现,本文简要说明了水珠通过边缘检测实现模式识别和计算的原理。同时,着重讨论了水珠识别过程中的噪声识别算法,详尽地阐述了识别过程中的阈值选取方法。此应用表明了算法的实时性好,可靠性高,能很好地满足工业生产和检测要求,大大提高了水珠识别的自动化与智能化。关键词:水珠识别 边缘检测 边缘轮廓引言图像识别是计算机视觉领域的一个非常活跃的课题。近几年来人们对图像识别做了大量的研究,提出了很多种算法和方法,但电力行业应用的相对较少

2、。传统的图像识别方法已不能满足高精度,高效率的要求。电力输配电企业对绝缘子的憎水性要求较高,因为其憎水性直接决定着绝缘子绝缘性能的好坏,并可以减少高压电击穿和污闪故障的发生。因绝缘子的憎水性变差而导致泄漏电流的增加,大大提高了输配电线路的安全隐患。因此,迫切需要提高绝缘子憎水性能安全检测的手段,实现检测的自动化和智能化。目前,检测系统都是拆卸绝缘子并通过实验室法进行测试,不能实现在线检测。对于在线喷水并通过CCD取像得到的图像,核心功能是水珠识别算法,算法的不同就决定了检测效果有很大的差别。那么,设计一个既快速又稳定的水珠识别算法,对水珠识别来说具有十分重要的意义。本文就是在如何准确提取水珠面

3、积(或轮廓)的思想下,提出的一种新的识别算法。且通过人机交互接口,还可以满足其它行业(如建材或医疗)不同精度和质量级别需求。工作原理其基本工作原理:喷水装置在喷雾过程中,通过取像 CCD(Charge coupled Device)在线拍摄图像数据,图像数据经图像采集卡收集并传入计算机,由系统水珠识别算法设置相应的阈值,检测水珠边缘界线并计算水珠面积和所占用面积比,同时通过水珠的边缘轮廓计算水珠的形状因子。形状因子决定了水珠是否有粘连或流动,而面积反应了水珠的大小。计算这些元素,首先需要得到水珠的外形或形状轮廓,即:水珠边缘的检测。 Sobel(索贝尔)算子: 索贝尔算子(Sobel oper

4、ator)是图像处理中的常用算子之一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。对梯度幅值进行非极大值抑制,若(x,y)像素点的梯度幅值M(x,y)大于或等于沿梯度方向上,即:平行于H(x,y)方向的两个相邻像素点的梯度幅值,则判定该点为可能的边缘点。该算子包含两组3x3的矩阵,分别为横向及纵向运算模板,如果用Sobel算子检测图像的边缘,可以先分别用水平算子和垂直算子对图像进行平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测

5、的图像,其公式如下:=A =A图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小:Gx = (-1)*f(x-1,y-1)+0*f(x,y-1)+1*f(x+1,y-1)+(-2)*f(x-1,y)+0*f(x,y)+2*f(x+1,y)+(-1)*f(x-1,y+1)+0*f(x,y+1)+1*f(x+1,y+1)= f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)-f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)Gy= 1*f(x-1,y-1)+2*f(x,y-1)+1*f(x+1,y-1)+0*f(x-1,y)+0*f(x,y)+0

6、*f(x+1,y)+(-1)*f(x-1,y+1)+(-2)*f(x,y+1)+(-1)*f(x+1,y+1)= f(x-1,y-1)+2*f(x,y-1)+f(x+1,y-1)-f(x-1,y+1)+2*f(x,y+1)+f(x+1,y+1)其中f(a,b),表示图像(a,b)点的灰度值。图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小: 通常,为了提高效率,使用不开方的近似值:如果梯度G大于某一阈值,则认为该点(x,y)为边缘点。可用以下公式计算梯度方向: 上例中,如果角度等于零,即代表图像在该处拥有纵向边缘,左方较右方暗。在边沿检测中,常用的一种模板是Sobel

7、算子。Sobel 算子有两个,一个用来检测水平边沿,另一个用来检测垂直边沿。与“和”相比,Sobel算子对于象素的位置的影响做了加权,因此效果更好。 Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也由一个水平和垂直边沿检测算子组成。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于水珠图像的特殊性,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。 由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数。因为其简单有效,因此

8、应用广泛。美中不足的是Sobel算子并没有将图像的主体与背景严格地区分开来,Sobel算子没有基于图像灰度进行处理,且没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。处理图像的时候关注的是图像与背景不同的部分,并没有把关注点与图像背景区分开来。基于此给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优化的。 Canny算子:拉普拉斯算子是2阶微分算子,相当于求取2次微分,精度比较高,但对噪声过于敏感是它的重大缺点,所以这种算子并不是特别常用。索贝尔(Sobel)算子是最常用的一种一阶算子,方法简单、效果好,但提取出的边缘比较粗,要进行细化处

9、理。坎尼(Canny)算子在使用时,要提供给一些参数用于控制算法的性能。对于不同的图像或不同的边缘提取要求,应该提供不同的参数,以达到最佳效果。它也有模板运算方法,模板的大小也比较大,与提供的参数有关。标准的大小差不多是17*17,可根据算子的可分离性用快速算法,使用标准算子非常慢。坎尼(Canny)算子的2值化也很有特色,具有一定的智能性。RGB图像边缘计算在图像中的方向相同,只有两个边缘具有相同的方向。如果问题只是检测边缘,单独分量方法通常可产生可接受的结果。然而,如果把准确度做为重点,明显需要一个适用于向量梯度的新定义。Canny边缘检测算法一般分为四步:一、 用一个高斯滤波器平滑输入图

10、象;二、 用一阶偏导的有限差分来计算梯度幅值和方向(角度)图像;三、 对梯度幅值图像进行非极大值抑制;四、 用双阈值算法检测和连接边缘。坎尼方法基于三个基本目标:1低错误率。所有边缘都应被找到,并且应该没有伪响应。也就是检测以的边缘必须可能是真实的边缘。2边缘点应被很好地定位。已定位边缘必须尽可能接近真实边缘。也就是由检测标记为边缘的点和真实边缘的中心之间的距离应该最小。3单一的边缘点响应。对于真实的边缘点,检测器仅应返回一个点。也就是真实边缘周围的局部最大数应该是最小的。这意味着在仅存一个单一边缘点的位置,检测器不应指出多个边缘像素。坎尼的工作本质是从数学上表达了上面的三个准则,并试图找到这

11、些表达式的最佳解。通常,寻找一个满足这一目标的、严格形式的解是很困难的(或不可能的)。然而,对由加性高斯白噪声污染的一维台阶边缘使用数字最佳化会得到这样一个结论,即参最佳台阶边缘检测器的一个较好近似是高斯一阶导数:使用一个环形二维高斯函数平滑图像,计算结果的梯度,然后使用幅度和方向来估计每一点处的边缘强度和方向。令表示输入图像, 表示高斯函数:利用和的卷积形成一幅平滑的图像:这一操作源自计算梯度和方向:和 其中,。任何滤波器模板对都可以用来得到和,使用一个大小为的高斯模板来实现, 和与计算出它们的图像尺寸相同的阵列。Canny算法提取的图像边缘基本上可以满足视觉的要求,但达不到单像素级别,尤其

12、是在边缘的拐角点处,多对一响应现象严重。为获得单像素级精细边缘,我们引入数学形态学算法实现对边缘细化处理,本文采用文献的算法。算法的设计基本工作原理:CCD(Charge coupled Device)拍摄的水珠图像数据经采集卡收集并传入计算机,由系统降噪算法识别杂质,经过滤波后去除无关信息。经过边缘检测和连接边缘形成完整的水珠轮廓,分别计算闭合区域面积和周长,得到最大水珠的面积比。2.1 建立憎水性对照表 根据不同的水珠面积和比例,参照相关的周长与形状因子的大小,可以确定介质的憎水性能。所以,在进行测试和计算之前,需要一个对照表。2.2边缘检测实验程序:这是一个图像对象提取方案,分别在水平方

13、向和垂直方向检测边缘。/ Sobel算子/* m_nValues = -1, 0, 1-2, 0, 2-1, 0, 1 */ 检测垂直平边沿C3By3Filter Filter1;Filter1.m_nValues00 = -1;Filter1.m_nValues01 = 0;Filter1.m_nValues02 = 1;Filter1.m_nValues10 = -2;Filter1.m_nValues11 = 0;Filter1.m_nValues12 = 2;Filter1.m_nValues20 = -1;Filter1.m_nValues21 = 0;Filter1.m_nValu

14、es22 = 1;/ 检测水平边沿/* m_nValues = -1,-2,-1 0, 0, 0 1, 2, 1 */C3By3Filter Filter2;Filter2.m_nValues00 = -1;Filter2.m_nValues01 = -2;Filter2.m_nValues02 = -1;Filter2.m_nValues10 = 0;Filter2.m_nValues11 = 0;Filter2.m_nValues12 = 0;Filter2.m_nValues20 = 1;Filter2.m_nValues21 = 2;Filter2.m_nValues22 = 1;/

15、水平算子基于x方向和垂直算子基于y方向,对图像进行平面卷积for (int y=0; bSuccess & yrectSrc.Height(); y+) for (int x=0; bSuccess & xPointInSelection(CPoint(x, y) COLORREF c1 = Filter1.Filter(dibCopy, lpDibBitsSrc, x, y);COLORREF c2 = Filter2.Filter(dibCopy, lpDibBitsSrc, x, y);int r = max(GetRValue(c1), GetRValue(c2);int g = ma

16、x(GetGValue(c1), GetGValue(c2);int b = max(GetBValue(c1), GetBValue(c2);bSuccess = SetPixel(x+rectDest.left, y+rectDest.top, RGB(r, g, b), lpDibBitsDest);CANY检测的函数部分:/一维高斯分布函数,用于平滑函数中生成的高斯滤波系数voidCreatGauss(doublesigma,double*pdKernel,int*pnWidowSize)LONGi; intnCenter;/数组中心点doubledDis; /数组中一点到中心点距离d

17、oubledValue; /中间变量doubledSum = 0;/-3*sigma,3*sigma以内数据,会覆盖绝大部分滤波系数*pnWidowSize=1+2*ceil(3*sigma);nCenter=(*pnWidowSize)/2;*pdKernel=newdouble*pnWidowSize;for(i=0;i(*pnWidowSize);i+) /生成高斯数据dDis=double(i-nCenter);dValue=exp(-(1/2)*dDis*dDis/(sigma*sigma)/(sqrt(2*3.1415926)*sigma);(*pdKernel)i=dValue;

18、dSum+=dValue;for(i=0;i(*pnWidowSize);i+) /归一化(*pdKernel)i/=dSum;/用高斯滤波器平滑原图像voidGaussianSmooth(SIZEsz,LPBYTEpGray,LPBYTEpResult,doublesigma)LONGx,y, i;intnWindowSize; /高斯滤波器长度intnLen; /窗口长度double*pdKernel;/一维高斯滤波器doubledDotMul;/高斯系数与图像数据的点乘doubledWeightSum; /滤波系数总和double*pdTemp;pdTemp=newdoublesz.cx

19、*sz.cy;CreatGauss(sigma,&pdKernel,&nWindowSize); /产生一维高斯数据nLen=nWindowSize/2;for(y=0;ysz.cy;y+)/x方向滤波for(x=0;xsz.cx;x+)dDotMul=0;dWeightSum=0;for(i=(-nLen);i=0&(i+x)sz.cx)/判断是否在图像内部dDotMul+=(double)pGrayy*sz.cx+(i+x)*pdKernelnLen+i;dWeightSum+=pdKernelnLen+i;pdTempy*sz.cx+x=dDotMul/dWeightSum;/y方向滤波

20、for(x=0;xsz.cx;x+)for(y=0;ysz.cy;y+)dDotMul=0;dWeightSum=0;for(i=(-nLen);i=0&(i+y)sz.cy)dDotMul+=(double)pdTemp(y+i)*sz.cx+x*pdKernelnLen+i;dWeightSum+=pdKernelnLen+i;pResulty*sz.cx+x=(unsignedchar)dDotMul/dWeightSum;deletepdKernel;pdKernel=NULL;deletepdTemp;pdTemp=NULL;/方向导数,求梯度voidGrad(SIZEsz,LPBY

21、TEpGray,int*pGradX,int*pGradY,int*pMag)LONGy,x;for(y=1;ysz.cy-1;y+)/x方向的方向导数for(x=1;xsz.cx-1;x+)pGradXy*sz.cx+x= (int)(pGrayy*sz.cx+x+1-pGrayy*sz.cx+x-1);for(x=1;xsz.cx-1;x+)/y方向方向导数for(y=1;ysz.cy-1;y+)pGradYy*sz.cx+x=(int)(pGray(y+1)*sz.cx+xpGray(y-1)*sz.cx+x);doubledSqt1;/中间变量doubledSqt2;for(y=0;y

22、sz.cy;y+)/求梯度for(x=0;xsz.cx;x+)/二阶范数求梯度dSqt1=pGradXy*sz.cx+x*pGradXy*sz.cx+x;dSqt2=pGradYy*sz.cx+x*pGradYy*sz.cx+x;pMagy*sz.cx+x=(int)(sqrt(dSqt1+dSqt2)+0.5);/非最大抑制voidNonmaxSuppress(int*pMag,int*pGradX,int*pGradY,SIZEsz,LPBYTEpNSRst)LONGy,x;intnPos;/梯度分量intgx;intgy;/中间变量intg1,g2,g3,g4;doubleweight;

23、doubledTmp,dTmp1,dTmp2;/设置图像边缘为不可能的分界点for(x=0;xsz.cx;x+)pNSRstx=0;pNSRst(sz.cy-1)*sz.cx+x=0;for(y=0;ysz.cy;y+)pNSRsty*sz.cx=0;pNSRsty*sz.cx+sz.cx-1=0;for(y=1;ysz.cy-1;y+)for(x=1;xabs(gx)/计算插值比例weight=fabs(gx)/fabs(gy);g2=pMagnPos-sz.cx;g4=pMagnPos+sz.cx;/如果x,y两个方向导数的符号相同,C为当前像素,与g1-g4的位置关系为:/ g1g2/C

24、/g4g3if(gx*gy0)g1=pMagnPos-sz.cx-1;g3=pMagnPos+sz.cx+1;/如果x,y两个方向的方向导数方向相反,C是当前像素,与g1-g4的关系为:/g2g1/C/g3g4elseg1=pMagnPos-sz.cx+1;g3=pMagnPos+sz.cx-1;/如果方向导数x分量比y分量大,说明导数的方向趋向于x分量else/插值比例weight=fabs(gy)/fabs(gx);g2=pMagnPos+1;g4=pMagnPos-1;/如果x,y两个方向的方向导数符号相同,当前像素C与g1-g4的关系为/g3/g4Cg2/g1if(gx*gy0)g1=

25、pMagnPos+sz.cx+1;g3=pMagnPos-sz.cx-1;/ 如果x,y两个方向导数的方向相反,C与g1-g4的关系为/g1/g4Cg2/g3elseg1=pMagnPos-sz.cx+1;g3=pMagnPos+sz.cx-1;/利用g1-g4对梯度进行插值dTmp1=weight*g1+(1-weight)*g2;dTmp2=weight*g3+(1-weight)*g4;/当前像素的梯度是局部的最大值,该点可能是边界点if(dTmp=dTmp1&dTmp=dTmp2) pNSRstnPos=128;else pNSRstnPos=0;/不可能是边界点/统计pMag的直方图

26、,判定阈值voidEstimateThreshold(int*pMag,SIZEsz,int*pThrHigh,int*pThrLow,LPBYTEpGray,doubledRatHigh,doubledRatLow)LONGy,x,k;/该数组的大小和梯度值的范围有关,如果采用本程序的算法/那么梯度的范围不会超过pow(2,10)intnHist256;/可能边界数intnEdgeNum;/最大梯度数intnMaxMag;intnHighCount;nMaxMag=0;/初始化for(k=0;k256;k+)nHistk=0;/统计直方图,利用直方图计算阈值for(y=0;ysz.cy;y+

27、)for(x=0;xsz.cx;x+)if(pGrayy*sz.cx+x=128)nHistpMagy*sz.cx+x+;nEdgeNum=nHist0;nMaxMag=0;/统计经过“非最大值抑制”后有多少像素for(k=1;k256;k+)if(nHistk!=0)nMaxMag=k;/梯度为0的点是不可能为边界点的经过non-maximumsuppression后有多少像素nEdgeNum+=nHistk;/梯度比高阈值*pThrHigh小的像素点总书目nHighCount=(int)(dRatHigh*nEdgeNum+0.5);k=1;nEdgeNum=nHist1;/计算高阈值wh

28、ile(k(nMaxMag-1)&(nEdgeNumnHighCount)k+;nEdgeNum+=nHistk;*pThrHigh=k;/低阈值*pThrLow=(int)(*pThrHigh)*dRatLow+0.5);/利用函数寻找边界起点voidHysteresis(int*pMag,SIZEsz,doubledRatLow,doubledRatHigh,LPBYTEpResult)LONGy,x;intnThrHigh,nThrLow;intnPos;/估计TraceEdge函数需要的低阈值,以及Hysteresis函数使用的高阈值EstimateThreshold(pMag,sz,

29、&nThrHigh,&nThrLow,pResult,dRatHigh,dRatLow);/寻找大于dThrHigh的点,这些点用来当作边界点,然后用TraceEdge函数跟踪该点对应的边界for(y=0;ysz.cy;y+)for(x=0;x=nThrHigh)pResultnPos=255; /设置该点为边界点TraceEdge(y,x,nThrLow,pResult,pMag,sz);for(y=0;ysz.cy;y+)/其他点已经不可能为边界点for(x=0;xsz.cx;x+)nPos=y*sz.cx+x;if(pResultnPos!=255)pResultnPos=0;/*根据H

30、ysteresis执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的一条边界的所有边界点,函数采用了递归算法。从(x,y)坐标出发,进行边界点的跟踪,跟踪只考虑pResult中没有处理并且可能是边界点的像素(=128),像素值为0表明该点不可能是边界点,像素值为255表明该点已经是边界点*/voidTraceEdge(inty,intx,intnThrLow,LPBYTEpResult,int*pMag,SIZEsz)intxNum8=1,1,0,-1,-1,-1,0,1;/对8邻域像素进行查询intyNum8=0,1,1,1,0,-1,-1,-1;LONGyy,xx,k;

31、for(k=0;k=nThrLow)pResultyy*sz.cx+xx=255;/该点设为边界点,以该点为中心再进行跟踪TraceEdge(yy,xx,nThrLow,pResult,pMag,sz);/Canny算子voidCanny(LPBYTEpGray,SIZEsz,doublesigma,doubledRatLow,doubledRatHigh,LPBYTEpResult)/经过高斯滤波后的图像LPBYTEpGaussSmooth;pGaussSmooth=newunsignedcharsz.cx*sz.cy; /x方向导数的指针int*pGradX;pGradX=newintsz

32、.cx*sz.cy;/y方向int*pGradY;pGradY=newintsz.cx*sz.cy;/梯度的幅度int*pGradMag;pGradMag=newintsz.cx*sz.cy;/对原图高斯滤波GaussianSmooth(sz,pGray,pGaussSmooth,sigma);/计算方向导数和梯度的幅度Grad(sz,pGaussSmooth,pGradX,pGradY,pGradMag);/应用非最大抑制NonmaxSuppress(pGradMag,pGradX,pGradY,sz,pResult);/应用Hysteresis,找到所有边界Hysteresis(pGrad

33、Mag,sz,dRatLow,dRatHigh,pResult);deletepGradX;pGradX=NULL;deletepGradY;pGradY=NULL;deletepGradMag;pGradMag=NULL;deletepGaussSmooth;pGaussSmooth=NULL;voidOnCanny()if(!m_fOpenFile)return;m_fDone=TRUE;RGBToGray(szImg,aRGB,aGray,BPP);Canny(aGray,szImg,0.1,0.9,0.76,aBinImg);ShowGrayImage(l,szImg,aBinImg)

34、;演示图像:Sobel边缘检测后的图像Canny边缘检测后的图像 根据上图对照,明显可以得出canny 检测比sobel检测的效果更好。三、结束语1、sobel算子根据像素点上下、左右邻点灰度值加权值,在边缘处打到极大值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,但是边缘定位精度不够高。当对精度要求不是很高的时候,是一种较为常用的边缘检测方法。2、canny算子是边缘检测中最具有代表的一种局部极值边缘检测。无论从视觉效果还是客观评价来看,canny算子提取的边缘线性连接程度较好,对此类边缘提取比较完整,边缘线很细腻。参考文献1 数字图像处理第三版中文版(Rafael C.

35、Ganzalez), 2014.04(7)2 吴术路,WUShu-lu.基于Sobel算子图像边缘检测的MATLAB实现,2010,06(19)3 王瀚闻,基于索贝尔算子的高分辨率遥感影像分割技术研究,内蒙古大学生命科学学院2000年,1674-098X(2012)08(a)-0018-014MaIIatS,ZhongS. Characterization of SignaIs from MuItiscaIe EdgesJ.IEEE Trans on PAMI,1992,14(7):710-7325 MeerP,Georgescu B. Edge Detection with Embedded ConfidenceJ.IEEE Trans on PAMI,2001,23(120):1351-1365.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1