2

Ich möchte "Adaptive Watershed Segmentierung" in Matlab implementieren. Es gibt sechs Schritte in diesem Algorithmus. Eingabe ist Abbildung (a) und Ergebnis ist Abbildung (d). Bitte helfen Sie mir zu überprüfen, ob es einen Fehler in meinem Code gibt, und ich weiß nicht, wie ich den sechsten Schritt implementieren soll. Vielen Dank!Implementieren Adaptive Wasserscheide Segmentierung in Matlab

Input image

Result image

Bild laden:

input_image = imread('test.gif'); 

Schritt 1: Berechnen D (x, y) an jedem (x, y), erhalten, um die euklidische Abstand Karte der binären Bild und weisen Sie jeden Wert von M (x, y) als 0 zu.

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

Schritt 2 : Glätten Sie die Entfernungskarte mit dem Gaußschen Filter, um die benachbarten Maxima zusammenzuführen, setzen Sie M (x, y) als 1, wenn D (x, y) ein lokales Maximum ist, und erhalten Sie dann die Markierungskarte der Entfernungskarte.

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

Schritt3: Scannen Sie die Markermap Pixel für Pixel. Wenn M (x0, y0) 1 ist, suche die Störmaxima in seiner Umgebung mit einem Radius von D (x, y) .Wenn M (x, y) gleich 1 und sqr ((x - x0)^2 + (y - y0)^2) ≤ D (x0, y0), setze M (x, y) als 0, wenn D (x, y) < D (x0, y0).

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 

Schritt 4:

Berechnen der Inversen der Abstandskarte und der lokalen Maxima erweisen sich die lokalen Minima sein.

igfDT = -(gfDT); 

Schritt 5:

Segment der Distanzkarte nach den Markierungen durch den herkömmlichen Wendealgorithmus und die Segmentierung von Binärbild zu erhalten.

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

Schritt 6: Begradigen der Wendelinien durch mit einer geraden Linie, die die Enden der Wendelinien verbindet und die Pixel entlang der geraden Linie Neueinstufung.

Ich weiß nicht, wie Sie diesen Schritt verwandeln

Antwort

1

Versuchen Abstand zu transformieren und dann Watershed zu implementieren.

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

Verwandte Themen