文档详情

图像处理之区域增长算法的VC实现算法说明区域增长是指从某个.DOC

发布:2018-09-28约3.48千字共4页下载文档
文本预览下载声明
图像处理之区域增长算法的VC++实现 算法说明: 区域增长是指从某个像素出发,按照一定的准则,逐步加入临近像素,当满足一定的条件时,区域增长终止。关系增长结果好坏的条件: (1)、初始点的选取 (2)、生长准则 (3)、终止条件 /* lpImage 指向原图指针;lpNewImage 指向新图指针 nWidtrh,nHeight 图像大小 b :计数 */ Void RegionGrow4(int nSeedX, int nSeedY, int b, BYTE *lpImage, BYTE *lpNewImage, int nWidth, int nHeight) { //遍历图像的4个邻域时使用的数组 // int nDx[]={3,0,0,-3}; // int nDy[]={0,1,-1,0}; int nDx[]={-3,0,3,3,3,0,-3,-3}; int nDy[]={-1,-1,-1,0,1,1,1,0}; lpNewImage[nSeedY*nWidth*3+nSeedX] = lpNewImage[nSeedY*nWidth*3+nSeedX+1] = lpNewImage[nSeedY*nWidth*3+nSeedX+2] = b; // 定义堆栈,存储坐标 int * pnGrowQueX ; int * pnGrowQueY ; // 分配空间 pnGrowQueX = new int [nWidth*nHeight*3]; pnGrowQueY = new int [nWidth*nHeight*3]; // 定义堆栈的起点和终点 // 当nStart=nEnd, 表示堆栈中只有一个点 int nStart; int nEnd ; //初始化 nStart = 0 ; nEnd = 0 ; // 把种子点的坐标压入栈 pnGrowQueX[nEnd] = nSeedX; pnGrowQueY[nEnd] = nSeedY; // 当前正在处理的象素 int nCurrX ; int nCurrY ; // 循环控制变量 int k ; // 图象的横纵坐标,用来对当前象素的4邻域进行遍历 int xx; int yy; while (nStart=nEnd) { // 当前种子点的坐标 nCurrX = pnGrowQueX[nStart]; nCurrY = pnGrowQueY[nStart]; // 对当前点的4邻域进行遍历 for (k=0; k8; k++) { // 4邻域象素的坐标 xx = nCurrX+nDx[k] ; yy = nCurrY+nDy[k]; // 判断象素(xx,yy) 是否在图像内部 // 判断象素(xx,yy) 是否已经处理过 // lpNewImage[yy*nWidth+xx]==0 表示还没有处理 // 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值 if ( (xx (nWidth-1) * 3) (xx0) (yy0) (yynHeight-1) lpNewImage[yy*nWidth*3+xx] == 0 (abs( lpImage[yy*nWidth*3+xx] - lpImage[nCurrY*nWidth*3+nCurrX]) =1 ) ) { nEnd++; // 象素(xx,yy) 压入栈 pnGrowQueX[nEnd] = xx; pnGrowQueY[nEnd] = yy; // 把象素(xx,yy)设置成逻辑1(255) // 同时也表明该象素处理过 lpNewImage[yy*nWidth*3+xx] = lpNewImage[yy*nWidth*3+xx+1] = lpNewImage[yy*nWidth*3+xx+2] = b; } } nStart++; } b++; // 释放内存 delete []pnGrowQueX; delete []pnGrowQueY; pnGrowQueX = NULL ; pnGrowQueY = NULL ; } Void RegionGrow_grayEx(BYTE *lpImage, int nWindth, int nHeight) { BYTE *Flag = ne
显示全部
相似文档