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.
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
@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
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