7

Mam pytanie dotyczące następującego scenariusza. Po przetworzeniu obrazu uzyskałem kontur, który jest niestety dwukrotnie podłączony, jak widać na dole. Aby to było oczywiste, to, czego chcę, to tylko linia zewnętrzna. Dlatego powiększałem i oznaczałem linię, chcę dużego obrazu.Separacja morfologiczna dwóch połączonych granic

Co chcę od tego wyboru jest tylko część outter, co mam oznaczone jako zielony w następnym obrazie. Przepraszam za moje złe umiejętności rysowania. ;)

Używam MatLab z IPT. Tak więc próbowałem również rozróżnić z bwmorph i opcją hbreak, ale wystąpił błąd.

Jak rozwiązać ten problem? Jeśli Ci się powiodło, czy mógłbyś powiedzieć coś więcej na ten temat? Z góry dziękuję!

poważaniem

Odpowiedz

1

ja też użyć 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

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

+0

@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

+0

, 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

2

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.

Powiązane problemy