亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? watershed.txt

?? 用標記-分水嶺算法對輸入圖像進行分割,是在Vc++下的程序代碼
?? TXT
字號:
//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 Foxhole@smth.org
// =====     e-mail: gong200@china.com
// ===========================================================================
// Permission to use, copy, or modify this 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 distribution 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 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, ARISING OUT OF OR IN CONNECTION WITH THE USE
// OR PERFORMANCE OF THIS SOFTWARE.
// ===========================================================================

#include <queue>
#include <vector>
#include <windows.h>


/*====================================================================
函數名            :    Watershed
功能            :    用標記-分水嶺算法對輸入圖像進行分割
算法實現        :    無
輸入參數說明    :    OriginalImage --輸入圖像(灰度圖,0~255)
                     SeedImage   --標記圖像(二值圖,0-非標記,1-標記)
                     LabelImage   --輸出圖像(1-第一個分割區域,2-第二個分割區域,...)
                     row       --圖像行數
                     col       --圖像列數
返回值說明        :    無    
====================================================================*/
void Watershed(const int **OriginalImage, char** SeedImage, int **LabelImage, int row, int col)
{
   using namespace std;

   //標記區域標識號,從1開始
   int Num=0;
   int i,j;

   //保存每個隊列種子個數的數組
   vector<int*> SeedCounts;
   //臨時種子隊列
   queue<POINT> que;
   //保存所有標記區域種子隊列的數組
   vector<queue<POINT>* > qu;
   
   int* array;
   queue<POINT> *uu;
   POINT temp;

   for(i=0;i<row;i++)
       for(j=0;j<col;j++)
           LabelImage[j]=0;
   

   int m,n,k=0;
   int up,down,right,left,upleft,upright,downleft,downright;

   //預處理,提取區分每個標記區域,并初始化每個標記的種子隊列
   //種子是指標記區域邊緣的點,他們可以在水位上升時向外淹沒(或者說生長)
   for(i=0;i<row;i++)
   {
       for(j=0;j<col;j++)
       {
           //如果找到一個標記區域
           if(SeedImage[j]==1)
           {
               //區域的標識號加一
               Num++;
               //分配數組并初始化為零
               array=new int[256];
               ZeroMemory(array,256*sizeof(int));
               //
               SeedCounts.push_back(array);
               //分配本標記的優先隊列
               uu=new queue<POINT>[256];
               //加入到隊列數組中
               qu.push_back(uu);
               //當前點放入本標記區域的臨時種子隊列中
               temp.x=i;
               temp.y=j;
               que.push(temp);
               //當前點標記為已處理
               LabelImage[j]=Num;
               SeedImage[j]=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(SeedImage[m-1][n]==1)
                       {
                           temp.x=m-1;
                           temp.y=n;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m-1][n]=Num;
                           SeedImage[m-1][n]=127;
                       }else//否則上方為不可生長
                       {
                           up=1;
                       }
                   }
                   if(m>0&&n>0)
                   {
                       if(SeedImage[m-1][n-1]==1)//左上方若為可生長點則加為新種子
                       {
                           temp.x=m-1;
                           temp.y=n-1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m-1][n-1]=Num;
                           SeedImage[m-1][n-1]=127;
                       }else//否則左上方為不可生長
                       {
                           upleft=1;
                       }
                   }

                   if(m<row-1)
                   {
                       if(SeedImage[m+1][n]==1)//下方若為可生長點則加為新種子
                       {
                           temp.x=m+1;
                           temp.y=n;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m+1][n]=Num;
                           SeedImage[m+1][n]=127;
                       }else//否則下方為不可生長
                       {
                           down=1;
                       }
                   }
                   if(m<(row-1)&&n<(col-1))
                   {
                       if(SeedImage[m+1][n+1]==1)//下方若為可生長點則加為新種子
                       {
                           temp.x=m+1;
                           temp.y=n+1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m+1][n+1]=Num;
                           SeedImage[m+1][n+1]=127;
                       }else//否則下方為不可生長
                       {
                           downright=1;
                       }
                   }
               
                   if(n<col-1)
                   {
                       if(SeedImage[m][n+1]==1)//右方若為可生長點則加為新種子
                       {
                           temp.x=m;
                           temp.y=n+1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m][n+1]=Num;
                           SeedImage[m][n+1]=127;
                       }else//否則右方為不可生長
                       {
                           right=1;
                       }
                   }
                   if(m>0&&n<(col-1))
                   {
                       if(SeedImage[m-1][n+1]==1)//右上方若為可生長點則加為新種子
                       {
                           temp.x=m-1;
                           temp.y=n+1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m-1][n+1]=Num;
                           SeedImage[m-1][n+1]=127;
                       }else//否則右上方為不可生長
                       {
                           upright=1;
                       }
                   }

                   if(n>0)
                   {
                       if(SeedImage[m][n-1]==1)//左方若為可生長點則加為新種子
                       {
                           temp.x=m;
                           temp.y=n-1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m][n-1]=Num;
                           SeedImage[m][n-1]=127;
                       }else//否則左方為不可生長
                       {
                           left=1;
                       }
                   }
                   if(m<(row-1)&&n>0)
                   {
                       if(SeedImage[m+1][n-1]==1)//左下方若為可生長點則加為新種子
                       {
                           temp.x=m+1;
                           temp.y=n-1;
                           que.push(temp);
                           //新種子點標記為已淹沒區域
                           LabelImage[m+1][n-1]=Num;
                           SeedImage[m+1][n-1]=127;
                       }else//否則左方為不可生長
                       {
                           downleft=1;
                       }
                   }

                   //上下左右只要有一點不可生長,那么本點為初始種子隊列中的一個
                   if(up||down||right||left||
                       upleft||downleft||upright||downright)
                   {
                       temp.x=m;
                       temp.y=n;
                       qu[Num-1][OriginalImage[m][n]].push(temp);
                       SeedCounts[Num-1][OriginalImage[m][n]]++;
                   }

               }//while結束
           }
       }
   }

   bool actives;//在某一水位處,所有標記的種子生長完的標志
   int WaterLevel;

   //淹沒過程開始,水位從零開始上升
   for(WaterLevel=0;WaterLevel<256;WaterLevel++)
   {
       actives=true;
       while(actives)
       {
           actives=false;
           //依次處理每個標記區域
           for(i=0;i<Num;i++)
           {
           if(!qu[WaterLevel].empty())
           {
               actives=true;
               while(SeedCounts[WaterLevel]>0)
               {
                   SeedCounts[WaterLevel]--;
                   temp=qu[WaterLevel].front();
                   qu[WaterLevel].pop();
                   m = temp.x;
                   n = temp.y;//當前種子的坐標
                   if(m>0)
                   {
                       if(!LabelImage[m-1][n])//上方若未處理
                       {
                           temp.x=m-1;
                           temp.y=n;
                           LabelImage[m-1][n]=i+1;//上方點標記為已淹沒區域

                           if(OriginalImage[m-1][n]<=WaterLevel)//上方若為可生長點則加入當前隊列
                           {
                               qu[WaterLevel].push(temp);
                           }
                           else//否則加入OriginalImage[m-1][n]級隊列
                           {
                               qu[OriginalImage[m-1][n]].push(temp);
                               SeedCounts[OriginalImage[m-1][n]]++;
                           }
                       }
                   }

                   if(m<row-1)
                   {
                       if(!LabelImage[m+1][n])//下方若未處理
                       {
                           temp.x=m+1;
                           temp.y=n;
                           LabelImage[m+1][n]=i+1;//下方點標記為已淹沒區域

                           if(OriginalImage[m+1][n]<=WaterLevel)//下方若為可生長點則加入當前隊列
                           {
                               qu[WaterLevel].push(temp);
                           }
                           else//否則加入OriginalImage[m+1][n]級隊列
                           {
                               qu[OriginalImage[m+1][n]].push(temp);
                               SeedCounts[OriginalImage[m+1][n]]++;
                           }
                       }
                   }
           
                   if(n<col-1)
                   {
                       if(!LabelImage[m][n+1])//右邊若未處理
                       {
                           temp.x=m;
                           temp.y=n+1;
                           LabelImage[m][n+1]=i+1;//右邊點標記為已淹沒區域

                           if(OriginalImage[m][n+1]<=WaterLevel)//右邊若為可生長點則加入當前隊列
                           {
                               qu[WaterLevel].push(temp);
                           }
                           else//否則加入OriginalImage[m][n+1]級隊列
                           {
                               qu[OriginalImage[m][n+1]].push(temp);
                               SeedCounts[OriginalImage[m][n+1]]++;
                           }
                       }
                   }

                   if(n>0)
                   {
                       if(!LabelImage[m][n-1])//左邊若未處理
                       {
                           temp.x=m;
                           temp.y=n-1;
                           LabelImage[m][n-1]=i+1;//左邊點標記為已淹沒區域

                           if(OriginalImage[m][n-1]<=WaterLevel)//左邊若為可生長點則加入當前隊列
                           {
                               qu[WaterLevel].push(temp);
                           }
                           else//否則加入OriginalImage[m][n-1]級隊列
                           {
                               qu[OriginalImage[m][n-1]].push(temp);
                               SeedCounts[OriginalImage[m][n-1]]++;
                           }
                       }
                   }
               }//while循環結束
               SeedCounts[WaterLevel]=qu[WaterLevel].size();
           }//if結束
           }//for循環結束
       }//while循環結束
   }//for循環結束
   while(!qu.empty())
   {
       uu=qu.back();
       delete[] uu;
       qu.pop_back();
   }
   while(!SeedCounts.empty())
   {
       array=SeedCounts.back();
       delete[] array;
       SeedCounts.pop_back();
   }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色婷婷久久58| 777午夜精品视频在线播放| 国产精品99久久久久| 精品一区二区影视| 成人免费观看av| 欧美视频中文字幕| 337p粉嫩大胆色噜噜噜噜亚洲| 久久久久久9999| 亚洲欧洲精品成人久久奇米网| 亚洲综合免费观看高清完整版在线| 一区二区三区四区av| 美女视频免费一区| 欧美日韩精品系列| 欧美久久久久免费| 精品99久久久久久| 亚洲乱码国产乱码精品精小说 | 成人黄色片在线观看| 色悠悠久久综合| 国产欧美一区二区三区网站| 亚洲一二三四在线观看| 国产大陆a不卡| 91精品久久久久久久久99蜜臂| 久久久91精品国产一区二区精品| 一区二区三区 在线观看视频| 狠狠色综合播放一区二区| 欧美日韩国产区一| 亚洲国产一区二区视频| 成人av网址在线| www欧美成人18+| 精品亚洲成a人在线观看| 欧美亚洲自拍偷拍| 天天操天天综合网| 69久久99精品久久久久婷婷| 日韩va欧美va亚洲va久久| 精品视频在线免费看| 美日韩一区二区| 国产欧美综合色| 欧美亚洲一区二区三区四区| 三级在线观看一区二区| 国产亚洲1区2区3区| 91久久国产综合久久| 久久综合九色综合97婷婷女人 | 国产suv精品一区二区6| 国产蜜臀97一区二区三区| 成人免费福利片| 亚洲人成电影网站色mp4| 在线看国产一区| 美腿丝袜亚洲三区| 中文字幕日韩一区| 欧美日韩午夜在线| 国产一区二区在线影院| 中文字幕一区二区三区四区| 在线播放中文字幕一区| 九九九精品视频| 亚洲精品福利视频网站| 中文字幕av资源一区| 精品视频一区 二区 三区| 粉嫩一区二区三区在线看| 欧美一区二区视频在线观看2022| 亚洲成人免费av| 国产精品久久综合| 欧美一区二区在线免费播放| 精品亚洲国产成人av制服丝袜 | 99re这里都是精品| 蜜臀久久99精品久久久画质超高清| 国产精品第五页| 国产精品亲子伦对白| 欧美电影精品一区二区| 欧美日韩aaaaaa| 欧美视频一区二| 9久草视频在线视频精品| 国产成人精品影视| 麻豆91在线播放| 日本伊人午夜精品| 日韩激情一二三区| 日韩高清一级片| 日韩经典中文字幕一区| 奇米一区二区三区av| 麻豆国产欧美一区二区三区| 天堂资源在线中文精品| 午夜精品免费在线| 奇米精品一区二区三区在线观看一| 亚洲国产综合91精品麻豆| 亚洲第一激情av| 免费久久99精品国产| 轻轻草成人在线| 国产一区999| 91小视频在线免费看| 日本韩国欧美一区二区三区| 在线观看日韩精品| 欧美一区二区三区视频在线观看| 欧美乱妇15p| 久久香蕉国产线看观看99| 国产精品妹子av| 日韩精品视频网站| 激情综合五月天| 日韩欧美国产一区二区三区| 久久久综合激的五月天| 亚洲色图一区二区三区| 全国精品久久少妇| 91首页免费视频| 精品国产乱码久久久久久牛牛| 中文字幕国产精品一区二区| 香蕉加勒比综合久久| 国产一区二区三区在线观看免费视频 | 午夜欧美一区二区三区在线播放| 蜜桃视频一区二区| 色诱亚洲精品久久久久久| 久久精品欧美一区二区三区麻豆| 亚洲最新在线观看| 国产成人免费在线观看| 91麻豆精品国产91久久久久| 亚洲美女区一区| 99国产一区二区三精品乱码| 精品国产一区二区亚洲人成毛片 | 91精品国产欧美日韩| 亚洲免费电影在线| 99re8在线精品视频免费播放| 欧美一区二区在线播放| 国产精品影视网| 26uuu色噜噜精品一区二区| 奇米色777欧美一区二区| 日韩一级二级三级| 五月综合激情网| 717成人午夜免费福利电影| 奇米色777欧美一区二区| 欧美大黄免费观看| 国产一区啦啦啦在线观看| 国产日本欧美一区二区| 91免费观看国产| 有坂深雪av一区二区精品| 欧洲一区二区三区在线| 亚洲成人黄色影院| 日韩欧美国产三级电影视频| 国精产品一区一区三区mba桃花| 精品日韩在线观看| 懂色av一区二区三区蜜臀| 亚洲一区二区三区中文字幕在线| 欧美视频日韩视频| 国产真实乱偷精品视频免| 亚洲人吸女人奶水| 欧美专区日韩专区| 国产一区二区91| 亚洲国产成人av网| 国产精品无遮挡| 欧美人牲a欧美精品| 国产91精品精华液一区二区三区| 成人免费一区二区三区在线观看| 欧美欧美欧美欧美| 9人人澡人人爽人人精品| 久久精品免费观看| 午夜精品久久久久久久久久久 | 九九精品一区二区| 日欧美一区二区| 亚洲六月丁香色婷婷综合久久| 日韩欧美国产综合在线一区二区三区| 91蜜桃在线免费视频| 国产麻豆成人精品| 日韩国产精品91| 日韩电影网1区2区| 亚洲高清免费一级二级三级| 一区免费观看视频| 国产欧美日韩在线| 免费精品视频最新在线| 亚洲地区一二三色| 亚洲综合在线第一页| 18涩涩午夜精品.www| 国产欧美一二三区| 国产精品卡一卡二| 亚洲欧美日韩综合aⅴ视频| 亚洲同性gay激情无套| 一区二区三区在线视频观看58| 成人欧美一区二区三区黑人麻豆| 国产精品久久久久影院亚瑟| 欧美国产日韩亚洲一区| 国产精品久久久99| 亚洲一区精品在线| 热久久免费视频| 成人美女视频在线观看18| 波多野结衣中文一区| 在线欧美日韩国产| 欧美成人高清电影在线| 精品久久久久久无| 国产午夜精品美女毛片视频| 国产校园另类小说区| 中文字幕不卡在线播放| 亚洲少妇最新在线视频| 午夜精品影院在线观看| 久久精品国产秦先生| 日韩高清不卡在线| 一区二区三区日本| 日本aⅴ免费视频一区二区三区| 奇米影视在线99精品| 99热精品一区二区| 欧美狂野另类xxxxoooo| 中文av一区二区| 亚洲午夜在线视频| 成人免费观看视频| 91浏览器打开| 777久久久精品|