7

Ich habe eine Frage zu folgendem Szenario. Als ich ein Bild nachbearbeite, habe ich eine Kontur bekommen, die leider zweimal verbunden ist, wie Sie in der unteren Zeile sehen können. Um es klar zu machen, was ich will, ist nur die Outer-Linie. Deshalb habe ich gezoomt und markiert die Zeile, ich möchte das große Bild.Morphologische Trennung von zwei verbundenen Grenzen

Was ich aus dieser Auswahl will, ist nur der äußere Teil, den ich als grün im nächsten Bild markiert habe. Entschuldigung für meine schlechten Zeichenkünste. ;)

Ich benutze MatLab mit dem IPT. Also habe ich auch versucht, mit bwmorph und der hbreak Option zu erkennen, aber es gab einen Fehler.

Wie löse ich dieses Problem? Wenn Sie erfolgreich waren, können Sie mir bitte etwas mehr darüber erzählen? Vielen Dank im Voraus!

Mit freundlichen Grüßen

Antwort

1

ich auch bwmorph

%# find the branch point 
branchImg = bwmorph(img,'branchpoints'); 

%# grow the pixel to 3x3 
branchImg = imdilate(branchImg,ones(3)); 

%# hide the branch point 
noBranchImg = img & ~branchImg; 

%# label the three lines 
lblImg = bwlabel(noBranchImg); 

%# in the original image, mask label #3 
%# note that it may not always be #3 that you want to mask 
finalImg = img; 
finalImg(lblImg==3) = 0; 

%# show the result 
imshow(finalImg) 
+0

Sie erwähnten, dass es nicht immer 3 sein kann ... was ist der Grund dafür? für mein Verständnis ist es immer eine 1px widthened Linie/Kontur, die dieses Muster (von 3) passt ..? – mchlfchr

+0

@mchlfchr: Im Schritt "bwlabel" werden den drei getrennten Zeilen die Beschriftungen 1,2 bzw. 3 zugewiesen. Es ist möglicherweise nicht immer der Teil 3, den Sie entfernen möchten. – Jonas

+0

also ist es nicht möglich, die "outter" -Leitung für jeden Fall auszuwählen? Wie ich den 'hbreak' Weg verstanden habe, trennt er solche dreifach verbundenen Strukturen? Im nächsten Schritt hätte ich dieses externe Label ausgewählt, aber die Option 'hbreak' funktioniert aus welchem ​​Grund nicht. – mchlfchr

2

Es scheint, Ihr Eingangsbild ist ein bisschen anders als die, die Sie auf dem Laufenden verwenden würde, da ich nicht direkt die Verzweigungspunkte sammeln konnte (es gab zu viele von ihnen). Um mit der Bearbeitung Ihres Problems zu beginnen, erwäge ich eine Ausdünnung, gefolgt von einer Verzweigungspunkt-Erkennung. Ich dehne sie auch aus und entferne sie aus dem ausgedünnten Bild, das garantiert, dass tatsächlich keine Verbindung (4 oder 8) zwischen den verschiedenen Segmenten im Anfangsbild besteht.

f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0); 
g = bwmorph(f, 'thin', 'Inf'); 
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate'); 

Da h hält getrennte Segmente, die folgende Operation die Endpunkte aller Segmente sammelt: Jetzt

u = bwmorph(h, 'endpoints'); 

ich einige schnelle Analyse tat, um tatsächlich zu lösen Ihr Problem auf, was Sie verwerfen wollen. Betrachte zwei verschiedene Segmente, a und b, in h. Wir sagen a und b überlappen, wenn die Endpunkte der einen in der anderen enthalten ist. Mit contained meine ich einfach, wenn der Start-x-Punkt von eins kleiner oder gleich dem anderen ist und der Endpunkt x größer oder gleich ist. In Ihrem Fall überlappt der "Berg" mit dem Segment, das Sie entfernen möchten. Um festzustellen, welche von ihnen Sie entfernen, betrachten Sie deren Bereich. Da es sich jedoch um Segmente handelt, ist die Fläche ein bedeutungsloser Begriff. Um das zu handhaben, habe ich die Endpunkte eines Segments verbunden und als Bereich einfach die inneren Punkte verwendet. Wie Sie deutlich erkennen können, ist die Fläche des überlappten Segments unten sehr klein, also sagen wir, dass es sich im Grunde um eine Linie handelt und verwerfen Sie sie, während Sie das Segment "Berg" beibehalten. Für diesen Schritt ist das Bild u von grundlegender Bedeutung, da Sie damit eine klare Aussage darüber erhalten, wo Sie eine Kontur starten und stoppen müssen. Wenn Sie das Bild h unverändert verwendet hätten, hätten Sie Schwierigkeiten, zu bestimmen, wo die Punkte einer Kontur zu beginnen und zu stoppen sind (d. H. Die Rasterreihenfolge würde zu einer falschen Überlappungsanzeige führen).

Um das Segment als ein einzelnes zu rekonstruieren (derzeit haben Sie drei), berücksichtigen Sie die Punkte, die Sie aus g in h verworfen haben, und verwenden Sie diejenigen, die nicht zum jetzt entfernten unteren Segment gehören.