資源簡(jiǎn)介
圖像分割經(jīng)典算法分水嶺圖像分割算法 c++實(shí)現(xiàn) 很好用

代碼片段和文件信息
//算法實(shí)現(xiàn)代碼如下?
/*====================================================================
函數(shù)名:??????????Watershed
功能:????????????用標(biāo)記-分水嶺算法對(duì)輸入圖像進(jìn)行分割
算法實(shí)現(xiàn):????????無(wú)
輸入?yún)?shù)說(shuō)明:????OriginalImage?--輸入圖像(灰度圖,0~255)
??????????????????SeedImage?????--標(biāo)記圖像(二值圖,0-非標(biāo)記,1-標(biāo)記)
??????????????????LabelImage????--輸出圖像(1-第一個(gè)分割區(qū)域,2-第二個(gè)分割區(qū)域,...)
??????????????????row???????????--圖像行數(shù)
??????????????????col???????????--圖像列數(shù)
返回值說(shuō)明:??????無(wú)????????
====================================================================*/
void?WINAPI?CDib::Watershed(unsigned?char?**OriginalImage?char**?SeedImage?int?**LabelImage?int?row?int?col)
{
//?using?namespace?std;
?
?//標(biāo)記區(qū)域標(biāo)識(shí)號(hào),從1開(kāi)始
?int?Num=0;
?int?ij;
?
?//保存每個(gè)隊(duì)列種子個(gè)數(shù)的數(shù)組
?vector?SeedCounts;
?//臨時(shí)種子隊(duì)列
?queue?quetem;
?//保存所有標(biāo)記區(qū)域種子隊(duì)列的數(shù)組,里面放的是種子隊(duì)列的指針
?vector*>?vque;
?
?int*?array;
?//指向種子隊(duì)列的指針
?queue?*pque;
?POINT?temp;
?
?for(i=0;i
?{
??for(j=0;j ???LabelImage[i][j]=0;
?}
?
?
?int?mnk=0;
?BOOL?updownrightleftupleftuprightdownleftdownright;//8?directions...
?
?//預(yù)處理提取區(qū)分每個(gè)標(biāo)記區(qū)域,并初始化每個(gè)標(biāo)記的種子隊(duì)列
?//種子是指標(biāo)記區(qū)域邊緣的點(diǎn),他們可以在水位上升時(shí)向外淹沒(méi)(或者說(shuō)生長(zhǎng))
?//pan‘s?words:我的理解是梯度值較小的象素點(diǎn),或者是極小灰度值的點(diǎn)。
?for(i=0;i
?{
??for(j=0;j ??{
???//如果找到一個(gè)標(biāo)記區(qū)域
???if(SeedImage[i][j]==1)
???{
????//區(qū)域的標(biāo)識(shí)號(hào)加一
????Num++;
????//分配數(shù)組并初始化為零,表示可有256個(gè)灰階
????array=new?int[256];
????ZeroMemory(array256*sizeof(int));
????//種子個(gè)數(shù)數(shù)組進(jìn)vector,每次掃描則生成一個(gè)數(shù)組,并用區(qū)域標(biāo)識(shí)號(hào)來(lái)做第一維?;叶燃?jí)做第二維。
????//表示某個(gè)盆地區(qū)域中某灰階所對(duì)應(yīng)的點(diǎn)的數(shù)目。
????SeedCounts.push_back(array);
????//分配本標(biāo)記號(hào)的優(yōu)先隊(duì)列,256個(gè)種子隊(duì)列,
????//表示對(duì)應(yīng)一個(gè)灰階有一個(gè)隊(duì)列,并且每個(gè)隊(duì)列可以存儲(chǔ)一個(gè)集合的點(diǎn)信息
????pque=new?queue[256];
????//加入到隊(duì)列數(shù)組中,對(duì)應(yīng)的是本標(biāo)記號(hào)Num的
????vque.push_back(pque);
????//當(dāng)前點(diǎn)放入本標(biāo)記區(qū)域的臨時(shí)種子隊(duì)列中
????temp.x=i;
????temp.y=j;
????quetem.push(temp);
????//當(dāng)前點(diǎn)標(biāo)記為已處理
????LabelImage[i][j]=Num;
????SeedImage[i][j]=127;//表示已經(jīng)處理過(guò)
????
????//讓臨時(shí)種子隊(duì)列中的種子進(jìn)行生長(zhǎng)直到所有的種子都生長(zhǎng)完畢
????//生長(zhǎng)完畢后的隊(duì)列信息保存在vque中,包括區(qū)域號(hào)和灰階,對(duì)應(yīng)點(diǎn)數(shù)存儲(chǔ)在seedcounts中
????while(!quetem.empty())
????{
?????up=down=right=left=FALSE;
?????upleft=upright=downleft=downright=FALSE;
?????//隊(duì)列中取出一個(gè)種子
?????temp=quetem.front();
?????m=temp.x;
?????n=temp.y;
?????quetem.pop();
?????//注意到127對(duì)掃描過(guò)程的影響,影響下面的比較,但是不影響while語(yǔ)句中的掃描
?????
?????if(m>0)
?????{
??????//上方若為可生長(zhǎng)點(diǎn)則加為新種子
??????if(SeedImage[m-1][n]==1)
??????{
???????temp.x=m-1;
???????temp.y=n;
???????quetem.push(temp);//如果這樣的話,那么這些標(biāo)記過(guò)的區(qū)域?qū)⒃俅卧趙hile循環(huán)中被掃描到,不會(huì),因?yàn)橹凳?27
???????//新種子點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域,而且是當(dāng)前區(qū)域,并記錄區(qū)域號(hào)到labelImage
???????LabelImage[m-1][n]=Num;
???????SeedImage[m-1][n]=127;
??????}
??????else//否則上方為不可生長(zhǎng)
??????{
???????up=TRUE;
??????}
?????}
?????if(m>0&&n>0)
?????{
??????if(SeedImage[m-1][n-1]==1)//左上方若為可生長(zhǎng)點(diǎn)則加為新種子
??????{
???????temp.x=m-1;
???????temp.y=n-1;
???????quetem.push(temp);
???????//新種子點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域,即下一個(gè)循環(huán)中以127來(lái)標(biāo)識(shí)不再掃描,而且是當(dāng)前區(qū)域
???????LabelImage[m-1][n-1]=Num;
???????SeedImage[m-1][n-1]=127;
??????}
??????else//否則左上方為不可生長(zhǎng)
??????{
???????upleft=TRUE;
??????}
?????}
?????
?????if(m ?????{
??????if(SeedIm
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????13560??2007-04-06?16:05??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.cpp
?????文件?????103936??2007-04-06?16:03??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.doc
?????文件???????3437??2008-10-08?20:50??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.dsp
?????文件??????50176??2009-12-21?20:01??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.ncb
?????文件????????541??2008-10-08?20:50??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.dsw
?????文件??????36864??2009-12-21?19:59??實(shí)現(xiàn)分水嶺圖像分割\watershed\Debug\vc60.pdb
?????文件??????33792??2009-12-21?19:59??實(shí)現(xiàn)分水嶺圖像分割\watershed\Debug\vc60.idb
?????文件?????186988??2009-12-21?19:59??實(shí)現(xiàn)分水嶺圖像分割\watershed\Debug\watershed.pch
?????文件???????1816??2009-12-21?19:59??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.plg
?????文件??????53760??2009-12-21?20:01??實(shí)現(xiàn)分水嶺圖像分割\watershed\watershed.opt
?????目錄??????????0??2009-03-04?09:52??實(shí)現(xiàn)分水嶺圖像分割\watershed\Debug
?????目錄??????????0??2009-03-04?09:52??實(shí)現(xiàn)分水嶺圖像分割\watershed
?????目錄??????????0??2009-12-21?19:59??實(shí)現(xiàn)分水嶺圖像分割
-----------?---------??----------?-----??----
???????????????484870????????????????????13
評(píng)論
共有 條評(píng)論