Jak wykryć różne obiekty, gdy ich krawędzie się stykają?

21

Muszę znaleźć wszystkie kontury na obrazie pobranym z kamery. Więc najpierw używam sprytnego detektora krawędzi, aby znaleźć krawędzie, a następnie znaleźć kontury. Dość proste.

Jednak moje kontury zostają „scalone”. Na przykład na poniższym obrazku wyraźnie mam 4 różne obiekty. Krawędzie lekko się dotykają w niektórych punktach, więc otrzymuję jeden duży kontur zamiast czterech osobnych. Próbowałem zmieniać progi, erodować, operacje morfologiczne i podobne rzeczy, ale krawędzie lekko się dotykają. Czy ktoś ma jakieś sugestie, jak uzyskać osobne kontury na obrazach podobnych do tego poniżej? (Poniższy obraz jest oczywiście tylko przykładem, moje rzeczywiste obrazy są znacznie bardziej złożone, ale mają ten sam podstawowy problem).

wprowadź opis zdjęcia tutaj

Lorem Ipsum
źródło
Segmentacja zlewni może działać.
sm176357
Należy więc wziąć pod uwagę przypadki, w których kontakt jest linią, a nie tylko punktem (dotykającym, ale nie nakładającym się)
Shravya Boggarapu

Odpowiedzi:

11

Wykrywanie różnych komponentów:

Jeśli próbujesz wykryć różne komponenty, prawdopodobnie istnieją inne podejścia do ich wykonania niż wykrywanie konturów. Oto przykład w Mathematica. Erozja, po której następuje dylatacja, służy do zamknięcia luki w drugim składniku przed wykryciem (jeśli tego nie zrobisz, nie wykryje go).

img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

Poniższy rysunek po lewej pokazuje niedoskonałe wykrywanie obiektów (bez zamykania szczeliny), a po prawej pokazuje prawidłowe wykrywanie (uruchomienie powyższego kodu).

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Wykrywanie różnych konturów:

Jeśli jednak naprawdę chcesz oddzielić tylko kontury, oto przykład. Erozja i dylatacja są wykonywane jak poprzednio w celu zamknięcia luki, a powstały obraz jest przepuszczany przez detektor krawędzi Canny. Podałem wyraźne opcje domyślne, abyś mógł zobaczyć, co jest używane.

img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]

To da ci zarówno wewnętrzną, jak i zewnętrzną krawędź (patrz rysunek po lewej poniżej), ponieważ szerokość piksela jest większa niż 1 wokół. Nie miałem dużo szczęścia, próbując go rozrzedzić, ponieważ wydajność spada (może się różnić w przypadku innych obrazów). Kontury wewnętrzne są tymi, które chcesz, a kontur zewnętrzny to tylko kontur wszystkich 4 elementów. Teraz wszystko, co musimy zrobić, to upuścić najbardziej zewnętrzny z:

SelectComponents[img2, "EnclosingComponentCount", # > 0 &]

który daje tylko wewnętrzne kontury (patrz dolny prawy róg). Innymi słowy, wybiera tylko te kontury, które są otoczone przez co najmniej jeden inny kontur, co automatycznie dyskwalifikuje najbardziej zewnętrzny. Nie znam odpowiednika tych poleceń / operacji w openCV.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Zauważ, że pozorne przerwy na rysunku wynikają z zapisania do formatu JPEG w mniejszym rozmiarze. Nie wygląda tak na moim ekranie.

Lorem Ipsum
źródło
2

Spróbuj wstępnie przetworzyć swoje zdjęcia za pomocą filtra morfologicznego, takiego jak erozja . Umożliwi to oddzielenie dotykających konturów. Po wykryciu konturów możesz zastosować operację dylatacji do ukończenia sieci.


źródło
Próbowałem tego, ale wyniki nie wykazały poprawy.
1
Czy możesz pokazać prawdziwy przykładowy obraz?
2

To nie jest odpowiedź na twoje pytanie, ale analiza konturu jest podatna na błędy. Nie możesz wiele z tym zrobić i działa tylko w bardzo prostych scenariuszach.

Jeśli masz problemy z jego użyciem, powinieneś poszukać zupełnie innego algorytmu. Istnieją bardziej złożone i bardziej niezawodne sposoby rozwiązywania problemów, ale zależy to od tego, co chcesz osiągnąć (wykrywanie obiektów, śledzenie itp.)


źródło
Dziękuję Ci. Mój program służy do wykrywania rąk, więc uważam, że byłby bardzo podobny do wykrywania obiektów. Czy podałeś jakieś sugestie dotyczące bardziej złożonych i niezawodnych algorytmów? Funkcje Haar, SURF i podobne algorytmy uczenia maszynowego nie są czymś, co mogę zrobić.
Czy spojrzałeś na te zasoby? paginas.fe.up.pt/~hgc2011 Są to głównie bazy danych / wyniki, ale mam nadzieję, że znajdziesz tu kilka dobrych dokumentów.
0

Kontury niekoniecznie są otwarte, biorąc pod uwagę, że użyłeś sprytu do ich wykrycia. Problemy z Canny zostały już tutaj odkryte . Dyskusja na Canny daje podstawową ideę, że jest jeszcze operacje jak zamykanie i dylatacji, które są wymagające na szczycie Canny do ocenianych zamkniętych konturów.

Zależy to również od tego, czy szukamy konturów, czy segmentacji (Canny kontra metody takie jak Graphcuts ). Myślę, że poszukiwanie solidnego rozwiązania zależy od ostatecznego zastosowania.

beedot
źródło