2

我想在Matlab中實現「自適應分水嶺分割」。 這個算法有六個步驟。輸入是圖(a),結果是圖(d)。 請你幫我檢查我的代碼是否有任何錯誤,並且我不知道如何執行第六步。 非常感謝!在Matlab中實現自適應分水嶺分割

Input image

Result image

負載圖像:

input_image = imread('test.gif'); 

步驟1:計算d(X,Y)在每個(X,Y),得到二值的歐幾里德距離圖圖像並將M(x,y)的每個值分配爲0.

DT = bwdist(input_image,'euclidean'); % Trandform distance:Euclidian distance 
[h,w]=size(DT); 
M = zeros(h,w); 

步驟2 :使用高斯濾波器對距離圖進行平滑以合併相鄰最大值,如果D(x,y)是局部最大值,則將M(x,y)設爲1,然後獲得距離圖的標記圖。

H = fspecial('gaussian'); 
gfDT = imfilter(DT,H); 
M = imregionalmax(gfDT); % maker map, M = local maximum of gfDT 

第3步:逐像素掃描標記圖。如果M(x0,y0)爲1,則尋找半徑爲D(x,y)的鄰域中的虛假最大值。當M(x,y)等於1且sqr((xx0)^ 2 +如果D(x,y)爲D(x0,y0),則將M(x,y)設置爲0。

for x0 = 1:h 
    for y0 = 1:w 
     if M(x0,y0) == 1 
      r = ceil(gfDT(x0,y0)); 

      % range begin:(x0-r,y0-r) end:(x0+r,y0+r) 
      xb = x0-r; 
      if xb <= 0 
       xb =1; 
      end 

      yb = y0-r; 
      if yb <= 0 
       yb =1; 
      end 

      xe = x0+r; 
      if xe > w 
      xe = w; 
      end 

      ye = y0+r; 
      if ye > h 
       ye = h; 
      end 

      for x = yb:ye 
       for y = xb:xe 
        if M(x,y)==1 
         Pos = [x0,y0 ;x,y]; 
         Dis = pdist(Pos,'euclidean'); 
         IFA = Dis<= (gfDT(x0,y0)); 
         IFB = gfDT(x,y)<gfDT(x0,y0); 
         if (IFA && IFB) 
          M(x,y) = 0; 
         end 
        end 
       end 
      end 
     end 
    end 
end 

步驟4:

計算距離圖的倒數,和局部最大值變成是局部最小值。

igfDT = -(gfDT); 

STEP5:

段根據由常規分水嶺算法的標誌物和獲得的二值圖像的分割距離圖。

I2 = imimposemin(igfDT,M); 
L = watershed(I2); 
igfDT (L==0)=0; 

步驟6:通過分水嶺線的端部與一個直線連接和重新分類沿着直線的像素拉直分水嶺線。

我不知道如何實現這一步

回答

1

嘗試距離變換,然後分水嶺變換。

im=imread('n6BRI.gif'); 

imb=bwdist(im); 

sigma=3; 
kernel = fspecial('gaussian',4*sigma+1,sigma); 
im2=imfilter(imb,kernel,'symmetric'); 

L = watershed(max(im2(:))-im2); 
[x,y]=find(L==0); 

lblImg = bwlabel(L&~im); 

figure,imshow(label2rgb(lblImg,'jet','k','shuffle')); 

enter image description here