Denken Sie daran, dass die Watershed-Transformation ihre Eingabe als topografische Karte behandelt und simuliert, dass diese Topografie mit Wasser überflutet wird. Die "Einzugsgebiete" oder "Wassereinzugsgebiete" sind dann die Teile der Karte, die "Wasser halten", ohne in andere Regionen zu gelangen.
Die Gradientengröße ist eine schlechte Segmentierungsfunktion wie sie ist; Das Rauschen und die offenen Konturen führen zu einer extremen Übersegmentierung des Bildes. Wir können eine Reihe von morphologischen Operationen ausprobieren, um ungefähre Vordergrund- und Hintergrundmarkierungen zu erstellen, und diese verwenden, um die unechten Teile des Gradienten zu entfernen.
%# Normalize.
g = gradmag - min(gradmag(:));
g = g / max(g(:));
th = graythresh(g); %# Otsu's method.
a = imhmax(g,th/2); %# Conservatively remove local maxima.
th = graythresh(a);
b = a > th/4; %# Conservative global threshold.
c = imclose(b,ones(6)); %# Try to close contours.
d = imfill(c,'holes'); %# Not a bad segmentation by itself.
%# Use the rough segmentation to define markers.
g2 = imimposemin(g, ~ imdilate( bwperim(a), ones(3) );
L = watershed(g2);
Das funktioniert OK. Sie erhalten beide Personengruppen und ihre Schatten als Regionen mit ein wenig Lärm.
Können Sie Ihre Ziele näher erläutern? Das heißt, werden Sie viele verschiedene Bilder oder nur Bilder segmentieren, die diesem Beispiel sehr ähnlich sind? Müssen Sie die Schatten ignorieren und die beiden überlappenden Personen trennen?
Ich werde versuchen, die Antwort zu aktualisieren, wenn Sie auf diese Fragen antworten.
Segmentierungsüberlagerung
Sie haben gefragt, wie eine Segmentierung überlagert werden soll. Eine Möglichkeit besteht darin, die Wasserscheidenlinien zu verwenden, um Pixel im Original anzugeben und sie auf eine helle Farbe zu setzen.
boundaries = L == 0;
I(boundaries) = 255;