欢迎来到天天文库
浏览记录
ID:29004787
大小:35.00 KB
页数:11页
时间:2018-12-15
《分水岭算法VC实现.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、函数名: Watershed功能: 用标记-分水岭算法对输入图像进行分割算法实现: 无输入参数说明: OriginalImage--输入图像(灰度图,0~255) SeedImage --标记图像(二值图,0-非标记,1-标记) LabelImage --输出图像(1-第一个分割区域,2-第二个分割区域,...) row
2、 --图像行数 col --图像列数返回值说明: 无 ====================================================================*/voidWINAPICDib::Watershed(unsignedchar**OriginalImage,char**SeedImage,int**LabelImage,introw,intcol){//usingnamespacestd;//标记区域标识号,从1开始in
3、tNum=0;inti,j;//保存每个队列种子个数的数组vectorSeedCounts;//临时种子队列queuequetem;//保存所有标记区域种子队列的数组,里面放的是种子队列的指针vector*>vque;int*array;//指向种子队列的指针queue*pque;POINTtemp;for(i=0;i4、ft,upright,downleft,downright;//8directions...//预处理,提取区分每个标记区域,并初始化每个标记的种子队列//种子是指标记区域边缘的点,他们可以在水位上升时向外淹没(或者说生长)//pan'swords:我的理解是梯度值较小的象素点,或者是极小灰度值的点。for(i=0;i5、 //分配数组并初始化为零,表示可有256个灰阶 array=newint[256]; ZeroMemory(array,256*sizeof(int)); //种子个数数组进vector,每次扫描则生成一个数组,并用区域标识号来做第一维。灰度级做第二维。 //表示某个盆地区域中某灰阶所对应的点的数目。 SeedCounts.push_back(array); //分配本标记号的优先队列,256个种子队列, //表示对应一个灰阶有一个队列,并且每个队列可以存储一个集合的点信6、息 pque=newqueue[256]; //加入到队列数组中,对应的是本标记号Num的 vque.push_back(pque); //当前点放入本标记区域的临时种子队列中 temp.x=i; temp.y=j; quetem.push(temp); //当前点标记为已处理 LabelImage[i][j]=Num; SeedImage[i][j]=127;//表示已经处理过 //让临时种子队列中的种7、子进行生长直到所有的种子都生长完毕 //生长完毕后的队列信息保存在vque中,包括区域号和灰阶,对应点数存储在seedcounts中 while(!quetem.empty()) { up=down=right=left=FALSE; upleft=upright=downleft=downright=FALSE; //队列中取出一个种子 temp=quetem.front();
4、ft,upright,downleft,downright;//8directions...//预处理,提取区分每个标记区域,并初始化每个标记的种子队列//种子是指标记区域边缘的点,他们可以在水位上升时向外淹没(或者说生长)//pan'swords:我的理解是梯度值较小的象素点,或者是极小灰度值的点。for(i=0;i5、 //分配数组并初始化为零,表示可有256个灰阶 array=newint[256]; ZeroMemory(array,256*sizeof(int)); //种子个数数组进vector,每次扫描则生成一个数组,并用区域标识号来做第一维。灰度级做第二维。 //表示某个盆地区域中某灰阶所对应的点的数目。 SeedCounts.push_back(array); //分配本标记号的优先队列,256个种子队列, //表示对应一个灰阶有一个队列,并且每个队列可以存储一个集合的点信6、息 pque=newqueue[256]; //加入到队列数组中,对应的是本标记号Num的 vque.push_back(pque); //当前点放入本标记区域的临时种子队列中 temp.x=i; temp.y=j; quetem.push(temp); //当前点标记为已处理 LabelImage[i][j]=Num; SeedImage[i][j]=127;//表示已经处理过 //让临时种子队列中的种7、子进行生长直到所有的种子都生长完毕 //生长完毕后的队列信息保存在vque中,包括区域号和灰阶,对应点数存储在seedcounts中 while(!quetem.empty()) { up=down=right=left=FALSE; upleft=upright=downleft=downright=FALSE; //队列中取出一个种子 temp=quetem.front();
5、 //分配数组并初始化为零,表示可有256个灰阶 array=newint[256]; ZeroMemory(array,256*sizeof(int)); //种子个数数组进vector,每次扫描则生成一个数组,并用区域标识号来做第一维。灰度级做第二维。 //表示某个盆地区域中某灰阶所对应的点的数目。 SeedCounts.push_back(array); //分配本标记号的优先队列,256个种子队列, //表示对应一个灰阶有一个队列,并且每个队列可以存储一个集合的点信
6、息 pque=newqueue[256]; //加入到队列数组中,对应的是本标记号Num的 vque.push_back(pque); //当前点放入本标记区域的临时种子队列中 temp.x=i; temp.y=j; quetem.push(temp); //当前点标记为已处理 LabelImage[i][j]=Num; SeedImage[i][j]=127;//表示已经处理过 //让临时种子队列中的种
7、子进行生长直到所有的种子都生长完毕 //生长完毕后的队列信息保存在vque中,包括区域号和灰阶,对应点数存储在seedcounts中 while(!quetem.empty()) { up=down=right=left=FALSE; upleft=upright=downleft=downright=FALSE; //队列中取出一个种子 temp=quetem.front();
此文档下载收益归作者所有