Example #1
0
/*************************************************************************
*
* \函数名称:
*   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 ;
			}
		}
	}
}
Example #2
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;
   }
  }
 }
}