Filter2.m_nValues[1][0] = 0; Filter2.m_nValues[1][1] = 0; Filter2.m_nValues[1][2] = 0; Filter2.m_nValues[2][0] = 1; Filter2.m_nValues[2][1] = 2; Filter2.m_nValues[2][2] = 1;
// 水平算子基于x方向和垂直算子基于y方向,对图像进行平面卷积 for (int y=0; bSuccess && y for (int x=0; bSuccess && x if (dibCopy.m_pWorkingArea->PointInSelection(CPoint(x, y))) { COLORREF c1 = Filter1.Filter(dibCopy, lpDibBitsSrc, x, y); COLORREF c2 = Filter2.Filter(dibCopy, lpDibBitsSrc, x, y); int r = max(GetRValue(c1), GetRValue(c2)); int g = max(GetGValue(c1), GetGValue(c2)); int b = max(GetBValue(c1), GetBValue(c2)); bSuccess = SetPixel(x+rectDest.left, y+ rectDest.top, RGB(r, g, b), lpDibBitsDest); } } } CANY检测的函数部分: // 一维高斯分布函数,用于平滑函数中生成的高斯滤波系数 void CreatGauss(double sigma, double **pdKernel, int *pnWidowSize) { LONG i; int nCenter; double dDis; double dValue; double 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, 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; for(y=0;y for(x=0;x dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i<=nLen;i++){ if((i+x)>=0 && (i+x) //判断是否在图像内部 dDotMul+=(double)pGray[y*sz.cx+(i+x)] * pdKernel[nLen+i]; } } } } dWeightSum += pdKernel[nLen+i]; pdTemp[y*sz.cx+x] = dDotMul/dWeightSum; //y方向滤波 for(x=0; x for(y=0; y dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i<=nLen;i++){ if((i+y)>=0 && (i+y)< sz.cy){ dDotMul += (double)pdTemp[(y+i)*sz.cx+x]*pdKernel[nLen+i]; dWeightSum += pdKernel[nLen+i]; } } } } delete []pdKernel; pdKernel = NULL; delete []pdTemp; pdTemp = NULL; pResult[y*sz.cx+x] = (unsigned char)dDotMul/dWeightSum; } // 方向导数,求梯度 void Grad(SIZE sz, LPBYTE pGray,int *pGradX, int *pGradY, int *pMag) { LONG y,x; for(y=1;y for(x=1;x pGradX[y*sz.cx +x] = (int)( pGray[y*sz.cx+x+1]- pGray[y*sz.cx+ x-1] ); } } for(x=1;x for(y=1;y pGradY[y*sz.cx +x] = (int)(pGray[(y+1)*sz.cx +x] – pGray[(y-1)*sz.cx +x]); } } double dSqt1; //中间变量 double dSqt2; for(y=0; y //求梯度 for(x=0; x dSqt1 = pGradX[y*sz.cx + x]*pGradX[y*sz.cx + x]; dSqt2 = pGradY[y*sz.cx + x]*pGradY[y*sz.cx + x]; pMag[y*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 pNSRst[x] = 0; pNSRst[(sz.cy-1)*sz.cx+x] = 0; } for(y=0;y pNSRst[y*sz.cx] = 0; pNSRst[y*sz.cx + sz.cx-1] = 0; } for(y=1;y for(x=1;x nPos = y*sz.cx + x; //当前点 if(pMag[nPos] == 0){ //如果当前像素梯度幅度为0,则不是边界点 pNSRst[nPos] = 0; } else{ //当前点的梯度幅度 dTmp = pMag[nPos]; gx = pGradX[nPos]; gy = pGradY[nPos]; //x,y方向导数 //如果方向导数y分量比x分量大,说明导数方向趋向于y分量