




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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 功能 : 用標(biāo)記-分水嶺算法對(duì)輸入圖像進(jìn)行分割 算法實(shí)現(xiàn) : 無(wú) 輸入?yún)?shù)說(shuō)明 : OriginalImage -輸入圖像(灰度圖,0255) SeedImage -標(biāo)記圖像(二值圖,0-非 標(biāo) 記,1-標(biāo)記) LabelImage -輸出圖像(
6、1-第一個(gè)分割 區(qū) 域,2-第二個(gè)分割區(qū)域,.) row -圖像行數(shù) col -圖像列數(shù) 返回值說(shuō)明 : 無(wú) =*/ void Watershed(const int *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 i,j; /保存每個(gè)隊(duì)列種子個(gè)數(shù)的數(shù)組 vector<int*> SeedCounts; /臨時(shí)種子隊(duì)列 queue<POINT> que; /保存所有標(biāo)記區(qū)域種子隊(duì)列的
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; /預(yù)處理,提取區(qū)分每個(gè)標(biāo)記區(qū)域,并初始化每個(gè)標(biāo)記的種子隊(duì)列 /種子是指標(biāo)記區(qū)域邊緣的點(diǎn),他們可以在水位上升時(shí)向外淹沒(méi)(或者說(shuō)生長(zhǎng)) for(i=0;i<ro
8、w;i+) for(j=0;j<col;j+) /如果找到一個(gè)標(biāo)記區(qū)域 if(SeedImageij=1) /區(qū)域的標(biāo)識(shí)號(hào)加一 Num+; /分配數(shù)組并初始化為零 array=new int256; ZeroMemory(array,256*sizeof(int); / SeedCounts.push_back(array); /分配本標(biāo)記的優(yōu)先隊(duì)列 uu=new queue<POINT>256; /加入到隊(duì)列數(shù)組中 qu.push_back(uu); /當(dāng)前點(diǎn)放入本標(biāo)記區(qū)域的臨時(shí)種子隊(duì)列中 temp.x=i; temp.y=j; que.push(temp); /當(dāng)前點(diǎn)標(biāo)記
9、為已處理 LabelImageij=Num; SeedImageij=127; /讓種子隊(duì)列中的種子進(jìn)行生長(zhǎng)直到所有的種子都生 長(zhǎng) 完畢while(!que.empty() up=down=right=left=0; upleft=upright=downleft=downright=0; /隊(duì)列中取出一個(gè)種子 temp=que.front(); m=temp.x; n=temp.y; que.pop(); if(m>0) /上方若為可生長(zhǎng)點(diǎn)則加為新種子 if(SeedImagem-1n=1) temp.x=m-1; temp.y=n; que.push(temp); /新種子點(diǎn)標(biāo)記為已
10、淹沒(méi) 區(qū) 域 LabelImagem-1n=Num ; SeedImagem-1n=127; else/否則上方為不可生長(zhǎng) up=1; if(m>0&&n>0) if(SeedImagem-1n-1=1)/左 上 方若為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m-1; temp.y=n-1; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagem-1n-1=Num; SeedImagem-1n-1=12 7; else/否則左上方為不可生長(zhǎng) upleft=1; if(m<row-1) if(SeedImagem+1n=1)/下方 若
11、 為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m+1; temp.y=n; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagem+1n=Num ; SeedImagem+1n=127; else/否則下方為不可生長(zhǎng) down=1; if(m<(row-1)&&n<(col-1) if(SeedImagem+1n+1=1)/下 方 若為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m+1; temp.y=n+1; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagem+1n+1=Num; SeedImagem+1n+1
12、=12 7; else/否則下方為不可生長(zhǎng) downright=1; if(n<col-1) if(SeedImagemn+1=1)/右方 若 為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m; temp.y=n+1; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagemn+1=Num ; SeedImagemn+1=127; else/否則右方為不可生長(zhǎng) right=1; if(m>0&&n<(col-1) if(SeedImagem-1n+1=1)/右 上 方若為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m-1; temp.y=n+1;
13、 que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域LabelImagem-1n+1=Num; SeedImagem-1n+1=12 7; else/否則右上方為不可生長(zhǎng) upright=1; if(n>0) if(SeedImagemn-1=1)/左方 若 為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m; temp.y=n-1; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagemn-1=Num ; SeedImagemn-1=127; else/否則左方為不可生長(zhǎng) left=1; if(m<(row-1)&&n>0)
14、 if(SeedImagem+1n-1=1)/左 下 方若為可生長(zhǎng)點(diǎn)則加為新種子 temp.x=m+1; temp.y=n-1; que.push(temp); /新種子點(diǎn)標(biāo)記為已淹沒(méi) 區(qū) 域 LabelImagem+1n-1=Num; SeedImagem+1n-1=12 7; else/否則左方為不可生長(zhǎng) downleft=1; /上下左右只要有一點(diǎn)不可生長(zhǎng),那么本點(diǎn) 為 初始種子隊(duì)列中的一個(gè) 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;/在某一水位處,所有標(biāo)記的種子生長(zhǎng)完的標(biāo)志 int WaterLevel; /淹沒(méi)過(guò)程開(kāi)始,水位從零開(kāi)始上升 for(WaterLevel=0;WaterLevel<256;WaterLevel+) actives=true; while(actives) actives=false; /依次處理每個(gè)標(biāo)記區(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;/當(dāng)前種子的坐標(biāo) if(m>0) if(!LabelImagem-1n)/上方若 未處理 temp.x=m-1; temp.y=n; LabelImagem-1n=i+1;/上方點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域 if(OriginalImagem-1n<=WaterLevel)/上方若為可生長(zhǎng)點(diǎn)則加入當(dāng)前隊(duì)列 quiWaterLevel.push(temp);
17、else/否則加入 OriginalImagem-1n級(jí)隊(duì)列 quiOriginalImagem-1n.push(temp); SeedCountsiOriginalImagem-1n+; if(m<row-1) if(!LabelImagem+1n)/下方若 未處理 temp.x=m+1; temp.y=n; LabelImagem+1n=i+1;/下方點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域 if(OriginalImagem+1n<=WaterLevel)/下方若為可生長(zhǎng)點(diǎn)則加入當(dāng)前隊(duì)列 quiWaterLevel.push(temp); else/否則加入 OriginalImagem+1n級(jí)隊(duì)
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;/右邊點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域 if(OriginalImagemn+1<=WaterLevel)/右邊若為可生長(zhǎng)點(diǎn)則加入當(dāng)前隊(duì)列 quiWaterLevel.push(temp); else/否則加入 OriginalImagemn+1級(jí)隊(duì)列 quiOriginalImagemn+1.push(temp); SeedCountsiOriginalImagemn+1+; if(n>0) if(!LabelImagemn-1)/左邊若未處理 temp.x=m; temp.y=n-1; LabelImagemn-1=i+1;/左邊點(diǎn)標(biāo)記為已淹沒(méi)區(qū)域 if(OriginalImagemn-1<=WaterLevel)/左邊若為可生長(zhǎng)點(diǎn)則加入當(dāng)前隊(duì)列 quiWaterLevel.push(temp); else/否則加入 OriginalImagemn-1級(jí)隊(duì)列 quiO
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年工業(yè)涂料水性色漿項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 印刷品規(guī)定五項(xiàng)管理制度
- 景點(diǎn)日常安全管理制度
- 司法鑒定人助理管理制度
- 施工安全評(píng)價(jià)管理制度
- 出租車公司監(jiān)控管理制度
- 智能車間分級(jí)管理制度
- 護(hù)理人員培訓(xùn)及管理制度
- 旅游企業(yè)統(tǒng)計(jì)管理制度
- 2025年口服溶液劑項(xiàng)目提案報(bào)告模板
- 勞務(wù)班組施工合同范本(2024版)
- 四川省眉山市2023-2024學(xué)年高一下學(xué)期期末考試英語(yǔ)試題(無(wú)答案)
- 北京市西城區(qū)2023-2024學(xué)年五年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- 湖南建筑工程定額
- 四川省成都天府新區(qū)2024年八年級(jí)下學(xué)期末物理試題附答案
- (完整版)增值稅申報(bào)表帶公式模板
- 期末考試卷2《心理健康與職業(yè)生涯》(原題卷)高一思想政治課(高教版2023基礎(chǔ)模塊)
- 數(shù)字圖像處理與機(jī)器視覺(jué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年溫州理工學(xué)院
- 英文經(jīng)典電影賞析智慧樹(shù)知到期末考試答案2024年
- 從安全意識(shí)到安全行為習(xí)慣的養(yǎng)成
- 七下第三單元《駱駝祥子》整本書閱讀 公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論