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.)
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:
- Skanując w oknie 3x3, poszukaj sąsiadów.
- Przejdź przez cały podłączony obiekt.
- Spróbuj dopasować linię (a może kwadratowy wielomian).
- 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.
źródło
Odpowiedzi:
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.
źródło
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ść).
źródło