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
  hk , l   xi  k , j  l 
 hk , l  k ,lK
(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
  hk , l   xi  k , j  l 
 hk , l  k ,lK
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