/************************************************************************* * * \函数名称: * Hysteresis() * * \输入参数: * int *pnMag - 梯度幅度图 * int nWidth - 图象数据宽度 * int nHeight - 图象数据高度 * double dRatioLow - 低阈值和高阈值之间的比例 * double dRatioHigh - 高阈值占图象象素总数的比例 * unsigned char *pUnchEdge - 记录边界点的缓冲区 * * \返回值: * 无 * * \说明: * 本函数实现类似“磁滞现象”的一个功能,也就是,先调用EstimateThreshold * 函数对经过non-maximum处理后的数据pUnchSpr估计一个高阈值,然后判断 * pUnchSpr中可能的边界象素(=128)的梯度是不是大于高阈值nThdHigh,如果比 * 该阈值大,该点将作为一个边界的起点,调用TraceEdge函数,把对应该边界 * 的所有象素找出来。最后,当整个搜索完毕时,如果还有象素没有被标志成 * 边界点,那么就一定不是边界点。 * ************************************************************************* */ void Hysteresis(int *pnMag, int nWidth, int nHeight, double dRatioLow, double dRatioHigh, unsigned char *pUnchEdge) { // 循环控制变量 int y; int x; int nThdHigh ; int nThdLow ; int nPos; // 估计TraceEdge需要的低阈值,以及Hysteresis函数使用的高阈值 EstimateThreshold(pnMag, nWidth, nHeight, &nThdHigh, &nThdLow, pUnchEdge,dRatioHigh, dRatioLow); // 这个循环用来寻找大于nThdHigh的点,这些点被用来当作边界点,然后用 // TraceEdge函数来跟踪该点对应的边界 for(y=0; y<nHeight; y++) { for(x=0; x<nWidth; x++) { nPos = y*nWidth + x ; // 如果该象素是可能的边界点,并且梯度大于高阈值,该象素作为 // 一个边界的起点 if((pUnchEdge[nPos] == 128) && (pnMag[nPos] >= nThdHigh)) { // 设置该点为边界点 pUnchEdge[nPos] = 255; TraceEdge(y, x, nThdLow, pUnchEdge, pnMag, nWidth); } } } // 那些还没有被设置为边界点的象素已经不可能成为边界点 for(y=0; y<nHeight; y++) { for(x=0; x<nWidth; x++) { nPos = y*nWidth + x ; if(pUnchEdge[nPos] != 255) { // 设置为非边界点 pUnchEdge[nPos] = 0 ; } } } }
//利用函数寻找边界起点 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; } } } }