Wie segmentiere ich dieses Bild mithilfe einer Wasserscheide, um nur die Personen im Bild abzurufen?
Bisher habe ich Folgendes getan:
- Berechnete einen Gradienten
- Berechnete die Wasserscheidetransformation
Mein Code:
clear;
I=imread('inpaint.jpg');
I=rgb2gray(I);
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)')
L = watershed(gradmag);
% Lrgb = label2rgb(L);
figure, imshow(L), title('Watershed transform of gradient magnitude (Lrgb)')
Es ist mir gelungen, die Wasserscheide anzuwenden
Wollten Sie wissen, ob ich meine Objekte im Originalbild so umreißen kann, dass sie segmentiert erscheinen?
Antworten:
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.
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.
quelle
Sie können die Funktion bwperim verwenden. Einige gute Beispiele hier http://blogs.mathworks.com/steve/2006/06/02/cell-segmentation/
quelle