Wie wende ich eine Wasserscheide auf Segmentbilder mit Matlab an?

7

Geben Sie hier die Bildbeschreibung ein

Wie segmentiere ich dieses Bild mithilfe einer Wasserscheide, um nur die Personen im Bild abzurufen?

Bisher habe ich Folgendes getan:

  1. Berechnete einen Gradienten

Geben Sie hier die Bildbeschreibung ein

  1. Berechnete die Wasserscheidetransformation

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

Wollten Sie wissen, ob ich meine Objekte im Originalbild so umreißen kann, dass sie segmentiert erscheinen?

vini
quelle
Etwas tangential, aber verwenden Sie die Bildverarbeitungslizenz von MATLAB von einer Universität oder einem Unternehmen? Ich habe es mir angesehen und es scheint ziemlich teuer zu sein: - /
Spacey
Ja, meine Universität hat eine Lizenz ...
vini
1
@Mohammad Octave verfügt über fast alle Funktionen in der Bildverarbeitungs-Toolbox von MATLAB, und in vielen Fällen ist der Code kompatibel.
@reve_etrange Ah danke dafür !! Ich werde mich darum kümmern müssen - mein alter Chef hat immer schlechte Dinge über die Oktave gesagt, als ob sie keine großen Matrizen enthalten könnte, keine schöne Benutzeroberfläche wie Matlab usw. usw., also habe ich mich nie wirklich damit befasst ...
Spacey
@Mohammad Auch die Bildverarbeitungs-Toolbox von Scilab wächst und gedeiht. Ich bin mir nicht sicher, ob es noch das bietet, wonach Sie suchen.
Phonon

Antworten:

8

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;
reve_etrange
quelle
Alle meine Bilder haben die gleichen Bedingungen wie in diesem Bild dargestellt. Wird kein Schwellenwert als schlechtes Segmentierungsmittel angesehen und ja, ich möchte sie als verschiedene Objekte zeigen
vini
Schwellenwerte können bei Bildern mit ungeraden Histogrammen zu ungeraden Ergebnissen führen, und ein bestimmter Schwellenwert ist normalerweise nur für ein einzelnes Bild nützlich, aber an ihnen ist nichts von Natur aus "schlecht". Die Methode von Otsu sollte sich in der Toolbox eines Computer Vision Codierers befinden - wenden Sie sie nur nicht blind an.
Ja, es ist vorhanden, aber die Ergebnisse waren nicht zufriedenstellend, als ich es angewendet habe
vini
Überprüfen Sie mein Segmentierungsergebnis. Ist es gut genug? =)
vini
@vini: Jede Bildsegmentierung erfordert irgendwann eine Art Schwellenwert, da Sie eine Entscheidung treffen müssen, ob ein Objekt irgendwann Teil des Vordergrunds oder des Hintergrunds ist.
Jonas