以备自己学习之用,避免寻找之苦
下面代码采用堆栈的方式实现了给定种子点的区域生长,该方法步骤如下:
(1)为输出图像申请缓冲区,并初始化白色;
(2)将种子点入栈,并将输出图像对应位置编辑黑色;
(3)从栈中弹出一个像素点(该像素点已在输出缓冲区标记过),考察该像素点的8邻域中有像素与种子点灰度差小于给定的阀值T,且该点在输出图像中没有被标记过,则将该点入栈,并将输出图像缓冲区对应位置标记成黑色;
(4)重复步骤(3),直至栈空为止。
而我想实现边界显示成白线,其他部分不变的结果。请大家帮帮忙……谢谢
//以下是区域生长代码
//循环变量
int i, j;
//将输出图像初始化置255,用0代表像素的生长标记
for(i=0;i<m_imgHeight;i++){
for(j=0;j<m_imgWidth;j++){
*(m_pImgDataOut+i*lineByte+j)=255;
}
}
//二维数组direction代表中心像素点8邻域坐标与该点在x和y方向上的偏移,
//其中第一列为x方向的偏移,第二列为y方向的偏移
int direction[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},
{-1,1}};
//栈申请,此处假定进栈的像素最多为图像总像素数
CPoint *stack=new CPoint[m_imgWidth*m_imgHeight];
//栈顶指针
int top;
//当前正处理的点和弹出的点
CPoint currentPoint, popPoint;
//循环变量,遍历array数组的第一维下标
int k;
//标记变量
int label;
//临时变量
int temp1, temp2;
//记录种子像素的灰度值
temp1=*(m_pImgData+seed.y*lineByte+seed.x);
//将给定种子点置标记0,入栈
*(m_pImgDataOut+seed.y*lineByte+seed.x)=0;
top=0;
stack[top].x=seed.x;
stack[top].y=seed.y;
//堆栈
while(top>-1){
//弹出栈顶元素,该元素已经生长过
popPoint.x=stack[top].x;
popPoint.y=stack[top].y;
top--;
//考察弹出像素周围是否有没有生长的像素
for(k=0;k<8;k++){
//待考察的邻域点
currentPoint.x=popPoint.x+direction[k][0];
currentPoint.y=popPoint.y+direction[k][1];
//如果待考察的点不在图像内,则跳过
if(currentPoint.x<0||currentPoint.x>m_imgWidth-1||
currentPoint.y<0||currentPoint.y>m_imgHeight-1)
continue;
//该点标号
label=*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x);
//弹出的点周围有尚没生长的点
if(label==255){
temp2=*(m_pImgData+currentPoint.y*lineByte+currentPoint.x);
//如果当前被考察的像素灰度值与种子点灰度值之差小于给定的阈值,
//则认为相似,将其进栈处理
if(abs(temp1-temp2)<thresh){
//给该点置生长标记0
*(m_pImgDataOut+currentPoint.y*lineByte+currentPoint.x)=0;
top++;
stack[top].x=currentPoint.x;
stack[top].y=currentPoint.y;
}
}
}
}
delete []stack;
}
原文网址:http://topic.csdn.net/u/20100613/08/f6ffee52-a2bc-4768-aca2-b21e1d395a6c.html