}
}
intnHist[1024];
intnEdgeNum;//可能边界数
intnMaxMag=0;//最大梯度数
intnHighCount;
2)构造灰度图的统计直方图,根据上文梯度幅的计算公式可知,最大的梯度幅为:
for(i=0;i<1024;i)
nHist[i]=0;
for(i=0;i<nHeight;i)
{
for(j=0;j<nWidth;j)
{
if(N[i*nWidthj]==128)
nHist[M[i*nWidthj]];
}
}
3)获取最大梯度幅及潜在边缘点个数
nEdgeNum=nHist[0];
nMaxMag=0;//获取最大的梯度
for(i=1;i<1024;i)//统计经过“非最大抑制”后有多少像素
{
if(nHist[i]!=0)//梯度为0的点是不可能为边界点的
{
nMaxMag=i;
}
nEdgeNum=nHist[i];//经过non-maximumsuppression后有多少像素
}
4)计算两个阈
doubledRatHigh=0.79;
doubledThrHigh;
doubledThrLow;
doubledRatLow=0.5;
nHighCount=(int)(dRatHigh*nEdgeNum0.5);
j=1;
nEdgeNum=nHist[1];
while((j<(nMaxMag-1))&&(nEdgeNum<nHighCount))
{
j;
nEdgeNum=nHist[j];
}
dThrHigh=j;//高阈
dThrLow=(int)((dThrHigh)*dRatLow0.5);//低阈
这段代码的意思是,按照灰度从低到高的顺序,选取前79%个灰度中的最大的灰度为高阈,低阈大约为高阈的一半。这是根据经验数据的来的,至于更好地参数选取方法,作者后面会另文研究。
5)进行边缘检测
SIZEsz;
sz.cx=nWidth;
sz.cy=nHeight;
for(i=0;i<nHeight;i)
{
for(j=0;j<nWidth;j)
{
if((N[i*nWidthj]==128)&&(M[i*nWidthj]>=dThrHigh))
{
N[i*nWidthj]=255;
TraceEdge(i,j,dThrLow,N,M,sz);
}
}
}
以上代码在非极大抑制产生的二灰度矩阵的潜在点中按照高阈寻找边缘,并以所找到的点为中心寻找邻域内满足低阈的点,从而形成一个闭合的轮廓。然后对于不满足条件的点,可用如下代码直接删除掉。
//将还没有设置为边界的点设置为非边界点
for(i=0;i<nHeight;i)
{
for(j=0;j<nWidth;j)
{
if(N[i*nWidthj]!=255)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33926-9.html
人家根本不在乎你反不反
首先要热爱自己的祖国
我本人也喝过很多黑芝麻糊