Inżynieria obrazów cyfrowych Ćwiczenie 4 Podstawowe algorytmy
Transkrypt
Inżynieria obrazów cyfrowych Ćwiczenie 4 Podstawowe algorytmy
Doc. dr inż. Jacek Jarnicki Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej [email protected] Inżynieria obrazów cyfrowych Ćwiczenie 4 Podstawowe algorytmy przetwarzania obrazów Celem ćwiczenia jest zilustrowanie kilku najważniejszych problemów z dziedziny komputerowego przetwarzania obrazów cyfrowych. Ogólnie zadanie przetwarzania obrazu można sformułować jako obliczanie na podstawie obrazu wejściowego, traktowanego w tym przypadku jako dane, obrazu wyjściowego, czyli wyniku. Algorytmy przetwarzania obrazów można podzielić na dwie grupy. Przekształcenia punkt w punkt i przekształcenia obszaru w punkt. Po pierwsze zaprezentowane zostaną często stosowane w praktyce przekształcenia punkt w punkt, czyli takie, w których opis punktu (piksela) obrazu wyjściowego wyliczany jest na podstawie jedynie opisu odpowiadającego mu (w sensie współrzędnych) piksela obrazu wejściowego. Pokazane będą dwa problemy: korekcja liniowa, używana do regulacji jasności i kontrastu obrazu oraz korekcja gamma, stosowana przy kalibracji monitorów. Jako przykłady z drugiej grupy algorytmów, czyli przekształceń obszaru w punkt, omówione będą tak zwane algorytmy splotowe (konwolucyjne), przekształcające kwadratowy obszar z obrazu wejściowego w jeden punkt obrazu wyjściowego. Jako przykłady wybrano: filtr liniowy, usuwający z obrazu drobne zakłócenia, filtr górnoprzepustowy, uwydatniający szczegóły i prosty detektor krawędzi. Rozważane będą, więc trzy zagadnienia: korekcja liniowa, korekcja gamma, wybrane operacje splotowe (filtracja liniowa i detekcja krawędzi), 1. Korekcja liniowa Operacja korekcji liniowej polega na obliczaniu jasności punktów obrazu wyjściowego według zależności w postaci: y( i , j ) a x( i , j ) b gdzie: Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 (1) x(i, j) – jasność punktu obrazu wejściowego, y(i, j) – jasność punktu obrazu wyjściowego, a, b - współczynniki. y(i, j) 1 0 - biały 1 - czarny y = ax + b x(i, j) 0 0 1 Rys. 1. Odwzorowanie liniowe Opisane tak prostym wzorem (1) odwzorowanie liniowe jest jednak w praktyce niezwykle przydatne, bowiem przy pomocy współczynników a i b można wpływać na jasność i kontrast obrazu wyjściowego. Zasadę zmiany jasności i kontrastu za pomocą współczynników a i b ilustruje rysunek 2. y(i, j) 1 y(i, j) 1 Jasny Duży kontrast b>0 a>1 b=0 a<1 b<0 x(i, j) Ciemny 0 0 1 a=1 0 Mały kontrast x(i, j) 1 0 (2.2) (2.1) Rys. 2. Wpływ współczynników a i b na jasność i kontrast obrazu Jak widać z rysunku 2.1 zmiana współczynnika b wpływa na jasność obrazu wyjściowego. Dla ujemnych wartości b obraz ciemnieje a dla dodatnich staje się jaśniejszy. Na podstawie Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 analizy rysunku 2.1 można łatwo zauważyć, że równanie opisujące zmianę jasności powinno mieć postać: y( i , j ) x( i , j ) b 1 b 1 (2) Zmiana kontrastu, której zasada pokazana została na rysunku 2.2 realizowana jest przy pomocy zmiany współczynnika a. Jeśli a jest większe od 1 kontrast jest większy a w przeciwnym przypadku maleje. Ponadto przy zmianie kontrastu wymagane jest spełnienie zależności pomiędzy współczynnikami a i b w postaci: b 1 1 a 2 Spowoduje to, że prosta z rysunku 2.2 przy zmianie współczynnika a będzie się zawsze obracała wokół punktu o współrzędnych (x, y) = (1/2, 1/2) co ostatecznie prowadzi do równania: y( i , j ) ax( i , j ) 1 1 a 2 (3) Oczywiście możliwe jest stosowanie sekwencji opisanych operacji, na przykład najpierw zmiana jasności a później regulacja kontrastu. Zmiana jasności i kontrastu obrazu Należy napisać dwie proste funkcje o nazwach n.p. brightness(b) i contrast(a) służące do zmiany odpowiednio jasności i kontrastu. W przypadku zmiany jasności trzeba skorzystać z równania (2) natomiast dla zmiany kontrastu z równania (3). Dodatkowym elementem zadania będzie sporządzenie wykresów podobnych do tych z rysunku 2. Algorytm jest następujący: Przeczytać z pliku Lena_gray_8.tif obraz źródłowy. Przekonwertować przeczytany obraz do formatu double. Stosując równanie (2) dla funkcji brightness() lub (3) dla funkcji contrast() obliczyć obraz wyjściowy. Przekonwertować obraz wyjściowy do formatu uint8. Wykorzystując funkcję subplot() wyświetlić obrazy wejściowy i wyjściowy w oknie graficznym. W nowym oknie graficznym narysować wykres y(i, j) = f (x(i, j)), używając do rysowania funkcji plot()z odpowiednimi opcjami, użytej według poniższego wzorca. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 %********************************************************************** % Przykład rysowania wykresu funkcji y = a*x + b %********************************************************************** % . . . x = (0: 0.01: 1); % % % % Deklaracja tablicy x zawierającej wartości zmiennej niezależnej. Elementy tablicy x to liczby od O do 1 rosnące co 0.01. y = a*x + b; % Obliczenie elementów tablicy y % zawierającej wartości zmiennej % zależnej figure(2) % Otwarcie nowego okna graficznego plot(x,y,'LineWidth',2,'Color','black'); % Narysowanie wykresu y = f(x) jako połączonych punktów o % współrzędnych (x, y). Kolejne wartości x pobierane są % z tablicy x a wartości y z tablicy y. Opcje 'LineWidth',2 % i 'Color','black' określają grubość i kolor linii łączącej % rysowane punkty. axis([0 1 0 1]); % % Określenie zakresu osi rysowanego % wykresu. Oś x od 0 do 1, oś y tak samo . . . Uwaga: Funkcja plot()jest jedną z podstawowych funkcji rysujących w systemie MATLAB. Jest to funkcja o bardzo rozbudowanych możliwościach, dająca wiele możliwości kształtowania wyglądu wykresu. Przykładowy rezultat wykonania programu zmieniającego kontrast obrazu, napisanego według powyższego wzorca pokazano na rysunkach 3 i 4. Przy pomocy funkcji brightness() i contrast()można łatwo przekształcać obraz zmieniając za każdym razem tylko jeden parametr. Funkcje tego typu, wyposażone oczywiście w odpowiednio rozbudowany interfejs użytkownika występują w każdym programie do programie do przetwarzania obrazów cyfrowych. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Rys. 3. Efekt zmiany kontrastu obrazu przy pomocy funkcji contrast()dla a = 1.5 Rys. 4. Zależność przekształcająca obraz wejściowy w wyjściowy z rysunku 3, narysowana przy pomocy funkcji plot() Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 2. Korekcja gamma Monitory CRT, LCD czy plazmowe, na których wyświetlane są obrazy cyfrowe są urządzeniami nieliniowymi. Oznacza to, że operacja odwzorowania sygnału sterującego doprowadzanego do monitora w jasność świecenia odpowiedniego punktu na ekranie jest inna niż liniowa. Najprostszy model opisujący związek pomiędzy poziomem sygnału sterującego a jasnością świecenia punktu na ekranie, wynikający z analizy zasad działania monitorów CRT opisany jest zależnością wykładniczą w postaci: I C V (4) gdzie: I – jasność punktu na ekranie, V – poziom sygnału sterującego doprowadzanego do monitora, C, - współczynniki zależne od konstrukcji monitora Decydujący o charakterze nieliniowości monitora współczynnik zawiera się w przedziale od około 1.2 do 3. Dla monitorów przeznaczonych do pracy z komputerami działającymi z systemem operacyjnym Windows współczynnik wynosi 2.2. Przykładowy wykres zależności jasności świecenia punktu ekranu d poziomu sygnału sterującego pokazany został na rysunku 5. W praktyce współczynnik dla konkretnego egzemplarza monitora można wyznaczyć w sposób eksperymentalny, posługując się albo specjalnym urządzaniem zwanym kalibratorem monitora, albo przeznaczonym do tego celu programem. I C = 1, = 2.2 V Rys. 5. Zależność pomiędzy jasnością a poziomem sygnału sterującego monitora Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Obraz wyświetlony na monitorze o współczynniku różnym od 1 zostanie oczywiście zniekształcony. Aby skompensować nieliniową charakterystykę monitora stosuje się wiec korektor, czyli układ przekształcający obraz, również o wykładniczej charakterystyce, lecz przeciwnej do krzywej opisującej odwzorowanie monitora. Celem stosowania korektora jest uzyskanie liniowej charakterystyki wynikowej, czyli wykładnik potęgi we wzorze opisującym charakterystykę korektora powinien być odwrotnością współczynnika . Zasadę korekcji gamma zilustrowano na rysunku 6. I Charakterystyka monitora = 1/2.2 Charakterystyka korektora = 2.2 Charakterystyka wynikowa V Rys. 6. Zasada działania układu korekcji gamma Dla obrazów barwnych korekcja gamma przeprowadzana jest dla każdej ze składowych R, G, B osobno. W zastosowaniach problem korekcji gamma jest szczególnie ważny w przypadku, gdy obraz oglądany na monitorze będzie dalej wykorzystywany na przykład w procesie poligraficznym. Aby osiągnąć dobrą zgodność barw prezentowanych na monitorze z barwami, jakie uzyska się po wydrukowaniu obrazu niezbędna jest kalibracja monitora w skład, której wchodzi także właściwe ustawienie parametrów układu odpowiedzialnego za korekcję gamma. Kalibrację przeprowadza się przy pomocy specjalnych procedur. Korekcja gamma obrazu barwnego Zadnie składa się z trzech części. Po pierwsze należy napisać funkcję realizującą dla zadanego obrazu przekształcenie opisane wzorem (4) a dalej wykorzystując tą funkcję dwa proste programy. Pierwszy z nich ma ilustrować jak działa przekształcenie (4), natomiast drugi pokazać jak wygląda wyświetlony na monitorze obraz bez użycia korekcji i z korekcją.. Proponowana funkcja może być określona tak: Y = gamma_correction(X, gamma_r, gamma_g, gamma_b) gdzie: Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 X – tablica zawierająca obraz wejściowy, gamma_r – wykładnik dla składowej czerwonej, gamma_g – wykładnik dla składowej zielonej, gamma_b – wykładnik dla składowej niebieskiej, Y – tablica z obrazem wyjściowym (po wykonaniu korekcji). Natomiast wewnątrz definicji funkcji należy wykonać poniższe kroki: Wykonać konwersję obrazu wejściowego do formatu double. Wydzielić z obrazu poszczególne składowe barwne. Dla każdej składowej barwnej zastosować wzór (4) z wykładnikami odpowiednio: gamma_r, gamma_g i gamma_b oraz stałą C = 1. Otrzymany w ten i umieścić w tablicy Y. sposób obraz przekształcić do formatu uint8 Użycie tak napisanej funkcji może wyglądać następująco: X = imread('Lena_color_256.tif') Y = gamma_correction(X, 2.2, 2.2, 2.2); Obraz wyjściowy można będzie zobaczyć po wykonaniu polecenia imshow(Y); Drugim etapem zadania jest napisanie z użyciem przygotowanej w poprzednim kroku funkcji gamma_correction(), programu pokazującego obraz przed i po wykonaniu przekształcenia (4) oraz rysującego wykresy odpowiednich krzywych. Program można zorganizować tak: Zadeklarować współczynniki dla poszczególnych składowych barwnych. Przeczytać i umieścić w tablicy obraz wejściowy n.p. Lena_color_256.tif. Używając funkcji gamma_correction() i zadeklarowanych współczynników obliczyć obraz wyjściowy. W pierwszym oknie graficznym wyświetlić obrazy przed i po przekształceniu. W drugim oknie używając wcześniej opisanej funkcji plot() wyświetlić krzywe według zależności (4) dla poszczególnych barw. Efekt powinien być taki jak na rysunkach 7 i 8. Na rysunku 7 można zobaczyć jak będzie wyglądał obraz wyświetlony na ekranie monitora bez korekcji gamma. Wyraźnie widać, że obraz ten różni się od obrazu źródłowego. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Rys. 7. Obraz wejściowy i obraz wyświetlony na ekranie monitora bez korekcji gamma (gamma_r = 1.8, gamma_g = 2.0 i gamma_b = 2.2) Rys. 8. Krzywe odwzorowania (4) dla poszczególnych składowych barwnych (gamma_r = 1.8, gamma_g = 2.0 i gamma_b = 2.2) Wreszcie trzecia, ostania część zadania polega na przeprowadzeniu symulacji procesu korekcji gamma i prześledzeniu efektu korekcji. Należy zasymulować dwa tory przetwarzania obrazu, pierwszy bez korekcji gamma i drugi z korekcją, przeprowadzoną według zasady zilustrowanej na rysunku 6. Szkielet programu powinien być mniej więcej taki: Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Zadeklarować współczynniki (gamma_r, gamma_g, gamma_b) dla poszczególnych składowych barwnych opisujące hipotetyczny monitor, na którym będzie wyświetlany obraz. Przeczytać i umieścić w Lena_color_256.tif. Używając funkcji gamma_correction() i zadeklarowanych współczynników obliczyć obraz wyjściowy, który będzie wyświetlony na monitorze bez korekcji gamma. W górnej części okna graficznego wyświetlić dwa obrazy, wejściowy i wyjściowy uzyskany na monitorze bez korekcji gamma (rysunek 9). Obliczyć obraz wyjściowy wyświetlany na monitorze z korekcją gamma w następujący sposób: odpowiedniej tablicy obraz wejściowy n.p. Obraz wejściowy, przeczytany z pliku Lena_color_256.tif poddać korekcji przy pomocy przekształcenia gamma_correction() ze współczynnikami (1/gamma_r, 1/gamma_g, 1/gamma_b), czyli tak jak pokazuje to czerwona krzywa na rysunku 6. Otrzymany w poprzednim kroku obraz przekształcić tak jak przy wyświetlaniu na monitorze przy pomocy funkcji gamma_correction() ze współczynnikami (gamma_r, gamma_g, gamma_b). Odpowiada to niebieskiej krzywej na rysunku 6. W dolnej części okna graficznego wyświetlić dwa obrazy, wejściowy i wyjściowy otrzymany w wyniku dwóch wyżej opisanych przekształceń, czyli taki jak na monitorze z korekcją gamma (rysunek 9). Rezultat działania programu pokazany został na rysunku 9. Widać, że zastosowanie korekcji gamma spowodowało, że obraz na symulowanym monitorze zostanie wyświetlony prawidłowo. W tym przypadku jest on dokładnie taki sam jak obraz źródłowy, bowiem w opisanym symulatorze procesu wyświetlania współczynniki gamma dla korektora były dokładnie odwrotnościami współczynników gamma dla symulowanego monitora. W praktyce nie jest to aż takie proste, bowiem pomiar współczynników gamma monitora obarczony jest zawsze pewnym błędem. Należy podkreślić, że zdecydowanie lepsze rezultaty daje pomiar przy pomocy sprzętowych kalibratorów. W przypadku pomiaru z wykorzystaniem programów wynik jest zawsze subiektywny. Do samodzielnych eksperymentów można polecić dwa programy, do pobrania na stronach: http://quickgamma.de/QuickMonitorProfile/indexen.html http://www.quickgamma.de/indexen.html Pierwszy wyświetla charakterystykę kolorymetryczną i podstawowe parametry monitora a drugi pozwala na pomiar parametrów gamma. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Rys. 9. Obrazy wejściowe i wyjściowe w torach bez korekcji gamma i z korekcją 3. Wybrane operacje splotowe, filtracja, detekcja krawędzi Opisane w dwóch poprzednich dwóch punktach algorytmy przetwarzania obrazów działały stosunkowo prosto. Piksel obrazu wyjściowego wyliczany był zawsze na podstawie danych opisujących odpowiedni w sensie współrzędnych piksel obrazu wejściowego. W tym punkcie rozważone zostaną trochę bardziej skomplikowane przekształcenia, w których piksel obrazu wyjściowego wyliczany będzie na podstawie informacji pochodzącej z pewnej grupy pikseli obrazu wejściowego. W krańcowym przypadku, grupa ta może zawierać wszystkie piksele obrazu, ale na razie taki przypadek nie będzie rozważany. W dalszej części materiału analizowane będą algorytmy oparte na tak zwanej operacji splotu. Przykład ilustrujący jak działa operacja splotu został pokazany na rysunku 10. Zakładając, że przetwarzaniu poddawany jest obraz monochromatyczny, jasność piksela obrazu wejściowego obliczana jest według następującego algorytmu: Wokół piksela x(i, j) obrazu wejściowego buduje się tak zwane okno (w przykładzie z rysunku rozmiarze 3x3 piksele). Jasności poszczególnych pikseli okna mnoży się przez odpowiednie liczby zawarte w tablicy h(k, l) zwanej maską operacji splotu i wyniki wszystkich mnożeń sumuje się. Sumę obliczoną w kroku poprzednim normalizuje się, dzieląc ją przez sumę elementów maski. Wynik tej operacji przyjmuje się jako jasność piksela y(i, j) obrazu wyjściowego. Normalizacja zapewnia, że wartość y(i, j) nie przekroczy ustalonego przez format obrazu zakresu jasności. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Wzór na podstawie, którego można obliczyć jasność piksela obrazu wyjściowego jest, więc następujący: y( i , j ) 1 hk , l xi k , j l hk , l k ,lK (5) k , l K gdzie K jest oknem określającym otoczenie punktu obrazu a funkcja h(k, l) maską filtru. Jak widać algorytm polega na ważonym uśrednianiu jasności pikseli analizowanego okna. Jasność piksela obrazu wyjściowego jest średnią ważoną z jasności odpowiedniego piksela obrazu wejściowego i jego otoczenia. Średnia wyliczana jest z wagami, określonymi przez maskę h(k, l). piksel obrazu wejściowego x(i, j) piksel obrazu wyjściowego y(i, j) i i Okno K j j 2 4 2 4 8 4 2 4 2 y( i , j ) przykładowa maska filtru 1 hk , l xi k , j l hk , l k ,lK k , l K h(k, l) Rys. 10. Ilustracja zasady przekształcenia splotowego Maska filtru h(k, l) pokazana na rysunku 10 nie jest przypadkowa. Opisuje ona tak zwany filtr gaussowski. Idea uśredniania przy użyciu filtru gaussowskiego jest prosta. Najważniejszy jest piksel w środku okna (na rysunku ma wagę 8) a dalej w miarę oddalania się od centrum okna wagi maleją. Nazwa filtru pochodzi stąd, że funkcję maski h(k, l) można wyobrazić sobie jako przybliżenie znanej funkcji Gaussa (dzwonu) w dwóch wymiarach. Zarówno okna jak i maski mogą być różne. W ten sposób można budować filtry o różnych własnościach. Poniższe zadania pokażą jak działają trzy różne dość typowe dla wielu zastosowań filtry. Filtracja dolnoprzepustowa Jako pierwszy przykład należy zbadać jak działa filtr gaussowski o masce h(k, l) podanej na rysunku 10. W systemie MATLAB z pakietem Image Processing Toolbox realizacja filtrów w jest stosunkowo prosta. Programista ma do dyspozycji kilka uniwersalnych funkcji wspomagających filtrację. Jedną z nich jest funkcja imfilter(), której składnia jest następująca: Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Y = imfilter(X, h); gdzie: X – tablica opisująca obraz wejściowy, Y – tablica opisująca obraz wyjściowy, h – tablica maski filtru, Program wykonujący filtracją gaussowską może, więc wyglądać tak: Zadeklarować tablicę z maską filtru z rysunku 10. Przeczytać i umieścić w Lena_color_256.tif. Znormalizować tablicę maski, dzieląc jej poszczególne elementy przez sumę wszystkich elementów tablicy maski. Przy pomocy funkcji imfilter() obliczyć obraz wyjściowy. Wyświetlić obrazy wejściowy i wyjściowy (rys. 11) i zaobserwować efekt filtracji. odpowiedniej tablicy obraz wejściowy n.p. Rys. 11. Filtracja gaussowska Widać wyraźnie, że w efekcie filtracji uzyskano obraz trochę rozmyty. Krawędzie obiektów zostały zmiękczone a szczegóły stały się mniej wyraźne. Z drugiej strony filtracja spowodowała redukcję drobnych zakłóceń przejawiających się na przykład błędnym odwzorowaniem pojedynczych pikseli. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007 Filtracja górnoprzepustowa, detekcja krawędzi i i inne operacje liniowe Zadanie polega na wykorzystaniu poprzednio napisanego programu i sprawdzeniu, jaki efekt powstanie po zastosowaniu filtrów o podanych niżej maskach. 1 1 1 h( k ,l ) 1 9 1 - filtr górnoprzepustowy 1 1 1 1 1 1 h( k ,l ) 1 8 1 - detektor krawędzi 1 1 1 0 0 1 h( k ,l ) 1 4 1 - Laplasjan 0 1 0 Uwaga: Jeśli suma współczynników maski filtru wynosi 0 normalizację należy pominąć. Studia Podyplomowe – Techniki Wizualizacji Wrocław 2007