Rozpoznawanie linii przerywanej na drodze
Rozpoznawanie linii przerywanej na drodze
- analiza obrazów rastrowych -
- analiza obrazów rastrowych -
Matlab Image Processing Toolbox
Matlab Image Processing Toolbox
Problemem, jakim zajmiemy się w tym ćwiczeniu jest opracowanie w środowisku Matlaba
Matlaba
programu wyznaczającego na zdjęciu położenie i orientację znaków drogowych poziomych
jakimi są malowane na drogach białą farbą linie pojedyncze przerywane, rozdzielające
przeciwstawne pasy ruchu. Analizowany obraz jest rejestrowany kamerą umieszczoną na
przedniej szybie pojazdu. Ostatecznym efektem działania programu będzie wyznaczenie kąta
nachylenia linii przerywanej. Określanie wartości tego kąta może być wykorzystywane do
ostrzegania kierowcy o oddalaniu się od prawidłowej trajektorii ruchu. W oparciu o taką
analizę obrazu można także podjąć się próby opracowania bardziej zaawansowanego systemu
wizyjnego kierującego pojazdem w sposób całkowicie zautomatyzowany bez kierowcy.
Określenie położenia na bitmapie i odchylenia od pionu namalowanej na drodze linii
przerywanej wykonane będzie dwoma metodami:
pierwszą wyszukującą na bitmapie jasne obiekty, ułożone wzdłuż linii prostej. Środki
tych obiektów wyznaczone zostaną funkcją regionprops, wyznaczającą także wiele
innych cech geometrycznych obiektów.
cech geometrycznych obiektów
drugą wykorzystującą transformatę Hougha, służącą do wyszukiwania na bitmapie linii.
Hougha
Funkcje realizujące tę transformatę i opracowujące jej wyniki to: hough, houghpeaks
i houghlines.
Opracowany program realizujący rozpoznawanie obrazu obiema metodami należy zawrzeć
w jednym m-pliku. Powinien on po wykonaniu pośrednich obliczeń wyznaczyć:
s dwa kąty nachylenia linii dla obu metod
s dorysować do zdjęcia kontury wokół linii na drodze
s dorysować wzdłuż linii przerywanej odcinki wyznaczone obiema metodami
Wczytanie zdjęcia i jego wstępna obróbka
Analizę jednego z testowych zdjęć ulicy rozpoczynamy od wczytania go do tablicy RGB
i wyświetlenia w oknie graficznym Matlaba. Służą do tego funkcje imread i imshow.
Przydatne informacje o bitmapie, w tym jej szerokość i wysokość, można pozyskać funkcją
imfinfo.
Całe zdjęcie nie jest nam potrzebne do analizy,
wystarczy jego dolna część, na której znajduje
się linia przerywana. Do przycinania zdjęć
służy funkcja imcrop. Informację o rozmiarze
zdjęcia, wykorzystywaną przy kadrowaniu
zdjęcia pobiera się z pól Width i Height zmiennej Image_Info, zwracanej przez funkcję
imfinfo.
Po każdym istotnym przekształceniu obrazu, jeżeli chcemy zobaczyć efekt jego działania,
wyświetlając w nowym oknie bitmapę, wykonujemy instrukcje: figure(numer_okna),
imshow(nazwa_tablicy).
Do dalszej analizy wykorzystywany będzie obraz binarny czarno-biały.
Zdjęcie kolorowe przekształcamy na binarne funkcją im2bw, ustawiając
właściwą wartość progową level w zakresie od 0 do 1.
Realizując przekształcenie morfologiczne otwierania obiektów, możemy
usunąć małe, nieistotne dla dalszej analizy obrazu obiekty. Do wykonania
operacji otwierania obiektów służy funkcja bwareaopen, której drugim parametrem jest
liczba naturalna określająca rozmiar obiektu w pikselach. Obiekty o rozmiarze mniejszym od
podanego będą usunięte z bitmapy.
Należy zapoznać się z definicją i działaniem następujących czterech podstawowych
przekształceń morfologicznych obrazów: erozja, dylatacja, otwarcie i zamknięcie. Które z
tych przekształceń są złożeniem innych dwóch (erozja+& =& , dylatacja+& =& )?
Nieistotne dla dalszej analizy obrazu są także obiekty dochodzące do lewej, górnej i prawej
krawędzi obrazu na pewno nie są to linie umieszczone na drodze. Można je usunąć za
pomocą funkcji imclearborder, jednakże funkcja ta usuwa obiekty przystające do
wszystkich krawędzi. Dlatego należy tak zmodyfikować bitmapę, aby funkcja ta nie usunęła
obiektów dochodzących do dolnej krawędzi.
Wyszukanie linii rozdzielających pasy ruchu - metoda 1
Po wykonaniu powyższych przekształceń zakładamy, iż obiekty pozostałe na
obrazie binarnym to wyodrębnione z obrazu linie przerywane.
Funkcją bwboundaries wyznaczamy kontury obiektów
(Boundary_lanes) i tablicę z ponumerowanymi obiektami
(Label_lanes):
[Boundary_lanes,Label_lanes] = bwboundaries(nazwa_tablicy,'noholes')
Należy sprawdzić co oznacza wartość noholes wybrana dla drugiego parametru.
Funkcją max, wyznaczającą największą wartość etykiety w tablicy Label_lanes, określamy
ilość obiektów na obrazie (funkcję max wywołujemy podwójnie:
max(max(Label_lanes)), dlaczego?). Wynik umieszczamy w zmiennej num_Regions.
Kolejnym krokiem jest wyznaczenie środków ciężkości kolejnych obiektów. Informację tę
wykorzystamy przy określaniu linii wzdłuż której obiekty te są rozmieszczone.
Funkcja regionprops służy do wyznaczania różnorodnych cech obiektów, na przykład
takich jak środek ciężkości, pole powierzchni, wielokąt otaczający, spłaszczenie czy
pochylenie. Ma ona następującą składnię:
Geom_props = regionprops(nazwa_tablicy,'all');
Jeżeli chcemy wyznaczyć wszystkie cechy obiektu, drugi parametr powinien mieć wartość
'all', jeżeli tylko wybrane, to wymieniamy je oddzielając przecinkami. Nam będą
potrzebne środki ciężkości obiektów (cecha 'Centroid'), czyli wystarczy wywołać funkcję
z drugim parametrem 'Centroid'. Funkcja zwraca tablicę Geom_props zawierającą
struktury opisujące cechy poszczególnych obiektów.
Należy zapoznać się z ponad dwudziestoma cechami jakie dla obiektów możemy wyznaczyć
funkcją regionprops. Do wyjaśnienia tej funkcji w systemie pomocy odwołamy się
wpisując doc regionprops.
Mając współrzędne środków ciężkości kolejnych obiektów możemy wyznaczyć kąt
nachylenia linii. Najpierw wyznaczamy kąty pomiędzy kolejnymi środkami ciężkości
obiektów, potem kąt średni dla wszystkich obiektów.
Informację o środkach ciężkości obiektów pobieramy z pól Centroid tablicy Geom_props
i przepisujemy do tablicy Centers:
Centers=[Geom_props.Centroid];
Następnie w pętli wyznaczamy kolejne kąty, uwzględniając, iż w tablicy Centers znajdują
się na przemian współrzędne x i y kolejnych środków ciężkości:
for i=1:length(Centers)/2-1
Angles1(i) = ..... ;
end
Uśredniony kąt Angle1 obliczamy funkcją mean.
W pętli dla kolejnych rozpoznanych obiektów obrysowujemy ich kontury:
figure(numer_okna)
hold on
for i=1:num_Regions
Ln = Boundary_lanes{i};
line(...,...,'Color','y','LineWidth',2);
end
Na koniec funkcją Line rysujemy obliczoną uśrednioną prostą, wzdłuż której umieszczona
jest linia przerywana:
line([.....],[.....],'Color','g','LineWidth',2)
Wyszukanie linii rozdzielających pasy ruchu - metoda 2
Druga metoda określania położenia i nachylenia prostej wzdłuż której przebiega linia
przerywana wykorzystuje standardową transformatę Hougha. Transformata ta służy do
wykrywania w obrazie linii. Jest odporna na zniekształcenia obiektów (przerwy w liniach,
nierówne linie) i na zakłócenia w obrazie (szumy).
Z transformatą Hougha można zapoznać się czytając dokument zamieszczony pod adresem:
http://home.agh.edu.pl/~kryjak/joomla/Pliki/PO/Hough_www.pdf
Transformatę Hougha realizuje funkcja hough. Zwraca ona trzy parametry: macierz
Hougha H oraz współrzędne q i r dla których jest wyznaczana ta macierz.
[H,theta,rho] = hough(nazwa_tablicy);
Transformatę rysuje się funkcją imshow, a funkcjami axis normal i colormap(hot)
ustawia właściwy współczynnik proporcji i kolorystykę wykresu. Interpretując przykładowy,
zamieszczony poniżej wykres transformaty Hougha można stwierdzić występowanie linii
położonej w odległości około 400 pikseli od lewego górnego rogu zdjęcia i nachylonej
w stosunku do pionowej osi pod kątem około 100.
Aby dowiedzieć się gdzie na obrazie występują linie, należy w przestrzeni transformaty
Hougha zlokalizować ekstrema (wartości maksymalne). Służy do tego funkcja houghpeaks.
Jej dwa główne argumenty to macierz Hougha H i ilość wyszukiwanych ekstremów. Funkcja
zwraca współrzędne ekstremów w przestrzeni Hougha. Każdemu wyznaczonemu ekstremum
odpowiada jedna linia zlokalizowana w obrazie.
Peaks = houghpeaks(H,ilosc_ekstremow);
W rozszerzonej wersji funkcji można ustawić jeszcze wartości dwóch dodatkowych
parametrów Threshold i NHoodSize. Pierwsza wartość określa poziom dla jakiego dane
ekstremum jest akceptowane, druga pozwala odrzucać ekstrema znajdujące się blisko siebie,
czyli nie wyszukiwać na bitmapie linii o zbliżonym położeniu i kącie nachylenia. W naszym
przykładzie wyszukujemy na zdjęciu jedną dominującą linię, utworzoną z pikseli
składających się na linię przerywaną namalowaną na drodze.
Położenie linii w przestrzeni obrazu na podstawie położenia ekstremów w przestrzeni
transformaty Hougha wyznacza się funkcją houghlines. Jej cztery główne argumenty to
tablica zawierająca obraz, współrzędne q i r oraz tablica ekstremów zwracana przez funkcję
houghpeaks.
Lines = houghlines(nazwa_tablicy,theta,rho,peaks);
Dwa dodatkowe parametry pozwalające na polepszenie uzyskiwanych rezultatów to FillGap
i MinLength. Ich wyjaśnienie można znalezć w systemie pomocy programu Matlab.
W strukturze zmiennej Lines zwracane są (w zależności od wartości drugiego parametru
przekazanego do funkcji houghpeaks) współrzędne jednej lub większej ilości linii, każdej
w jednym lub kilku fragmentach.
Konstruując następującą pętlę, rysujemy na zródłowym zdjęciu linię,
w jednym lub kilku fragmentach, w zależności od dobranych wcześniej
wartości parametrów FillGap i MinLength:
figure(numer_okna)
for i=1:length(Lines)
line([.....],[.....],'Color','r','LineWidth',2);
end
W kolejnej pętli wyznaczamy kąty poszczególnych fragmentów linii. Jak zostało wcześniej
wspomniane, ilość wyznaczonych fragmentów linii zależy od parametrów FillGap
i MinLength.
for i=1:length(Lines)
Angles2(i) = atand(.....);
end
Funkcja atand oblicza funkcję trygonometryczną arcus tangens i zwraca wyliczony kąt
w stopniach.
Uśredniony kąt Angle2 obliczamy jako wartość średnią kątów zawartych w tablicy Angles2
(funkcja mean).
Na powyższym zdjęciu umieszczone zostały odcinki określające położenie linii poziomych
przerywanych wyznaczone obiema metodami. Kolorem zielonym pierwszą metodą,
kolorem czerwonym drugą.
Przetestować działanie opracowanych m-plików dla wszystkich testowych zdjęć.
Analizowane zdjęcia
IMG_01 IMG_02 IMG_03
IMG_04 IMG_05 IMG_06
IMG_07 IMG_08 IMG_09
IMG_10 IMG_11
Wyszukiwarka
Podobne podstrony:
King Stephen Ktoś na drodze 2Stephen King Ktos na drodze (2)09 Osiem przeszkód na drodze rozeznania duchowegoManewry na drodzeKiedy Jezus na drodzeCO ROZPOZNAJE UKŁAD IMMUNOLOGICZNY NA DRODZE DO NOWEGO PARADYGMATURozporządzenie o wypadku na drodzeBezpieczeństwo na drodze raport z badania jakościowegoNależności dochodzone na drodze sądowejna drodzeprace na drodze mauDwoje na drodze [1967] napisywięcej podobnych podstron