分水岭分割算法源代码改进.docx
《分水岭分割算法源代码改进.docx》由会员分享,可在线阅读,更多相关《分水岭分割算法源代码改进.docx(11页珍藏版)》请在冰豆网上搜索。
分水岭分割算法源代码改进
分水岭分割算法源代码(改进)
分水岭分割算法源代码(改进)
标签:
算法deleteup
2019-08-2010:
121364人阅读评论(6)收藏举报
分类:
图像处理(6)
版权声明:
本文为博主原创文章,未经博主允许不得转载。
void WaterThreshUpdate(constint**OriginalImage,char**SeedImage,
int**LabelImage,introw,intcol)
////////////////////////////////////////////////////////////////////////////////////////////
///// 功能 :
用标记-分水岭算法对输入图像进行分割 ///////////
///// 参数说明 :
OriginalImage--输入图像(灰度图,0~255) ///////////
///// SeedImage --标记图像(二值图,0-非标记,1-标记) ///////////
///// LabelImage --输出图像(1-第一个分割区域,2-第二个分割区域,...)////
///// row --图像行数 ////
///// col --图像列数 ////
////////////////////////////////////////////////////////////////////////////////////////////
{
usingnamespacestd;
//标记区域标识号,从1开始
intNum=0;
inti,j;
//保存每个队列种子个数的数组
vectorSeedCounts;
//临时种子队列
queueque;
//保存所有标记区域种子队列的数组
vector*>qu;
int*array;
queue*uu;
POINTtemp;
for(i=0;i
for(j=0;j
LabelImage[i][j]=0;
intm,n,k=0;
intup,down,right,left,upleft,upright,downleft,downright;
//预处理,提取区分每个标记区域,并初始化每个标记的种子队列
//种子是指标记区域边缘的点,他们可以在水位上升时向外淹没(或者说生长)
for(i=0;i
{
for(j=0;j
{
//如果找到一个标记区域
if(SeedImage[i][j]==1)
{
//区域的标识号加一
Num++;
//分配数组并初始化为零
array=newint[256];
ZeroMemory(array,256*sizeof(int));
//
SeedCounts.push_back(array);
//分配本标记的优先队列
uu=newqueue[256];
//加入到队列数组中
qu.push_back(uu);
//当前点放入本标记区域的临时种子队列中
temp.x=i;
temp.y=j;
que.push(temp);
//当前点标记为已处理
LabelImage[i][j]=Num;
SeedImage[i][j]=127;
//让种子队列中的种子进行生长直到所有的种子都生长完毕
while(!
que.empty())
{
up=down=right=left=0;
upleft=upright=downleft=downright=0;
//队列中取出一个种子
temp=que.front();
m=temp.x;
n=temp.y;
que.pop();
if(m>0)
{
//上方若为可生长点则加为新种子
if(SeedImage[m-1][n]==1)
{
temp.x=m-1;
temp.y=n;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m-1][n]=Num;
SeedImage[m-1][n]=127;
}else//否则上方为不可生长
{
up=1;
}
}
if(m>0&&n>0)
{
if(SeedImage[m-1][n-1]==1)//左上方若为可生长点则加为新种子
{
temp.x=m-1;
temp.y=n-1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m-1][n-1]=Num;
SeedImage[m-1][n-1]=127;
}else//否则左上方为不可生长
{
upleft=1;
}
}
if(m
{
if(SeedImage[m+1][n]==1)//下方若为可生长点则加为新种子
{
temp.x=m+1;
temp.y=n;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m+1][n]=Num;
SeedImage[m+1][n]=127;
}else//否则下方为不可生长
{
down=1;
}
}
if(m
{
if(SeedImage[m+1][n+1]==1)//下方若为可生长点则加为新种子
{
temp.x=m+1;
temp.y=n+1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m+1][n+1]=Num;
SeedImage[m+1][n+1]=127;
}else//否则下方为不可生长
{
downright=1;
}
}
if(n
{
if(SeedImage[m][n+1]==1)//右方若为可生长点则加为新种子
{
temp.x=m;
temp.y=n+1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m][n+1]=Num;
SeedImage[m][n+1]=127;
}else//否则右方为不可生长
{
right=1;
}
}
if(m>0&&n
{
if(SeedImage[m-1][n+1]==1)//右上方若为可生长点则加为新种子
{
temp.x=m-1;
temp.y=n+1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m-1][n+1]=Num;
SeedImage[m-1][n+1]=127;
}else//否则右上方为不可生长
{
upright=1;
}
}
if(n>0)
{
if(SeedImage[m][n-1]==1)//左方若为可生长点则加为新种子
{
temp.x=m;
temp.y=n-1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m][n-1]=Num;
SeedImage[m][n-1]=127;
}else//否则左方为不可生长
{
left=1;
}
}
if(m0)
{
if(SeedImage[m+1][n-1]==1)//左下方若为可生长点则加为新种子
{
temp.x=m+1;
temp.y=n-1;
que.push(temp);
//新种子点标记为已淹没区域
LabelImage[m+1][n-1]=Num;
SeedImage[m+1][n-1]=127;
}else//否则左方为不可生长
{
downleft=1;
}
}
//上下左右只要有一点不可生长,那么本点为初始种子队列中的一个
if(up||down||right||left||
upleft||downleft||upright||downright)
{
temp.x=m;
temp.y=n;
qu[Num-1][OriginalImage[m][n]].push(temp);
SeedCounts[Num-1][OriginalImage[m][n]]++;
}
}//while结束
}
}
}
boolactives;//在某一水位处,所有标记的种子生长完的标志
intWaterLevel;
//淹没过程开始,水位从零开始上升
for(WaterLevel=0;WaterLevel
{
actives=true;
while(actives)
{
actives=false;
//依次处理每个标记区域
for(i=0;i
{
if(!
qu[i][WaterLevel].empty())
{
actives=true;
while(SeedCounts[i][WaterLevel]>0)
{
SeedCounts[i][WaterLevel]--;
temp=qu[i][WaterLevel].front();
qu[i][WaterLevel].pop();
m=temp.x;
n=temp.y;//当前种子的坐标
if(m>0)
{
if(!
LabelImage[m-1][n])//上方若未处理
{
temp.x=m-1;
temp.y=n;
LabelImage[m-1][n]=i+1;//上方点标记为已淹没区域
if(OriginalImage[m-1][n]
{
qu[i][WaterLevel].push(temp);
}
else//否则加入OriginalImage[m-1][n]级队列
{
qu[i][OriginalImage[m-1][n]].push(temp);
SeedCounts[i][OriginalImage[m-1][n]]++;
}
}
}
if(m
{
if(!
LabelImage[m+1][n])//下方若未处理
{
temp.x=m+1;
temp.y=n;
LabelImage[m+1][n]=i+1;//下方点标记为已淹没区域
if(OriginalImage[m+1][n]
{
qu[i][WaterLevel].push(temp);
}
else//否则加入OriginalImage[m+1][n]级队列
{
qu[i][OriginalImage[m+1][n]].push(temp);
SeedCounts[i][OriginalImage[m+1][n]]++;
}
}
}
if(n
{
if(!
LabelImage[m][n+1])//右边若未处理
{
temp.x=m;
temp.y=n+1;
LabelImage[m][n+1]=i+1;//右边点标记为已淹没区域
if(OriginalImage[m][n+1]
{
qu[i][WaterLevel].push(temp);
}
else//否则加入OriginalImage[m][n+1]级队列
{
qu[i][OriginalImage[m][n+1]].push(temp);
SeedCounts[i][OriginalImage[m][n+1]]++;
}
}
}
if(n>0)
{
if(!
LabelImage[m][n-1])//左边若未处理
{
temp.x=m;
temp.y=n-1;
LabelImage[m][n-1]=i+1;//左边点标记为已淹没区域
if(OriginalImage[m][n-1]
{
qu[i][WaterLevel].push(temp);
}
else//否则加入OriginalImage[m][n-1]级队列
{
qu[i][OriginalImage[m][n-1]].push(temp);
SeedCounts[i][OriginalImage[m][n-1]]++;
}
}
}
}//while循环结束
SeedCounts[i][WaterLevel]=(int)qu[i][WaterLevel].size();
}//if结束
}//for循环结束
}//while循环结束
}//for循环结束
while(!
qu.empty())
{
uu=qu.back();
delete[]uu;
qu.pop_back();
}
while(!
SeedCounts.empty())
{
array=SeedCounts.back();
delete[]array;
SeedCounts.pop_back();
}
}
顶
0
踩
0