资源描述:
《Canny算法源码》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Canny算法源码/***************************************************************************函数名称:*Canny()**输入参数:*unsignedchar*pUnchImage-图象数据*intnWidth-图象数据宽度*intnHeight-图象数据高度*doublesigma-高斯滤波的标准方差*doubledRatioLow-低阈值和高阈值之间的比例*doubledRatioHigh-高阈值占图象象素总数的比例*unsignedchar*pUnchEdge-canny算子计算后的分割图*
2、*返回值:*无**说明:*canny分割算子,计算的结果保存在pUnchEdge中,逻辑1(255)表示该点为*边界点,逻辑0(0)表示该点为非边界点。该函数的参数sigma,dRatioLow*dRatioHigh,是需要指定的。这些参数会影响分割后边界点数目的多少**************************************************************************/voidCanny(unsignedchar*pUnchImage,intnWidth,intnHeight,doublesigma,doubledRatioLo
3、w,doubledRatioHigh,unsignedchar*pUnchEdge){//经过高斯滤波后的图象数据unsignedchar*pUnchSmooth;//指向x方向导数的指针int*pnGradX;//指向y方向导数的指针int*pnGradY;//梯度的幅度int*pnGradMag;pUnchSmooth=newunsignedchar[nWidth*nHeight];pnGradX=newint[nWidth*nHeight];pnGradY=newint[nWidth*nHeight];pnGradMag=newint[nWidth*nHeight];//
4、对原图象进行滤波GaussianSmooth(pUnchImage,nWidth,nHeight,sigma,pUnchSmooth);//计算方向导数DirGrad(pUnchSmooth,nWidth,nHeight,pnGradX,pnGradY);//计算梯度的幅度GradMagnitude(pnGradX,pnGradY,nWidth,nHeight,pnGradMag);//应用non-maximum抑制NonmaxSuppress(pnGradMag,pnGradX,pnGradY,nWidth,nHeight,pUnchEdge);//应用Hysteresis,
5、找到所有的边界Hysteresis(pnGradMag,nWidth,nHeight,dRatioLow,dRatioHigh,pUnchEdge);//释放内存deletepnGradX;pnGradX=NULL;deletepnGradY;pnGradY=NULL;deletepnGradMag;pnGradMag=NULL;deletepUnchSmooth;pUnchSmooth=NULL;}voidGaussianSmooth(unsignedchar*pUnchImg,intnWidth,intnHeight,doublesigma,unsignedchar*pUn
6、chSmthdImg){//循环控制变量inty;intx;inti;//高斯滤波器的数组长度intnWindowSize;//窗口长度的1/2intnHalfLen;//一维高斯数据滤波器double*pdKernel;//高斯系数与图象数据的点乘doubledDotMul;//高斯滤波系数的总和doubledWeightSum;//中间变量double*pdTmp;//分配内存pdTmp=newdouble[nWidth*nHeight];//产生一维高斯数据滤波器//MakeGauss(sigma,&dKernel,&nWindowSize);MakeGauss(sigm
7、a,&pdKernel,&nWindowSize);//MakeGauss返回窗口的长度,利用此变量计算窗口的半长nHalfLen=nWindowSize/2;//x方向进行滤波for(y=0;y=0&&(i+x)