canny边缘检测算子的c源代码.docVIP

  • 8
  • 0
  • 约8.19千字
  • 约 13页
  • 2017-08-28 发布于重庆
  • 举报
canny边缘检测算子的c源代码

canny边缘检测算子的c源代码canny算子代码 void CreatGauss(double sigma, double **pdKernel, int *pnWidowSize); void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma); void Grad(SIZE sz, LPBYTE pGray, int *pGradX, int *pGradY, int *pMag); void NonmaxSuppress(int *pMag, int *pGradX, int *pGradY, SIZE sz, LPBYTE pNSRst); void EstimateThreshold(int *pMag, SIZE sz, int *pThrHigh, int *pThrLow, LPBYTE pGray, double dRatHigh, double dRatLow); void Hysteresis(int *pMag, SIZE sz, double dRatLow, double dRatHigh, LPBYTE pResult); void TraceEdge(int y, int x, int nThrLow, LPBYTE pResult, int *pMag, SIZE sz); void Canny(LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult); #include afx.h #include math.h #include canny.h // 一维高斯分布函数,用于平滑函数中生成的高斯滤波系数 void CreatGauss(double sigma, double **pdKernel, int *pnWidowSize) { LONG i; //数组中心点 int nCenter; //数组中一点到中心点距离 double dDis; //中间变量 double dValue; double dSum; dSum = 0; // [-3*sigma,3*sigma] 以内数据,会覆盖绝大部分滤波系数 *pnWidowSize = 1+ 2*ceil(3*sigma); nCenter = (*pnWidowSize)/2; *pdKernel = new double[*pnWidowSize]; //生成高斯数据 for(i=0;i(*pnWidowSize);i++) { dDis = double(i - nCenter); dValue = exp(-(1/2)*dDis*dDis/(sigma*sigma))/(sqrt(2*3.1415926)*sigma); (*pdKernel)[i] = dValue; dSum+=dValue; } //归一化 for(i=0;i(*pnWidowSize);i++) { (*pdKernel)[i]/=dSum; } } //用高斯滤波器平滑原图像 void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma) { LONG x, y; LONG i; //高斯滤波器长度 int nWindowSize; //窗口长度 int nLen; //一维高斯滤波器 double *pdKernel; //高斯系数与图像数据的点乘 double dDotMul; //滤波系数总和 double dWeightSum; double *pdTemp; pdTemp = new double[sz.cx*sz.cy]; //产生一维高斯数据 CreatGauss(sigma, pdKernel, nWindowSize); nLen = nWindowSize/2; //x方向滤波 for(y=0;ysz.cy;y++) { for(x=0;xsz.cx;x++) { dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i=nLen;i++) { //判断是否在图像内部 if((i+x)=0 (i+x)sz.cx) { dDotMul+=(double)pGray[y*sz.cx+(i+x)] * pdKernel

文档评论(0)

1亿VIP精品文档

相关文档