Wydaje obraz wejściowy jest nieco inny niż ten, który pisał, bo nie mógł bezpośrednio zbierać punkty filialne (były zbyt wielu z nich). Tak więc, aby zacząć rozwiązywać twój problem, rozważam rozrzedzenie, a następnie wykrywanie punktu rozgałęzienia. Rozszerzam je i usuwam z rozrzedzonego obrazu, co gwarantuje, że w rzeczywistości nie ma połączenia (4 lub 8) między różnymi segmentami na początkowym obrazie.
f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0);
g = bwmorph(f, 'thin', 'Inf');
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate');
Od h
posiada segmenty odłączony, po operacji zbiera punkty końcowe wszystkich segmentów:
u = bwmorph(h, 'endpoints');
Teraz faktycznie rozwiązać problemu zrobiłem jakąś szybką analizę tego, co chcesz, aby odrzucić. Rozważ dwa odrębne segmenty, a
i b
, w h
. Mówimy, że a
i b
nakładają się, jeśli punkty końcowe jednego są zawarte w drugim. Podsumowując, mam na myśli tylko to, że początkowy punkt x jednego jest mniejszy lub równy drugiemu, a końcowy punkt x jest również większy lub równy. W twoim przypadku "góra" pokrywa się z segmentem, który chcesz usunąć. Aby ustalić, które z nich usuniesz, rozważ ich obszar. Ale ponieważ są to segmenty, obszar jest terminem bez znaczenia. Aby sobie z tym poradzić, połączyłem punkty końcowe segmentu i wykorzystałem jako obszar po prostu punkty wewnętrzne. Jak można wyraźnie zauważyć, obszar nałożonego segmentu na dole jest bardzo mały, więc mówimy, że jest to w zasadzie linia i odrzucić ją, zachowując segment "górski". Aby wykonać ten krok, podstawowe znaczenie ma obraz u
, ponieważ dzięki niemu można wyraźnie określić, od czego zacząć i zatrzymać śledzenie konturu. Jeśli używałbyś takiego obrazu, miałbyś problemy z określeniem, od czego zacząć i przestać zbierać punkty konturu (tj. Kolejność rastrów dawałaby niepoprawne nałożenie wskazania).
Aby zrekonstruować segment jako pojedynczy (obecnie masz trzy z nich), rozważ punkty odrzucone od g
w h
i użyj tych, które nie należą do usuniętego dolnego segmentu.
wspomniałeś, że nie zawsze może być 3 ... co jest przyczyną tego? dla mojego zrozumienia to zawsze 1px poszerzona linia/kontur, który pasuje do tego wzoru (z 3) ..? – mchlfchr
@mchlfchr: w kroku 'bwlabel', trzy rozłączone linie otrzymują przypisane odpowiednio etykiety 1, 2 i 3. Nie zawsze może to być część oznaczona jako 3, którą chcesz usunąć. – Jonas
, więc nie jest możliwe, aby wybrać linię "outter" dla każdej sprawy? Jak rozumiem sposób "hbreak", oddziela on takie połączone struktury? W następnym kroku wybrałbym tę zewnętrzną etykietę, ale opcja 'hbreak' nie działa z jakiego powodu. – mchlfchr