基于sobel和canny算法的水珠边缘检测 - 图文(2)

2019-04-16 15:20

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分量


基于sobel和canny算法的水珠边缘检测 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全责任书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: