{
N[i*nWidthj]=0;//设置为非边界点
}
}
}
其中TraceEdge函数为一个嵌套函数,用于在每个像素点的邻域内寻找满足条件的点。其实现代码如下:
voidTraceEdge(inty,intx,intnThrLow,LPBYTEpResult,int*pMag,SIZEsz)
{
//对8邻域像素进行查询
intxNum[8]={1,1,0,-1,-1,-1,0,1};
intyNum[8]={0,1,1,1,0,-1,-1,-1};
LONGyy,xx,k;
for(k=0;k<8;k)
{
yy=yyNum[k];
xx=xxNum[k];
if(pResult[yy*sz.cxxx]==128&&pMag[yy*sz.cxxx]>=nThrLow)
{
//该点设为边界点
pResult[yy*sz.cxxx]=255;
//以该点为中心再进行跟踪
TraceEdge(yy,xx,nThrLow,pResult,pMag,sz);
}
}
}
以上就从原理上实现了整个Canny算法。其检测效果如图4所示。注意:以上代码仅为作者理解所为,目的是验证本人对算法的理解,暂时没有考虑到代码的执行效率的问题。
对比图4和图5可以发现,作者自己实现的边缘检测效果没有OpenCV的好,具体体现在:1)丢失了一些真的边缘;2)增加了一些假的边缘。
经过对整个算法的来回检查,初步推断主要的问题可能在于在进行灰度矩阵梯度幅计算式所采用的模板算子性能不是太好,还有就是关于两个阈的选取方法。关于这两个方面的改进研究,后文阐述。
本文是过去一段时间,对图像边缘检测方法学习的总结。主要阐述了Canny算法的工作原理,实现过程,在此基础上基于VC6.0实现了该算法,并给出了效果图。最后,通过对比发现本文的实现方法虽然能够实现边缘检测,但效果还不是很理想,今后将在阈选取原则和梯度幅算子两个方面进行改进。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33926-10.html
你知道美国在我周边煽动别国闹事
美国的军事力量是强大
中国不好战