分水岭分割算法源代码改进.docx

上传人:b****4 文档编号:5520727 上传时间:2022-12-18 格式:DOCX 页数:11 大小:16.15KB
下载 相关 举报
分水岭分割算法源代码改进.docx_第1页
第1页 / 共11页
分水岭分割算法源代码改进.docx_第2页
第2页 / 共11页
分水岭分割算法源代码改进.docx_第3页
第3页 / 共11页
分水岭分割算法源代码改进.docx_第4页
第4页 / 共11页
分水岭分割算法源代码改进.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

分水岭分割算法源代码改进.docx

《分水岭分割算法源代码改进.docx》由会员分享,可在线阅读,更多相关《分水岭分割算法源代码改进.docx(11页珍藏版)》请在冰豆网上搜索。

分水岭分割算法源代码改进.docx

分水岭分割算法源代码改进

分水岭分割算法源代码(改进)

分水岭分割算法源代码(改进)

标签:

算法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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1