{ nHist[k] = 0; } //统计直方图,利用直方图计算阈值 for(y=0;y<sz.cy;y++) { for(x=0;x<sz.cx;x++) { if(pGray[y*sz.cx+x]==128) { nHist[pMag[y*sz.cx+x]]++; } } }
nEdgeNum = nHist[0]; nMaxMag = 0;
//统计经过“非最大值抑制”后有多少像素 for(k=1;k<256;k++) { if(nHist[k] != 0) { nMaxMag = k; }
//梯度为0的点是不可能为边界点的 //经过non-maximum suppression后有多少像素 nEdgeNum += nHist[k];
}
//梯度比高阈值*pThrHigh 小的像素点总书目 nHighCount = (int)(dRatHigh * nEdgeNum + 0.5);
k=1; nEdgeNum = nHist[1];
//计算高阈值 while((k<(nMaxMag-1)) && (nEdgeNum < nHighCount)) { k++; nEdgeNum += nHist[k]; }
*pThrHigh = k;
//低阈值 *pThrLow = (int)((*pThrHigh) * dRatLow + 0.5);
}
//利用函数寻找边界起点 void Hysteresis(int *pMag, SIZE sz, double dRatLow, double dRatHigh, LPBYTE pResult) { LONG y,x;
int nThrHigh,nThrLow;
int nPos; //估计TraceEdge 函数需要的低阈值,以及Hysteresis函数使用的高阈值 EstimateThreshold(pMag, sz,&nThrHigh,&nThrLow,pResult,dRatHigh,dRatLow);
//寻找大于dThrHigh的点,这些点用来当作边界点, //然后用TraceEdge函数跟踪该点对应的边界 for(y=0;y<sz.cy;y++) { for(x=0;x<sz.cx;x++) { nPos = y*sz.cx + x;
//如果该像素是可能的边界点,并且梯度大于高阈值, //该像素作为一个边界的起点 if((pResult[nPos]==128) && (pMag[nPos] >= nThrHigh)) { //设置该点为边界点 pResult[nPos] = 255; TraceEdge(y,x,nThrLow,pResult,pMag,sz); }
} }
//其他点已经不可能为边界点 for(y=0;y<sz.cy;y++) { for(x=0;x<sz.cx;x++) { nPos = y*sz.cx + x;
if(pResult[nPos] != 255) { pResult[nPos] = 0; } } } }
//根据Hysteresis 执行的结果,从一个像素点开始搜索,搜索以该像素点为边界起点的一条边界的
上一篇:微软靠卖软件赚钱,Google OS靠什么赚钱
下一篇:05年的经典语录之计算机科学
|