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).
image-processing
edge-detection
Lorem Ipsum
źródło
źródło
Odpowiedzi:
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).
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).
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.
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:
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.
Zauważ, że pozorne przerwy na rysunku wynikają z zapisania do formatu JPEG w mniejszym rozmiarze. Nie wygląda tak na moim ekranie.
źródło
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
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
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.
źródło