canny算子代码教学讲义

上传人:yulij****0329 文档编号:127334554 上传时间:2020-04-01 格式:DOC 页数:10 大小:51.50KB
返回 下载 相关 举报
canny算子代码教学讲义_第1页
第1页 / 共10页
canny算子代码教学讲义_第2页
第2页 / 共10页
canny算子代码教学讲义_第3页
第3页 / 共10页
canny算子代码教学讲义_第4页
第4页 / 共10页
canny算子代码教学讲义_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《canny算子代码教学讲义》由会员分享,可在线阅读,更多相关《canny算子代码教学讲义(10页珍藏版)》请在金锄头文库上搜索。

1、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 pNSRs

2、t); 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(

3、LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult); #include afx.h #include math.h #include canny.h / 一维高斯分布函数,用于平滑函数中生成的高斯滤波系数 void CreateGauss(double sigma, double *pdKernel, int *pnWidowSize) LONG i; /数组中心点 int nCenter; /数组中一点到中心点距离 double dDis; /中间变量 double dVa

4、lue; 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); (

5、*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; /滤波系数总

6、和 double dWeightSum; double *pdTemp; pdTemp = new doublesz.cx*sz.cy; /产生一维高斯数据 CreatGauss(sigma, &pdKernel, &nWindowSize); nLen = nWindowSize/2; /x方向滤波 for(y=0;y sz.cy;y+) for(x=0;x sz.cx;x+) dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i =0 & (i+x) sz.cx) dDotMul+=(double)pGrayy*sz.cx+(i+x) * pdKerne

7、lnLen+i; dWeightSum += pdKernelnLen+i; pdTempy*sz.cx+x = dDotMul/dWeightSum; /y方向滤波 for(x=0; x sz.cx;x+) for(y=0; y sz.cy; y+) dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i =0 & (i+y) sz.cy) dDotMul += (double)pdTemp(y+i)*sz.cx+x*pdKernelnLen+i; dWeightSum += pdKernelnLen+i; pResulty*sz.cx+x = (unsig

8、ned char)dDotMul/dWeightSum; delete pdKernel; pdKernel = NULL; delete pdTemp; pdTemp = NULL; / 方向导数,求梯度 void Grad(SIZE sz, LPBYTE pGray, int *pGradX, int *pGradY, int *pMag) LONG y,x; /x方向的方向导数 for(y=1;y sz.cy-1;y+) for(x=1;x sz.cx-1;x+) pGradXy*sz.cx +x = (int)( pGrayy*sz.cx+x+1-pGrayy*sz.cx+ x-1 )

9、; /y方向方向导数 for(x=1;x sz.cx-1;x+) for(y=1;y sz.cy-1;y+) pGradYy*sz.cx +x = (int)(pGray(y+1)*sz.cx +x - pGray(y-1)*sz.cx +x); /求梯度 /中间变量 double dSqt1; double dSqt2; for(y=0; y sz.cy; y+) for(x=0; x sz.cx; x+) /二阶范数求梯度 dSqt1 = pGradXy*sz.cx + x*pGradXy*sz.cx + x; dSqt2 = pGradYy*sz.cx + x*pGradYy*sz.cx

10、 + x; pMagy*sz.cx+x = (int)(sqrt(dSqt1+dSqt2)+0.5); /非最大抑制 void NonmaxSuppress(int *pMag, int *pGradX, int *pGradY, SIZE sz, LPBYTE pNSRst) LONG y,x; int nPos; /梯度分量 int gx; int gy; /中间变量 int g1,g2,g3,g4; double weight; double dTmp,dTmp1,dTmp2; /设置图像边缘为不可能的分界点 for(x=0;x sz.cx;x+) pNSRstx = 0; pNSRst

11、(sz.cy-1)*sz.cx+x = 0; for(y=0;y sz.cy;y+) pNSRsty*sz.cx = 0; pNSRsty*sz.cx + sz.cx-1 = 0; for(y=1;y sz.cy-1;y+) for(x=1;x abs(gx) /计算插值比例 weight = fabs(gx)/fabs(gy); g2 = pMagnPos-sz.cx; g4 = pMagnPos+sz.cx; /如果x,y两个方向导数的符号相同 /C 为当前像素,与g1-g4 的位置关系为: /g1 g2 / C / g4 g3 if(gx*gy0) g1 = pMagnPos-sz.cx-1; g3 = pMagnPos+sz.cx+1; /如果x,y两个方向的方向导数方向相反 /C是当前像素,与g1-g4的关系为: / g2 g1 / C / g3 g4 else g1 = pMagnPos-sz.cx+1; g3 = pMagnPos+sz.cx-1; /如果方向导数x分量比y分量大,说明导数的方向趋向于x分量 else /插值比例 weight = fabs(gy)/fabs(gx); g2 = pMagnPos+1; g4 = pMagnPos-1; /如果x,y两个方向的方向导数符号相同 /当前

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号