Próbuję rozpoznać drogi wodne na podstawie zdjęć lotniczych (powiedzmy z Google Maps). Władze lokalne często dysponują danymi GIS, które wskazują, gdzie znajdują się drogi wodne (i drogi, budynki itp.), Ale dane na ich temat są często nieco niedokładne i możemy być w stanie je poprawić za pomocą zdjęć lotniczych. Mamy już pewne dane, którym nie zawsze można ufać.
Wiem, jak wykonać podstawowe przetwarzanie obrazu na danych (niestety nie mam tutaj jeszcze przykładowych zdjęć, próbuję sobie wyobrazić, jak to zrobić, jeszcze nie działający kod):
Potrafię zebrać pewien zestaw wartości kolorów za pomocą fragmentów drogi wodnej na obrazach i dowiedzieć się, które piksele są najbliższe tym kolorom, być może również w przypadku innych rodzajów obiektów (trawa, drogi, budynki itp.). Jeśli ustawię próg, na którym piksele są „wystarczająco blisko”, otrzymam zestaw pikseli, które prawdopodobnie są drogami wodnymi (ale będzie dużo hałasu).
Mogę zmienić obraz w skalę szarości i użyć standardowego algorytmu wykrywania krawędzi, aby dowiedzieć się, gdzie są krawędzie. Znów daje mi to zestaw pikseli o podobnych granicach, ale będzie hałas, a krawędzie będą zbyt przemyślane i / lub będą miały luki.
To, co chcę mieć jako wynik, to zestaw wielokątów, które przedstawiają prawdopodobne drogi wodne.
Intuicyjnie chciałbym użyć wykrytych krawędzi do tworzenia wielokątów i informacji o kolorze, aby zdecydować, która z nich jest wodą, prawdopodobnie wykorzystując dane rządowe, które już mamy.
Czy istnieje znany sposób przejścia od wyniku algorytmu wykrywania krawędzi do ładnego zestawu zamkniętych wielokątów? Lub jakieś inne wskazówki, jak zaatakować ten problem, jeśli istnieje lepszy sposób?
źródło
Odpowiedzi:
Trudno to zrobić z samą informacją o kolorze. Różnice kolorów między zdjęciami lotniczymi i satelitarnymi (a nawet wewnątrz nich) mogą być ogromne. Idealnie będziesz potrzebować zdjęć hiperspektralnych lub przynajmniej w podczerwieni ( patrz ten artykuł ).
Zakładając, że wykrywanie krawędzi może przyciągać się do granic pikseli, możesz wziąć granice każdego piksela jako zamknięty wielokąt i złączyć je razem, aby utworzyć wielokąt (w zależności od implementacji połączenia możesz otrzymać wielokąt z wewnętrznymi pierścieniami lub dziurami) lub kolekcję wielokątów. Pakiet Java Topology Suite i inne implementacje geometrii obliczeniowej mogą ci to znacznie ułatwić. Jeśli chcesz korzystać z granic subpikseli, musisz bardzo uważać, aby ustawić dobrą wartość epsilon, aby móc przyciągać krawędzie, które są bardzo blisko, ale nie dotykają się dokładnie.
Jeśli chcesz wziąć krawędzie i połączyć je samodzielnie, będziesz chciał zbudować wykres przecinających się krawędzi i zaimplementować kod, który przejdzie przez wykres (np. Przeciwnie do ruchu wskazówek zegara), aby znaleźć miejsce, w którym się zamyka, tworząc wielokąt. W ten sposób działają niektóre implementacje związków wielokątów.
źródło