分水嶺算法code_第1頁
分水嶺算法code_第2頁
分水嶺算法code_第3頁
分水嶺算法code_第4頁
分水嶺算法code_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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> /*= 函數(shù)名 : Watershed 功能 : 用標記-分水嶺算法對輸入圖像進行分割 算法實現(xiàn) : 無 輸入?yún)?shù)說明 : OriginalImage -輸入圖像(灰度圖,0255) SeedImage -標記圖像(二值圖,0-非 標 記,1-標記) LabelImage -輸出圖像(

6、1-第一個分割 區(qū) 域,2-第二個分割區(qū)域,.) row -圖像行數(shù) col -圖像列數(shù) 返回值說明 : 無 =*/ void Watershed(const int *OriginalImage, char* SeedImage, int *LabelImage , int row, int col) using namespace std; /標記區(qū)域標識號,從1開始 int Num=0; int i,j; /保存每個隊列種子個數(shù)的數(shù)組 vector<int*> SeedCounts; /臨時種子隊列 queue<POINT> que; /保存所有標記區(qū)域種子隊列的

7、數(shù)組 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; /預處理,提取區(qū)分每個標記區(qū)域,并初始化每個標記的種子隊列 /種子是指標記區(qū)域邊緣的點,他們可以在水位上升時向外淹沒(或者說生長) for(i=0;i<ro

8、w;i+) for(j=0;j<col;j+) /如果找到一個標記區(qū)域 if(SeedImageij=1) /區(qū)域的標識號加一 Num+; /分配數(shù)組并初始化為零 array=new int256; ZeroMemory(array,256*sizeof(int); / SeedCounts.push_back(array); /分配本標記的優(yōu)先隊列 uu=new queue<POINT>256; /加入到隊列數(shù)組中 qu.push_back(uu); /當前點放入本標記區(qū)域的臨時種子隊列中 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、淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域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); /新種子點標記為已淹沒 區(qū) 域 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); /新種子點標記為已淹沒 區(qū) 域 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結(jié)束 bool actives;/在某一水位處,所有標記的種子生長完的標志 int WaterLevel; /淹沒過程開始,水位從零開始上升 for(WaterLevel=0;WaterLevel<256;WaterLevel+) actives=true; while(actives) actives=false; /依次處理每個標記區(qū)域 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;/上方點標記為已淹沒區(qū)域 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;/下方點標記為已淹沒區(qū)域 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;/右邊點標記為已淹沒區(qū)域 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;/左邊點標記為已淹沒區(qū)域 if(OriginalImagemn-1<=WaterLevel)/左邊若為可生長點則加入當前隊列 quiWaterLevel.push(temp); else/否則加入 OriginalImagemn-1級隊列 quiO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論