急!急!canny算法,梯度范围的问题?
各位好,我用Canny算法进行边界的提取,我想知道在计算梯度的过程中,梯度的范围是多少?
下面的代码中有这么一句:
// 该数组的大小和梯度值的范围有关,如果采用本程序的算法,那么梯度的范围不会超过pow(2,10)
int nHist[1024] ;
我想问一下,梯度的范围真的是由这个数组的维数决定的么?如果维数是256,那么范围就是0~256,如果维数是1024,范围就是0~1024么?谢谢各位!
/*************************************************************************
*
* \函数名称:
* EstimateThreshold()
*
* \输入参数:
* int *pnMag - 梯度幅度图
* int nWidth - 图象数据宽度
* int nHeight - 图象数据高度
* int *pnThdHigh - 高阈值
* int *pnThdLow - 低阈值
* double dRatioLow - 低阈值和高阈值之间的比例
* double dRatioHigh - 高阈值占图象象素总数的比例
* unsigned char *pUnchEdge - 经过non-maximum处理后的数据
*
* \返回值:
* 无
*
* \说明:
* 经过non-maximum处理后的数据pUnchEdge,统计pnMag的直方图,确定阈值。
* 本函数中只是统计pUnchEdge中可能为边界点的那些象素。然后利用直方图,
* 根据dRatioHigh设置高阈值,存储到pnThdHigh。利用dRationLow和高阈值,
* 设置低阈值,存储到*pnThdLow。dRatioHigh是一种比例:表明梯度小于
* *pnThdHigh的象素数目占象素总数目的比例。dRationLow表明*pnThdHigh
* 和*pnThdLow的比例,这个比例在canny算法的原文里,作者给出了一个区间。
*
*************************************************************************
*/
void EstimateThreshold(int *pnMag, int nWidth, int nHeight, int *pnThdHigh,int *pnThdLow,
unsigned char * pUnchEdge, double dRatioHigh, double dRationLow)
{
// 循环控制变量
int y;
int x;
int k;
// 该数组的大小和梯度值的范围有关,如果采用本程序的算法,那么梯度的范围不会超过pow(2,10)
int nHist[1024] ;
// 可能的边界数目
int nEdgeNb ;
// 最大梯度值
int nMaxMag ;
int nHighCount ;
nMaxMag = 0 ;
// 初始化
for(k=0; k<1024; k++)
{
nHist[k] = 0 ;
}
// 统计直方图,然后利用直方图计算阈值
for(y=0; y<nHeight; y++)
{
for(x=0; x<nWidth; x++)
{
// 只是统计那些可能是边界点,并且还没有处理过的象素
if(pUnchEdge[y*nWidth+x]==128)
{
nHist[ pnMag[y*nWidth+x] ]++;
}
}
}
nEdgeNb = nHist[0] ;
nMaxMag = 0 ;
// 统计经过“非最大值抑止(non-maximum suppression)”后有多少象素
for(k=1; k<1024; k++)
{
if(nHist[k] != 0)
{
// 最大梯度值
nMaxMag = k;
}
// 梯度为0的点是不可能为边界点的
// 经过non-maximum suppression后有多少象素
nEdgeNb += nHist[k];
}
// 梯度比高阈值*pnThdHigh小的象素点总数目
nHighCount = (int)(dRatioHigh * nEdgeNb +0.5);
k = 1;
nEdgeNb = nHist[1];
// 计算高阈值
while( (k<(nMaxMag-1)) && (nEdgeNb < nHighCount) )
{
k++;
nEdgeNb += nHist[k];
}
// 设置高阈值
*pnThdHigh = k ;
// 设置低阈值
*pnThdLow = (int)((*pnThdHigh) * dRationLow+ 0.5);
}