//一条边界的所有边界点,函数采用了递归算法 // 从(x,y)坐标出发,进行边界点的跟踪,跟踪只考虑pResult中没有处理并且可能是边界 // 点的像素(=128),像素值为0表明该点不可能是边界点,像素值为255表明该点已经是边界点
void TraceEdge(int y, int x, int nThrLow, LPBYTE pResult, int *pMag, SIZE sz) { //对8邻域像素进行查询 int xNum[8] = {1,1,0,-1,-1,-1,0,1}; int yNum[8] = {0,1,1,1,0,-1,-1,-1};
LONG yy,xx,k;
for(k=0;k<8;k++) { yy = y+yNum[k]; xx = x+xNum[k];
if(pResult[yy*sz.cx+xx]==128 && pMag[yy*sz.cx+xx]>=nThrLow ) { //该点设为边界点 pResult[yy*sz.cx+xx] = 255;
//以该点为中心再进行跟踪 TraceEdge(yy,xx,nThrLow,pResult,pMag,sz); } } }
// Canny算子 void Canny(LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult) { //经过高斯滤波后的图像 LPBYTE pGaussSmooth;
pGaussSmooth = new unsigned char[sz.cx*sz.cy];
//x方向导数的指针 int *pGradX; pGradX = new int[sz.cx*sz.cy]; //y方向 int *pGradY; pGradY = new int[sz.cx*sz.cy]; //梯度的幅度 int *pGradMag; pGradMag = new int[sz.cx*sz.cy];
//对原图高斯滤波 GaussianSmooth(sz,pGray,pGaussSmooth,sigma);
//计算方向导数和梯度的幅度 Grad(sz,pGaussSmooth,pGradX,pGradY,pGradMag);
//应用非最大抑制 NonmaxSuppress(pGradMag,pGradX,pGradY,sz,pResult);
//应用Hysteresis,找到所有边界 Hysteresis(pGradMag,sz,dRatLow,dRatHigh,pResult);
delete[] pGradX; pGradX = NULL; delete[] pGradY; pGradY = NULL; delete[] pGradMag; pGradMag = NULL; delete[] pGaussSmooth; pGaussSmooth = NULL;
}
/* void CChildWnd::OnCanny() { if (! m_fOpenFile) { return; } m_fDone = TRUE; RGBToGray(szImg, aRGB, aGray, BPP); Canny(aGray,szImg,0.1,0.9,0.76,aBinImg); ShowGrayImage("l",szImg,aBinImg); } //*/
(出处:清风网络学院 )
复制本页网址和标题,发送给你QQ/Msn的好友一起分享
上一篇:微软靠卖软件赚钱,Google OS靠什么赚钱
下一篇:05年的经典语录之计算机科学