图像处理之区域增长算法的VC实现算法说明区域增长是指从某个.DOC
文本预览下载声明
图像处理之区域增长算法的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
显示全部