分水岭算法code_第1页
分水岭算法code_第2页
分水岭算法code_第3页
分水岭算法code_第4页
分水岭算法code_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、分水岭算法code /Image Watershed Segmentation /This is the implementation of the algorithm based on immersion model. / = = / = Module: Watershed.cpp / = - = = / = Version 01 Date: 04/21/2003 / = - = = / = = / = Written by F / = e-mail: gong200 / = = / Permission to use, copy, or modify this

2、software and its documentation / for educational and research purposes only is hereby granted without / fee, provided that this copyright notice appear on all copies and / related documentation. For any other uses of this software, in original / or modified form, including but not limited to distrib

3、ution in whole / or in part, specific prior permission must be obtained from / the author(s). / / THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, / EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY / WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR

4、PURPOSE. / / IN NO EVENT SHALL RUTGERS UNIVERSITY BE LIABLE FOR ANY SPECIAL, / INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY / DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, / WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY / THEORY OF LIABILITY,

5、ARISING OUT OF OR IN CONNECTION WITH THE USE / OR PERFORMANCE OF THIS SOFTWARE. / =#include <queue> #include <vector> #include <windows.h> /*= 函数名 : Watershed 功能 : 用标记-分水岭算法对输入图像进行分割 算法实现 : 无 输入参数说明 : OriginalImage -输入图像(灰度图,0255) SeedImage -标记图像(二值图,0-非 标 记,1-标记) LabelImage -输出图像(

6、1-第一个分割 区 域,2-第二个分割区域,.) row -图像行数 col -图像列数 返回值说明 : 无 =*/ void Watershed(const int *OriginalImage, char* SeedImage, int *LabelImage , int row, int col) using namespace std; /标记区域标识号,从1开始 int Num=0; int i,j; /保存每个队列种子个数的数组 vector<int*> SeedCounts; /临时种子队列 queue<POINT> que; /保存所有标记区域种子队列的

7、数组 vector<queue<POINT>* > qu; int* array; queue<POINT> *uu; POINT temp; for(i=0;i<row;i+) for(j=0;j<col;j+) LabelImageij=0; int m,n,k=0; int up,down,right,left,upleft,upright,downleft,downright; /预处理,提取区分每个标记区域,并初始化每个标记的种子队列 /种子是指标记区域边缘的点,他们可以在水位上升时向外淹没(或者说生长) for(i=0;i<ro

8、w;i+) for(j=0;j<col;j+) /如果找到一个标记区域 if(SeedImageij=1) /区域的标识号加一 Num+; /分配数组并初始化为零 array=new int256; ZeroMemory(array,256*sizeof(int); / SeedCounts.push_back(array); /分配本标记的优先队列 uu=new queue<POINT>256; /加入到队列数组中 qu.push_back(uu); /当前点放入本标记区域的临时种子队列中 temp.x=i; temp.y=j; que.push(temp); /当前点标记

9、为已处理 LabelImageij=Num; SeedImageij=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(SeedImagem-1n=1) temp.x=m-1; temp.y=n; que.push(temp); /新种子点标记为已

10、淹没 区 域 LabelImagem-1n=Num ; SeedImagem-1n=127; else/否则上方为不可生长 up=1; if(m>0&&n>0) if(SeedImagem-1n-1=1)/左 上 方若为可生长点则加为新种子 temp.x=m-1; temp.y=n-1; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagem-1n-1=Num; SeedImagem-1n-1=12 7; else/否则左上方为不可生长 upleft=1; if(m<row-1) if(SeedImagem+1n=1)/下方 若

11、 为可生长点则加为新种子 temp.x=m+1; temp.y=n; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagem+1n=Num ; SeedImagem+1n=127; else/否则下方为不可生长 down=1; if(m<(row-1)&&n<(col-1) if(SeedImagem+1n+1=1)/下 方 若为可生长点则加为新种子 temp.x=m+1; temp.y=n+1; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagem+1n+1=Num; SeedImagem+1n+1

12、=12 7; else/否则下方为不可生长 downright=1; if(n<col-1) if(SeedImagemn+1=1)/右方 若 为可生长点则加为新种子 temp.x=m; temp.y=n+1; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagemn+1=Num ; SeedImagemn+1=127; else/否则右方为不可生长 right=1; if(m>0&&n<(col-1) if(SeedImagem-1n+1=1)/右 上 方若为可生长点则加为新种子 temp.x=m-1; temp.y=n+1;

13、 que.push(temp); /新种子点标记为已淹没 区 域LabelImagem-1n+1=Num; SeedImagem-1n+1=12 7; else/否则右上方为不可生长 upright=1; if(n>0) if(SeedImagemn-1=1)/左方 若 为可生长点则加为新种子 temp.x=m; temp.y=n-1; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagemn-1=Num ; SeedImagemn-1=127; else/否则左方为不可生长 left=1; if(m<(row-1)&&n>0)

14、 if(SeedImagem+1n-1=1)/左 下 方若为可生长点则加为新种子 temp.x=m+1; temp.y=n-1; que.push(temp); /新种子点标记为已淹没 区 域 LabelImagem+1n-1=Num; SeedImagem+1n-1=12 7; else/否则左方为不可生长 downleft=1; /上下左右只要有一点不可生长,那么本点 为 初始种子队列中的一个 if(up|down|right|left| upleft|downleft|upright|downright) temp.x=m; temp.y=n; quNum-1OriginalImagem

15、n.push(temp); SeedCountsNum-1OriginalImagemn+; /while结束 bool actives;/在某一水位处,所有标记的种子生长完的标志 int WaterLevel; /淹没过程开始,水位从零开始上升 for(WaterLevel=0;WaterLevel<256;WaterLevel+) actives=true; while(actives) actives=false; /依次处理每个标记区域 for(i=0;i<Num;i+) if(!quiWaterLevel.empty() actives=true; while(SeedC

16、ountsiWaterLevel>0) SeedCountsiWaterLevel-; temp=quiWaterLevel.front(); quiWaterLevel.pop(); m = temp.x; n = temp.y;/当前种子的坐标 if(m>0) if(!LabelImagem-1n)/上方若 未处理 temp.x=m-1; temp.y=n; LabelImagem-1n=i+1;/上方点标记为已淹没区域 if(OriginalImagem-1n<=WaterLevel)/上方若为可生长点则加入当前队列 quiWaterLevel.push(temp);

17、else/否则加入 OriginalImagem-1n级队列 quiOriginalImagem-1n.push(temp); SeedCountsiOriginalImagem-1n+; if(m<row-1) if(!LabelImagem+1n)/下方若 未处理 temp.x=m+1; temp.y=n; LabelImagem+1n=i+1;/下方点标记为已淹没区域 if(OriginalImagem+1n<=WaterLevel)/下方若为可生长点则加入当前队列 quiWaterLevel.push(temp); else/否则加入 OriginalImagem+1n级队

18、列 quiOriginalImagem+1n.push(temp); SeedCountsiOriginalImagem+1n+; if(n<col-1) if(!LabelImagemn+1)/右边若 未处理 temp.x=m; temp.y=n+1; LabelImagemn+1=i+1;/右边点标记为已淹没区域 if(OriginalImagemn+1<=WaterLevel)/右边若为可生长点则加入当前队列 quiWaterLevel.push(temp); else/否则加入 OriginalImagemn+1级队列 quiOriginalImagemn+1.push(temp); SeedCountsiOriginalImagemn+1+; if(n>0) if(!LabelImagemn-1)/左边若未处理 temp.x=m; temp.y=n-1; LabelImagemn-1=i+1;/左边点标记为已淹没区域 if(OriginalImagemn-1<=WaterLevel)/左边若为可生长点则加入当前队列 quiWaterLevel.push(temp); else/否则加入 OriginalImagemn-1级队列 quiO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论