資源簡介
圖像分割經典算法分水嶺圖像分割算法 c++實現 很好用

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