2013-12-16 20 views
5

ich die 2-D Watershed example in Mathworks.com folgte die verbundenen Objekte zu trennen, wie das Bild unten:Over-Segmentierung von Watershed-Algorithmus

Imgur

Der Code wie zusammenfassen:

bw = imread('some_binary_image.tif'); 

D = -bwdist(~bw); 

D(~bw) = -Inf; 

L = watershed(D); 

Das Ergebnis ist:

Imgur

Das Teilchen in der Mitte wurde in zwei Teile getrennt. Gibt es Möglichkeiten, die Übersegmentierung hier zu vermeiden?

Danke, Lennon310, chessboard funktioniert gut für die meisten meiner Bilder, aber es gibt immer noch einige Fälle, die es nicht tut. Zum Beispiel kann die folgende binäre Bild: Imgur

Schachbrett Mit bewirkt: Imgur

Wie ich Hunderte von Bildern haben, scheint es, dass es schwierig ist, eine Kombination von Parametern zu finden, die für alle Bilder arbeiten . Ich frage mich, ob ich die guten Ergebnisse aus der Verwendung Schachbrett bekamen kombinieren müssen, cityblock, etc ...

+0

was ist Ihr Ziel von Hunderten von Bildverarbeitung? Es ist nicht erforderlich, ein Wassereinzugsgebiet zu verwenden, um die Objekte zu extrahieren. Da zwischen zwei Kreisen in Ihrem Bild winzige Verbindungen bestehen, funktioniert die grundlegende Methode zum Beschriften der verbundenen Komponenten möglicherweise ebenfalls nicht. Tatsächlich gibt es in der Matlab-Bildverarbeitungs-Toolbox Kreisdetektoren (Hough, Imfindcircles, ...). – lennon310

+0

@ lennon310: Dies sind tatsächlich Bilder, die mit Röntgen-Tomographie aufgenommen wurden. Ich möchte eine Maske für das Teilchen meines Interesses erstellen. Momentan verwende ich Connected Threshold Grower in ImageJ, der die verbundene Region von einem Startpunkt aus findet.Durch Setzen des Startpunkts auf das interessierende Partikel kann der Connected Threshold Grower ein Ergebnis erzeugen, das nur dieses Partikel enthält, wenn es keine anderen Partikel berührt. Jetzt lösche ich manuell die berührende Grenze für Hunderte von Bildern, was zeitaufwendig ist. Ich versuche Wasserscheide zu verwenden, um diese Partikel automatisch zu trennen. – shapeare

+0

Die Röntgenbilder sind keine Binärbilder, oder? Ich denke, dass die verbundene Komponente erkannt werden kann, oder sogar Cluster-Algorithmus ist es wert, die Rohbilder basierend auf der Intensitätsdifferenz zu versuchen. Für binäres Bild, besonders Ihr aktualisiertes, ist es schwierig, die zwei tatsächlich verbundenen Kreise zu segmentieren. – lennon310

Antwort

7

Verwenden max(abs(x1-x2),abs(y1-y2)) als Abstandsmetrik (Schachbrett), und verwenden Sie acht verbundene Nachbarschaft in watershed Funktion:

bw=im2bw(I); 

D = -bwdist(~bw,'chessboard'); 
imagesc(D) 
D(~bw) = -Inf; 

L = watershed(D,8); 
figure,imagesc(L) 

Ergebnis: enter image description here

3

ich habe eine Zeit lang mit dem gleichen Problem zu tun. Für mich bestand die Lösung darin, stattdessen eine markerbasierte Watershed-Methode zu verwenden. Sucht Beispiele auf Wendepunkt-Methode auf dem Matlab gegeben Blog von Steve: http://blogs.mathworks.com/steve/ Diese Methode wird von ihm gegeben war für mich am besten: http://blogs.mathworks.com/steve/2013/11/19/watershed-transform-question-from-tech-support/

jetzt in einer idealen Welt würden wir eine einzige Methode in der Lage richtig zu segmentieren alles mit . Aber Wasserscheide über oder unter segmentiert einige Teilchen, egal welche Methode Sie verwenden (es sei denn, Sie geben die Marker manuell). Also verwende ich derzeit eine halbautomatische Segmentierungsmethode; d. h. Wasserscheide verwenden, um das Bild so gut wie möglich zu segmentieren, und dann dieses Bild in MSPaint aufzunehmen und es manuell zu bearbeiten, um zu korrigieren, was immer unter/über Segmentierung bleibt.

Die Region wächst scheint in der Vergangenheit von einigen Menschen verwendet worden. Aber mein Bildverarbeitungswissen ist begrenzt, daher kann ich Ihnen nicht helfen. Es wäre großartig, wenn irgendjemand etwas darüber veröffentlichen könnte, wie man mit regional wachsenden Bildern ein solches Bild segmentieren kann.

Hoffe, das hilft.