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
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