Roman Andrzejewski 55424
Dariusz Daćko 51629

Celem projektu było wykrycie oraz zaznaczenie na zdjęciach lotniczych dachów sfotografowanych budynków. Program został zaimplementowany w języku C++ w środowisku Visual Studio przy użyciu biblioteki OpenCV służącej do przetwarzania obrazów. Oto obraz użyty podczas testowania programu:

Faktycznie zadanie sprowadza się do wykrycia na obrazie prostych krawędzi o odpowiedniej długości. Do tego celu służą odpowiednie filtry (np. filtr Sobela oraz laplasjan) oraz transformata Hough'a. Filtry krawędziowe lepiej działają na obrazach o wyraźnie zdefiniowanych krawędziach. Wykrycie krawędzi może być zakłócone przez występujące na zdjęciu szczegóły. Należało także ujednolicić obszary dachów, nie zawsze wyraźnie widocznych z powodu cieni lub innych obiektów, które je zasłaniają. Stąd aby uzyskać obraz o zmniejszonej liczbie jednolitych obszarów oraz szczegółów, zastosowany został algorytm segmentacji piramidalnej (funkcja cvPyrSegmentation z pakietu OpenCV). Oto efekt jej wykonania przy 4 poziomach piramidy oraz wartościach 300 i 7 odpowiednio pierwszej i drugiej granicy (parametry threshold1 i threshold2).

Następnie na wyniku segmentacji zastosowane zostały osobno trzy filtry: Sobela (poziome oraz pionowe) oraz laplasjan. Użyto aż trzech typów fitrów, ponieważ na tym etapie nie było wiadomo, który z nich lepiej sprawdzi się w wyszukiwaniu krawędzi. Funkcje przeprowadzające te operacje (cvSobel oraz cvLaplace) zwracają wynik w postaci obrazu 16-bitowego. Należało przekonwertować je na obrazy 8-bitowe (funkcja cvConvertScale), ponieważ stosowane dalej funkcje potrafią przetwarzać tylko obrazy tego typu. Niestety odbyło się to kosztem jakości obrazów. Tak wyglądają efekty działania filtru Sobela oraz laplasjana:

Filtr poziomy Sobela:

Filtr pionowy Sobela:

Filtr poziomy Sobela po redukcji do 8 bitów:

Filtr pionowy Sobela po redukcji do 8 bitów:

Laplasjan:

Laplasjan po redukcji do 8 bitów:

Po przeprowadzeniu dalszych działań, okazało się, że zastosowanie filtru Sobela ostatecznie daje niezadowalające wyniki. Ponadto na powyższych obrazach widać, że laplasjan wyraźniej wyróżnia krawędzie. Do dalszego zastosowania wybrano filtr laplasjan. Aby znaleźć i zaznaczyć konkretne krawędzie na przefiltrowanym obrazie użyta została transformata Hough'a. Algorytm ten służy do znajdowania linii prostych (w podstawowej odmianie) lub odcinków (wykorzystana odmiana probabilistyczna). Jednak wyniki wciąż nie były zadowalające. Wobec tego, należało ułatwić transformacie znalezienie odpowiednich odcinków. W tym miejscu możliwe były dwa podejścia: zastosować algorytm śledzenia krawędzi Canny'ego (funkcja cvCanny) na przefiltrowanym obrazie lub poddać przefiltrowany obraz operacji progowania (funkcja cvThreshold). Efekt algorytmu Canny'ego wygląda następująco:

Tak uzyskany obraz poddano działaniu transformaty Hough'a (funkcja cvHoughLines2 przy wartościach parametrów: rho - 2, theta - 2*CV_PI/12, minimalna liczba pikseli w linii - 5, minimalna długość odcinka - 5, maksymalna odległość między odcinkami na jednej linii pozwalająca traktować te odcinki jako jeden - 2). Znalezione przez nią odcinki zostały nałożone na oryginalny obraz. Ponieważ transformata znalazła także odcinki dłuższe od krawędzi dachów narysowano tylko te, których długość nie przekraczała 40. Oto ostateczny efekt:

W drugim podejściu przefiltrowany obraz został poddany operacji progowania, przy wartości progu równej 20 (jest ona niska z powodu ciemnego obrazu). Oto efekt tej operacji:

Ten obraz także poddano działaniu transformaty Hough'a przy identycznych parametrach. Znalezione odcinki, których długość nie przekraczała 40, zostały nałożone na oryginalny obraz.

Porównując efekty działania obu metod można dojść do wniosku, że są one podobne. Ogólnie metoda z wykorzystaniem algorytmu Canny'ego znalazła 4704 linii (nie tylko tych narysowanych), a metoda wykorzystująca progowanie 3913. W obu metodach pozostało wiele nadmiarowych odcinków, znajdujących się np. na krawędziach ulic. Można jednak odnieść wrażenie, że odcinków tych jest mniej w metodzie z progowaniem. Pod tym względem daje ona bardziej zadowalający wynik, niż metoda stosująca algorytm Canny'ego.

Obie metody dają zadowalające wyniki jednak mogą one być dalej udoskonalane, aby w przyszłości dać jeszcze lepsze efekty.