OpenCV學習 9 分水嶺演算法 3

2021-09-06 12:01:13 字數 1688 閱讀 8737

本教程我學習一下opencv中分水嶺演算法的具體實現方式。

原始影象和mark影象,它們的大小都是32*32,分水嶺演算法的結果是得到兩個連通域的輪廓圖。

原始影象:(原始影象必須是3通道影象)

mark影象:

結果影象:

初始的mark影象資料如下,黃色的部分為我們的第乙個mark區域,值為255,第二個區域為褐紅色的區域,值為128,第三個綠色的區域,值為64。

opencv分水嶺演算法描述如下:

初始化mark矩陣,生成最初的注水區域。

1.設定mark影象的邊框值為-1

2. 標記每個mark區域的邊界為-2

3. 對於mark影象乙個畫素值,如果它本身值為0,但上下左右四鄰域有乙個畫素值不為0,則把該點按照rgb高度值放入相應的佇列。

舉例說明:如下圖畫素點,它的mark值為0,但左和上畫素值不為0,此時,我們求原始影象中對應畫素的高度值,高度值的計算方式如下面公式,其中r表示red通道值,g表示green通道值,b表示blue通道值,下標l表示左,r表示右,t表示上,b表示下,abs表示取絕對值,min和max分別為最小值和最大值函式:

上圖中指定的畫素,它的高度值顯然為0,所以我們把(2,2)點放入高度為0的佇列中(總共有256個佇列,對應0-255的高度)

初始化階段完成後,我們得到下面的mark圖,並把-2對應的邊界畫素點,按照其對應的rgb高度值放入相應的佇列。

之後就進入了遞迴注水過程,遞迴過程描述如下:

for(; ; )

經過上述的遞迴過程,最後我們得到的mark影象如下所示,其中綠色格仔的-1即為所有的分水嶺邊界:

**參見工程:firstopencv10

我們也可以把輸入影象換成灰度圖,這樣求高度值時,就比較簡單,void watershedgray(cv::mat &src, cv::mat &dst);該函式演示灰度圖的分水嶺演算法。

OpenCV學習 8 分水嶺演算法 2

現在我們看看opencv中如何使用分水嶺演算法。首先我們開啟一副影象 開啟另一幅影象 接下來,我們要建立mark影象。mark影象格式是有符號整數,其中沒有被mark的部分用0表示,其它不同區域的mark標記,我們用非零值表示,通常為1 255,但也可以為其它值,比如大於255的值,不同mark區域...

opencv 分水嶺演算法

分水嶺演算法是一種簡單的影象分割演算法,具體是人為規定兩點 以兩點為例 然後把這兩點看做低谷,向裡面注水,不停地蔓延,直到兩點形成的湖交界。opencv自帶了這個程式。摘抄如下,其中我做了一些修改。本程式的目的是測試分水嶺演算法 include include include include usi...

opencv實現分水嶺演算法

分水嶺演算法原理 iplimage marker mask 0 iplimage markers 0 iplimage img0 0,img 0,img gray 0,wshed 0 iplimage img gray 0,wshed 0 cvpoint prev pt void on mouse ...