0

Ich habe dieses BW Bild:Bildsegmentierung Matlab

Mask Object Connected

und die Funktion RegionProps verwenden, zeigt es, dass einige objetcs verbunden sind: Region Props

Also ich morphologische Operationen wie imerode verwendet die separte Objekte, um ihre Zentroide zu erhalten: Objects separated Centroids

Jetzt habe ich alle Schwerpunkte jedes Objekts sep Aber ich habe eine Menge Informationen verloren, als ich die Region erodiert habe, wie Sie in Bild 3 im Vergleich zu Bild 1 sehen können. Ich dachte also, ob es das Bild 3 "dilatieren" soll, bis es näher am Bild ist 1, aber ohne die Objekte erneut zu verbinden.

+0

Sie fragen uns, wie Sie das letzte Bild machen, das Sie haben? nun, da ist es, du hast es gezeigt. Was brauchst du noch? Die letzte Art scheint alle Informationen zu haben, die Sie brauchen. Wenn Sie den Bereich der verschiedenen Kreise erhalten möchten, schlage ich vor, dass Sie versuchen, eine Ellipse an jeden Ihrer Kreismittelpunkte anzupassen. –

Antwort

3

Vielleicht möchten Sie einen Blick auf bwmorph() werfen. Mit dem Namen-Wert-Paar 'verdicken', inf, werden die Beschriftungen verdickt, bis sie sich überlappen. Es ist ein nettes Werkzeug für die Segmentierung. Wir können damit Segmentierungsgrenzen für das Originalbild erstellen.

bw ist das Originalbild. Etiketten ist das Bild der erodierten Etiketten.

lines = bwmorph(labels, 'thicken', inf); 

Image of segmentation lines

segmented_bw = bw & lines 

enter image description here

Sie könnten auch ein paar Phasen überspringen und ähnliche Ergebnisse mit einem Marker auf Basis Wendepunkt zu erreichen. Oder noch besser, weil die morphologische Wippe einige Informationen zerstört hat, wie sie auf dem schlecht segmentierten Cluster rechts unten zu sehen sind.

+0

Ich habe bereits Wasserscheide ausprobiert, aber es zeigte nicht das Ergebnis, das ich wollte. Aber mit der morphologischen Operation verdickt es mir einige positive Ergebnisse. In einigen Fällen löschen Sie einige Informationen, aber ich werde es mit dieser Methode ausarbeiten. Danke für Ihre nützliche Idee. –

1

Sie können jedes weißes Pixel in der Maske auf den nächsten Schwerpunkt zuweisen und mit dem resultierenden Beschriftungsmap arbeiten:

[y x]= find(bw); % get coordinates of mask pixels 
D = pdist2([x(:), y(:)], [cx(:), cy(:)]); % assuming cx, cy are centers' coordinates 
[~, lb] = min(D, [], 2); % find index of closest center 
lb_map = 0*bw; 
lb_map(bw) = lb; % should give you the map. 

Siehe pdist2 für weitere Informationen.