1. 程式人生 > >使用距離變換的分水嶺分割

使用距離變換的分水嶺分割

針對分割,與分水嶺變換相配合的常用工具是距離變換。二值影象的距離變換是相對簡單的概念:是指從每個畫素到最接近零值的畫素的距離。例如,圖10-25(a)顯示了一個小的二值影象矩陣。圖10-25(b)顯示了相應的距離變換。注意,每個值為1的畫素的距離變換為0,因為最靠近的非0畫素是它本身。距離變換可以用工具箱函式bwdist來計算,呼叫語法為:

  1. D = bwdist(f) 

例10.15  使用距離變換和分水嶺變換分割二值影象

在這個例子中,我們說明如何與工具箱的分水嶺變換一起,使用距離變換分割彼此有些接觸的圓形水滴。特別是,我們想要分割圖9-29(b)中處理過的銷釘影象。首先,正如10.3.1節中描述的那樣,使用im2bw和graythreshi把影象變換為二值影象:

  1. >>g = im2bw(f, graythresh(f)); 

圖10-26(a)顯示了結果。下一步是對影象求補,計算距離變換。然後,用函式watershed計算距離變換的負分水嶺變換。該函式的呼叫語法是:

  1. L =  watershed(A,conn) 

其中,L是在9.4節討論和定義過的標記矩陣。A是輸入陣列(一般可以是任何維數,但在本章是二維),並且conn指定了連通性(對於二維陣列是4或8(預設值))。在L中,正整數與匯水盆地相對應,零值指出分水嶺的脊線畫素:

  1. >>gc = ~g;  
  2. >>D = bwdist(gc);  
  3. >>L = 
    watershed(?D);  
  4. >>w = L == 0; 

圖10-26(b)和(c)顯示了求補後的影象及其距離變換。因為L的0值畫素是分水嶺的脊線畫素,前面程式碼的最後一行計算二值影象w,圖中僅顯示這些畫素。分水嶺的脊線影象顯示於圖10-26(d)中。最後,使用原始的二值影象和影象w的"補",通過邏輯AND操作完成分割,如圖10-26(e)所示:

  1. >>gg2 = g&-w; 

注意,圖10-20(e)中的某些物體沒有很好地分開。這被稱為過分割,這是使用基於分水嶺的分割方法時常常會出現的問題。下邊將討論克服這一問題的不同技術。