Łączenie krawędzi wykrytych przez detektor krawędzi

14

Mam obraz binarny uzyskany z detektora Canny Edge. Krawędzie nie są dobrze wykrywane w środku i muszę do nich dołączyć. Połączenie krawędzi zależy od orientacji i sąsiedztwa. Muszę połączyć wierzchołki, jeśli są poniżej progu (powiedzmy mniej niż 5 pikseli odległości). Jeśli moje prawie liniowe cechy są ładnie zorientowane, ten próg powinien zostać złagodzony. (To najlepszy przypadek.) wizerunek

Próbowałem transformacji Hougha, ale nie działało to dla mnie, ponieważ nie mam linii prostych. Dylatacja i erozja również nie są dobre; sprawiają, że obrazy są bardziej chaotyczne.

Podejście, które próbuję, to najpierw wykryć wierzchołki i węzły (w MATLAB z bwmorph), a następnie zrobić liście jako osobną funkcję. Odbywa się to w następujący sposób:

  1. Skanując w oknie 3x3, poszukaj sąsiadów.
  2. Przejdź przez cały podłączony obiekt.
  3. Spróbuj dopasować linię (a może kwadratowy wielomian).
  4. Sprawdź, czy warto połączyć, czy nie.

Implementacja nie jest prosta, ponieważ część decyzyjna, w której należy połączyć wierzchołki, jest trudna.

Naresh
źródło
Znalazłem interesujące rozwiązanie, aby znaleźć oddziały. MATLAB może łatwo nadać lokalizacji węzły. MATLAB może także oznaczać powiązane funkcje. Możesz więc wybrać jedną połączoną funkcję. Znajdź węzły. Ustaw te węzły na 0. Zasadniczo odłącz feasure i oznacz je ponownie. Będziesz miał gałęzie na drzewach. Wymagało to mniej ręcznego programowania, a wyniki wydają się w porządku. Jakieś dane wejściowe?
Naresh,
Jeśli chodzi o część połączeniową, teraz myślę o znalezieniu dużych funkcji i uważam je za bardziej niezawodne. Następnie, jeśli są to linie proste (sprawdź jakość sprawności), zamień je na współrzędne biegunowe i wyszukaj sąsiedztwo jak transformacja Hougha. W przypadku dużych obiektów promień wyszukiwania jest duży (proporcjonalny do rozmiaru). Wdrażam ten kod. Wyniki w drodze. Komentarze pls.
Naresh

Odpowiedzi:

4

To może nie być kompletne rozwiązanie, ale da ci dobry kierunek.

Zasadniczo, jakie są kluczowe kryteria stwierdzenia, że ​​krawędzie pasują? To „lokalnie” nachylenie krawędzi pasuje i do pewnego stopnia odległości są rozsądne w stosunku do tego, jak długo krawędź jest ciągła.

Jeśli masz geometryczne krawędzie, takie jak długie proste linie, Hough natychmiast wykona bardzo płynną pracę. Ale to nie działa, gdy krawędzie są dowolną krzywą. W tym przypadku nadal możesz myśleć o krzywej jako mniej więcej kawałkowych stałych segmentach (wystarczająco dobrych w twoim przypadku), dlatego powinieneś wziąć Hougha lokalnie. tzn. możesz zrobić małą część obrazu (powiedzmy blok), obliczyć Hougha i zidentyfikować niektóre szczyty. Na tej podstawie możesz stwierdzić, że usuwanie zgrubienia tworzy znaczącą lukę, jeśli tak, to utrzymaj ją lub przejdź dalej.

Po wypełnieniu mniejszych luk można je rozszerzyć, aby uzyskać większy rozmiar. pików będzie więcej, ale możesz wybrać mniej.

Dipan Mehta
źródło
dzięki Dipan, też o tym pomyślałem. To będzie kosztowna operacja, ale mogę wyodrębnić trochę informacji. Ale czasami transfomacja Hoguh też nie daje mi połączonych linii. Hough dba tylko o idealne linie proste. I nie dba o łączność pikseli. Po prostu dopasowuje linię do 3 lub więcej przypadkowych pikseli na linii prostej. Koduję moją hipotezę. Zamieszczę tutaj wyniki do dalszej dyskusji. Naresh
Naresh
θ
4

To naprawdę nie będzie proste ... Możesz spróbować całkowicie pracować ze strukturą Graph. Najpierw wyodrębnij wszystkie połączone piksele z obrazu i wstaw je do wykresu, w którym sąsiednie węzły są połączone krawędzią. Możesz odrzucić Wykresy mniejsze niż pewna liczba M węzłów (aby wykluczyć małe plamki, które nie są istotne dla obrazu).

Pod koniec tego procesu będziesz mieć zestaw odłączonych wykresów. (Sądząc z twojego obrazu, nie są to dokładnie Drzewa, ponieważ są tam cykle)

Możesz znaleźć skrajne punkty każdego wykresu (skrajne piksele na obrzeżach każdego wykresu), zaczynając od jakiegoś losowego węzła i wykonując DFS .

Pod koniec tego procesu będziesz mieć zestaw współrzędnych pikseli dla każdego wykresu odpowiadających ekstremalnym punktom, w których połączenia są bardziej prawdopodobne.

Możesz teraz spróbować połączyć najbliższy punkt skrajny sąsiadów (o odległości <= 5) po prostu linią prostą.

Ale jeśli chcesz wziąć pod uwagę nachylenie segmentu linii prowadzącego do tego skrajnego piksela, możesz spróbować „dopasować linię” do N pikseli PRZED osiągnięciem tego ekstremalnego piksela. Jeśli więc N = 5, to do oszacowania linii użyte zostaną ostatnie 5 pikseli gałęzi.

Dlatego dla każdej najbliższej pary sąsiadów masz teraz także inne kryterium do oceny, czy należy połączyć dwa segmenty (tj. Ekstremalna Odległość Punktowa <= 5 pikseli ORAZ w przybliżeniu równe nachylenie linii).

Aby zminimalizować wpływ hałasu, który może sprawić, że twoje linie będą poszarpane w pobliżu wierzchołków gałęzi (a tym samym zniekształcą twoje oszacowanie nachylenia), możesz spróbować zastosować krok uproszczenia do swojego wykresu (jest to kolejny punkt (oprócz DFS powyżej), w którym opłaca się praca ze strukturą wykresu). Możesz na przykład usunąć kolejne węzły wykresu, które spowodowałyby, że linia „wyginałaby się” pod kątami większymi niż niektóre odcięcia (coś bardziej złożonego, patrz tutaj ). W ten sposób dopasujesz „prostsze” linie, mniej więcej w kierunku większej części segmentu utworzonego przez piksele obrazu.

Prawdopodobnie spowoduje to przyzwoite połączenia w większości przypadków (sądząc po opublikowanym obrazie), ale nadal pozostawi Ci kilka trudnych. Na przykład, w jaki sposób połączyć przerwany wzór w kształcie litery „Y”, w którym jedna z gałęzi jest przerwana w pobliżu punktu połączenia? (tzn. masz „ciągłe” zagięcie, które musi być połączone z odcinkiem linii, który „zlewa się” z nim). Być może mógłbyś sprawdzić, jak częste są takie przypadki i później zmienić kryteria połączenia.

Być może warto byłoby zbadać, w jaki sposób można poprawić akwizycję obrazu (na przykład zwiększyć rozdzielczość).

A_A
źródło
Dziękuję za dobrą odpowiedź. Tak, twoja obserwacja jest słuszna. To nie jest drzewo, więc lepiej zrobić wykres. Pomoże mi to również w znalezieniu cykli. Rzecz w tym, że MATLAB zaimplementował wykres w skrzynce narzędziowej bioinfo, którego nie mogę założyć, że większość ludzi będzie miała. Najbardziej mogę przejść do skrzynki narzędziowej do przetwarzania obrazu. Douglas-peucker to także coś, co rozważałem. Ale po konsultacji z ekspertem GIS zdałem sobie sprawę, że może to skomplikować sprawę i mogę uzyskać przecinające się linie. Ponadto muszę również spojrzeć na różne segmenty linii na wykresie, ponieważ potrzebuję 10 pikseli, aby utworzyć linię, i może już mam bifurkację.
Naresh