Inżynieria obrazów cyfrowych Ćwiczenie 5 Kompresja JPEG

Transkrypt

Inżynieria obrazów cyfrowych Ćwiczenie 5 Kompresja JPEG
Doc. dr inż. Jacek Jarnicki
Instytut Informatyki, Automatyki i Robotyki
Politechniki Wrocławskiej
[email protected]
Inżynieria obrazów cyfrowych
Ćwiczenie 5
Kompresja JPEG
Zadaniem ćwiczenia jest przedstawienie algorytmu kompresji JPEG. W pierwszej części
zostanie w miarę szczegółowo omówiony algorytm kompresji dla obrazów
monochromatycznych i barwnych. Opisane zostaną kolejne kroki algorytmu od konwersji
obrazu do modelu luminancja – chrominancja, przez obliczenie transformaty kosinusowej, do
kodowania entropijnego. Praktyczna część ćwiczenia będzie polegała na napisaniu
uproszczonego kodeka (kodera i dekodera), który pozwoli na symulację prawie całego
procesu kodowania i następnie odtwarzanie obrazu. Uproszczenia będą polegały na tym, że
kodowanie będą jedynie obrazy monochromatyczne oraz (ze względu na zbyt dużą złożoność)
pominięty zostanie fragment dotyczący kodowania entropijnego. W części trzeciej
zaproponowano przeprowadzenie eksperymentu, polegającego na pomiarze stopnia kompresji
i jakości obrazu uzyskanego w procesie kodowania i dekodowania.
Rozważane będą, więc trzy zagadnienia:

algorytm kompresji,

implementacja w języku MATLAB uproszczonej wersji kodeka JPEG,

wpływ stopnia kompresji na jakość odtwarzanego obrazu.
1. Algorytm kompresji i dekompresji obrazu
JPEG jest algorytmem symetrycznym, co oznacza, że operacje wykonywane w dekoderze
są odwróceniem odpowiednich operacji przeprowadzonych w koderze. W związku z tym na
początku opisany zostanie w miarę szczegółowo proces kodowania, a w dalszej części już
w sposób jedynie skrótowy dekoder. Zakłada się, że kompresowany jest obraz może być
monochromatyczny lub barwny, czyli punkty obrazu opisane są przy pomocy odpowiednio
jednej lub trzech liczb całkowitych. Ponadto zakłada się, że szerokość i wysokość obrazu,
liczone w punktach są wielokrotnościami liczby 8. Jeśli warunek ten nie jest spełniony należy
obraz uzupełnić przez dodanie właściwej liczby wierszy i (lub) kolumn.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Algorytm kodowania obrazu realizowany jest w sześciu krokach.
Krok 1 - Konwersja do modelu luminancja – chrominancja
Krok ten wykonywany jest jedynie dla obrazów barwnych, zapisanych inaczej niż
w kategoriach modelu luminancja - chrominancja. W przypadku, gdy kompresowany jest
obraz monochromatyczny, niniejszy krok jest także pomijany. Jeśli założyć, że punkty obrazu
źródłowego opisane są przy pomocy składowych R, G, B konwersja na model luminacja–
chrominancja n. p. model YUV, realizowana jest tak jak to pokazano w ćwiczeniu 3 a więc
przez przeliczenie składowych opisujących barwę punktu przy pomocy wzoru:
0.587
0.114   R 
Y   0.229
U    0.146  0.288  0.434 G 
  
 
V   0.617  0.517 0.100   B 
(1)
Jeśli, tak jak to zostało wcześniej założone, składowe R, G, B są liczbami całkowitymi to
bezpośrednie zastosowanie wzoru (1) spowoduje, że składowe Y, U, V, już liczbami
całkowitymi nie będą. Należy je, więc dalej przeliczyć na liczby całkowite przez n. p.
zaokrąglenie, lub zastosować w miejsce wzoru (1) inną zależność dającą wynik bezpośrednio
w postaci liczb całkowitych.
Krok 2 – Podział obrazu na bloki
Na wstępie od wszystkich składowych obrazu odejmowana jest liczba całkowita równa
połowie zakresu dla jej elementów. Dla przykładu, jeśli składowe Y, U, V zapisane są na 8
bitach to zakres wynosi 256, czyli odejmowana jest liczba 128.
Po wykonaniu odejmowania obraz dzielony jest na tak zwane bloki (mniejsze obrazy)
o rozmiarach 8x8 punktów. Następuje w ten sposób rozpad obrazu na części, które będą dalej
przetwarzane już całkowicie niezależnie. Jeśli obraz jest monochromatyczny, blok opisywany
jest jedną tablicą, w przypadku obrazu barwnego trzema tablicami zawierającymi
odpowiednio składowe Y, U, V.
Dla uproszczenia notacji i w jednym i w drugim przypadku blok będzie zapisywany jako
tablica f :
f  f ( i, j )
i  0,1 ,...,7 j  0,1 ,...,7
(2)
Krok 3 – Obliczenie transformaty kosinusowej dla bloków
Dla każdego bloku obliczana jest transformata kosinusowa zadana wzorami (3) i (5).
F ( k ,l ) 
C( k )C( l ) 7

4
i 0
7
 2i  1 
 2 j 1 
k  cos 
l 
16

 16

 f ( i , j ) cos 
j 0
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
(3)
f ( i, j ) 
1 7

4 k 0
 2i  1 
k  cos
16

7
 C( k )C( l )F ( k ,l ) cos 
l 0
 2 j 1 
l 

 16

(4)
gdzie:
1 / 2 dla k  0
C( k )  
dla k  0
1
1 / 2 dla l  0
i C( l )  
dla l  0
1
(5)
Jak widać przekształcenie polega na obliczeniu dla tablicy f o rozmiarze 88, innej tablicy
F, o elementach F(k, l) również o rozmiarze 88. Wzór (4) opisuje natomiast tak zwaną
transformatę odwrotną. Pozwala ona z tablicy F odtworzyć z powrotem tablicę, f, czyli blok
danych opisujących obraz. Transformata odwrotna będzie wykorzystana w dekoderze.
Krok 4 – Kwantyzacja współczynników transformaty kosinusowej
Wynikiem obliczeń z poprzedniego kroku jest tablica F, czyli transformata kosinusowa
tablicy danych f opisujących blok. Elementy tablicy F są oczywiście liczbami rzeczywistymi.
Przekształcenie zwane kwantyzacją ma dwa zadania. Po pierwsze usunięcie z danych,
informacji opisującej szczegóły obrazu praktycznie niewidoczne dla oka ludzkiego. Po drugie
zastąpienie liczb rzeczywistych przybliżeniami całkowitoliczbowymi. Kwantyzacja
wykonywana jest według zależności opisanych wzorami (6), (7) i (8). Tak, więc zgodnie
ze wzorem (6) efektem kwantyzacji jest tablica liczb całkowitych FQ = FQ(k, l), której
wyliczenie sprowadza się do podzielenia współczynnika transformaty kosinusowej z tablicy F
przez odpowiedni element tablicy kwantyzacji Q a następnie do zaokrągleniu wyniku do
najbliższej liczby całkowitej. Do kwantyzacji współczynników transformaty dla składowych
opisujących luminancje i chrominancję stosuje się zwykle różne tablice Q. Tablica, Q
o elementach Q(k, l) zapisana przy pomocy zależności (7) jest przykładem tablicy stosowanej
do kwantyzacji luminancji, natomiast zależność (8) pokazuje przykład tablicy kwantyzacji dla
chrominancji.
 F ( k ,l ) 

F Q ( k ,l )  Integer Round 
Q
(
k
,
l
)


 16
 12

 14

14
Q(k,l)  
 18

 24
 49

 72
11
12
13
17
22
35
64
92
10
14
16
22
37
55
78
95
16
19
24
29
56
64
87
98
24
26
40
51
68
81
103
112
40
58
57
87
109
104
121
100
51 61 
60 56 
69 56 

80 62 
103 77 

113 92 
120 101

103 99 
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
(6)
(7)
17
18

 24

47
Q(k , l )  
 99

 99
 99

 99
18
21
26
99
99
99
99
99
24
26
56
99
99
99
99
99
47 24
66 26
99 99
99 99
99 99
99 99
99 99
99 99
40 51
58 60
99 99
99 99
99 99
99 99
99 99
99 99
61 
56 
99 

99 
99 

99 
99 

99 
(8)
Dla typowych obrazów fotograficznych uzyskana w wyniku kwantyzacji tablica
FQ = FQ(k, l) zawiera zwykle stosunkowo dużą liczbę zer rozmieszczonych zazwyczaj
w obszarze prawego dolnego rogu tablicy. Oczywiście liczba i rozkład zer zależą od wartości
współczynników transformaty F i od wartości liczb zapisanych w tablicach kwantyzacji. Jak
widać we wzorach (7) i (8) liczby Q(k, l ) są znacznie większe w okolicy prawego dolnego
rogu tablic kwantyzacji, tam, bowiem w tablicy współczynników transformaty F znajdują się
współczynniki związane z praktycznie niewidocznymi dla oka ludzkiego szczegółami obrazu.
Należy jeszcze raz podkreślić, że przedstawione tablice kwantyzacji (7), (8) zawierają jedynie
wartości przykładowe, ilustrujące ideę eliminacji szczegółów obrazu przez całkowitoliczbowe
przybliżenie jego transformaty. W praktyce wartości liczb Q(k, l) mogą być także inne.
Dokładnie problem ten zostanie zilustrowany w praktycznej części ćwiczenia.
Krok 5 – Zamiana tablicy współczynników na wektor
Następnym krokiem algorytmu, mającym za zadanie przygotowanie danych uzyskanych
w wyniku kwantyzacji współczynników transformaty kosinusowej do kodowania, jest
zamiana tablicy liczb całkowitych FQ = FQ(k, l) na wektor. Zamiana tablicy na wektor polega
na zapisaniu elementów tablicy FQ w odpowiedniej kolejności określonej przez tak zwany
algorytm zig-zag. Schemat wyjaśniający ideę algorytmy zig-zag pokazano poniżej.
 F Q ( 0 ,0 )

 Q
 F ( 1,0 )
F Q ( k ,l )  
 F Q ( 2 ,0 )


 ...
F Q ( 0,1 )
F Q ( 0,2 )
...
F Q ( 1,1 )
F Q ( 1,2 )
...
F Q ( 2,1 )
F Q ( 2,2 )
...
...
...
...









(9)
Dla wygody dalszego opisu dogodnie jest wprowadzić następującą konwencje zapisu
elementów tablicy FQ:
F Q  DC
AC1
AC2
AC3 ... AC63 
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
(10)
Pierwszy element wektora współczynników DC = FQ(0, 0) nosi nazwę składowej stałej,
następne elementy AC1 = FQ(0, 1), AC2 = FQ(1, 0) itd. aż do AC63 = FQ(7, 7), określone
zgodnie z algorytmem zig-zag, nazywane są składowymi zmiennymi. Przekształcenie tablicy
w wektor według schematu zig-zag ma sens, dlatego że zazwyczaj duża liczba zer znajdująca
się w prawym dolnym rogu tablicy, zostanie przekształcona po zapisie w postaci wektora
w długi ciąg zer. Taki ciąg jest obiektem stosunkowo prostym do oszczędnego zakodowania.
Krok 6 – Kodowanie entropijne wektora współczynników
Ostatnim krokiem algorytmu kompresji jest kodowanie entropijne wektorów FQ
zapisanych w postaci (10). Idea kodowania entropijnego polega na tym, że długość słowa
kodowego służącego do zapisania kodowanego elementu jest powiązania
z prawdopodobieństwem pojawienia się tego elementu. Żeby zminimalizować średnią
długość ciągu kodowego (ciągu słów kodowych opisujących kolejne elementy), te elementy,
które występują częściej kodowane są przy pomocy słów krótszych niż słowa kodowe
przypisywane elementom występującym rzadziej.
Kodowanie entropijne wektorów FQ wykonywane jest osobno dla składowych stałych DC
i składowych zmiennych ACi.
Kodowanie składowej stałej DC
W typowym obrazie fotograficzny bliskie siebie bloki są zwykle dość podobne.
Konsekwencją tego faktu jest to, że składowa stała transformaty kosinusowej dla bliskich
bloków różni się zazwyczaj niewiele. W związku z tym w algorytmie JPEG zastosowano
kodowanie składowej stałej nie bezpośrednio, lecz przy pomocy różnic.
Po podziale na bloki przeprowadzonym w drugim punkcie algorytmu struktura obrazu jest
taka jak pokazano na rysunku 1.
DC0
DC1
DC2
blok 0
blok 1
blok 2
DCk
DCk+1
blok k
blok k+1
DC2k
blok 2k
...
...
...
...
Rys. 1. Obraz podzielony na bloki
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
W poprzednich krokach algorytmu dla każdego z bloków została obliczona skwantowana
składowa stała transformaty kosinusowej DCi (górny indeks określa kolejność bloku zgodnie
ze schematem pokazanym na rysunku 1). Wyodrębniając z każdego bloku składowa stałą
można, więc utworzyć wektor w postaci:

DC  DC0
DC1 DC 2
,..., DC k
DC k 1 ,..., DC m

(11)
gdzie m jest liczbą bloków obrazu.
Algorytm kodowania elementów wektora DC jest następujący:

Zbudować wektor  w postaci:
   0  1  2 ,...,  k
 k 1 ,...,  m 
(12)
gdzie:
 0  DC 0
 k  DC k  DC k 1

dla
(13)
k  1,2,...,m
Dla kolejnych k określić liczby size przy pomocy zależności:
size  IntegerRou nd log 2 absk   1

(14)
Zakodować elementy wektora  przy pomocy poniższej tabeli kodu Hoffmana.
Tab. 1. Tablica kodowania dla składowej stałej
Wartość k
size
Kod Huffmana dla size
Bity dodatkowe
0
0
00
-
-1, 1
1
010
0,1
-3,-2, 2, 3
2
011
00,01,10,11
-7,…,-4,4,…7
3
100
000,…,011,100,…,111
-15,…,-8,8,…,15
4
101
0000,…,0111,1000,…,1111
…
…
…
…
-2047,…-1024,1024,…,2047
11
1 1111 1110
000 0000 0000,…,111 1111 1111
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Ciąg bitów kodujący kolejny element k , wektora  ustala się w następujący sposób.
Po pierwsze dla k i liczby size obliczonej przy pomocy wzoru (14) odczytuje się
z kolumny 3 w tabeli 1 bity kodu Huffmana dla size. Po drugie w zależności od pozycji k
w kolumnie 1 dodaje się do odczytanych z kolumny 3 bitów kodu odpowiednie bity
dodatkowe z kolumny 4.
Analizując zawartość tabeli 1 można łatwo dostrzec, na czym polega idea kodowania
entropijnego. Dla typowego obrazu fotograficznego prawdopodobieństwo, że blisko położone
względem siebie bloki różnią się niewiele jest duże. W takim przypadku liczby k, będące
różnicami składowych stałych dla bliskich bloków będą również z dużym
prawdopodobieństwem niewielkie, a często będą wynosiły wręcz 0. W tabeli 1 liczbie k = 0
przypisano, więc najkrótszy kod (00). Widać także, że coraz większym wartościom k (są one
coraz mniej prawdopodobne) przypisane zostały coraz dłuższe kody.
Kodowanie składowych zmiennych AC1 - AC63
Kodowanie składowych zmiennych ACk przeprowadza się osobno dla każdego bloku.
Składowa stała DC została już zapisana wcześniej. Dla każdego bloku kodowaniu podlega,
więc wektor w postaci:
AC1
AC 2
AC3
,..., AC 63 
(15)
Wykonana w kroku 4 kwantyzacja współczynników transformaty kosinusowej
spowodowała, że stosunkowo dużo współczynników ACk przyjmuje wartość 0. Na wektor
(15) można, więc spojrzeć jako na układ zbudowany z niektórych niezerowych
współczynników ACk, przedzielonych ciągami współczynników o wartości zerowej, czyli:
AC1
AC2
AC3
,..., AC63   ..., ACk 1 0 ,..., 0 ACk
0 ,..., ACk 1 ,...
Jeśli dwa niezerowe współczynniki ACk będą następowały bezpośrednio po sobie,
przedzielający je ciąg zer można traktować jako ciąg pusty o długości 0.
Przy takim sposobie podejścia dla zapisania wektora współczynników składowej zmiennej
wystarczy określić regułę kodowania dla kolejnych ciągów współczynników w postaci
0,…, 0, ACk. W metodzie kodowania przyjętej w algorytmie JPEG ciąg taki zapisywany jest
przy pomocy pary tak zwanych symboli. W dalszym ciągu stosowana będzie następująca
notacja,
0,..., 0, AC k  symbol _ 1, symbol _ 2
(16)
przy czym poszczególne symbole określone są w następujący sposób:
symbol _ 1  runlength , size
symbol _ 2  amplitude
gdzie elementy runlength, size i amplitude to:
runlength – liczba zer pomiędzy niezerowym współczynnikiem ACk i poprzednim
niezerowym współczynnikiem ACk-1 ,
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
size – liczba określającą zakres, w którym znajduje się wartość współczynnika ACk ,
amplitude – liczba wyrażająca wartość współczynnika ACk .
Do zakodowania ciągu współczynników w postaci 0,…, 0, ACk używa się podobnie jak to
miało miejsce przy kodowaniu składowej stałej metody entropijnej, wykorzystującej kod
Huffmana. Jednak algorytm jest w tym przypadku trochę bardziej skomplikowany. Można go
zapisać w czterech krokach:

Obliczyć runlength, czyli liczbę pomiędzy niezerowym współczynnikiem ACk i
poprzednim niezerowym współczynnikiem ACk-1

Dla niezerowego współczynnika ACk obliczyć size ze wzoru
size  IntegerRou nd log 2 absk   1

Zakodować parę (runlength, size) według tabeli kodu Huffmana. Fragment tabeli
pokazano poniżej.
Tab. 2. Fragment tabeli kodu Huffmana dla par (runlength, size)
(runlength, size)
kod Huffmana
(runlength, size)
kod Huffmana
(0, 1)
00
(0, 6)
1111000
(0, 2)
01
(1, 3)
1111001
(0, 3)
100
(5, 1)
1111010
EOB
1010
(6, 1)
1111011
(0, 4)
1011
(0, 7)
11111000
(1, 1)
1100
(2, 2)
11111001
(0, 5)
11010
(7, 1)
11111010
(1, 2)
11011
(1, 4)
111110110
(2, 1)
11100
…
…
(3, 1)
111010
ZRL
11111111001
(4, 1)
111011
…
…
Występujące w tabeli 2 oznaczenia EOB i ZRL służą do zapisania odpowiednio,
EOB samych zer do końca bloku, ZRL ciągu 16 zer, które można traktować jako 15
zer i zerowy współczynnik ACk . Tabela 2 jest tylko fragmentem zwierającym
najbardziej prawdopodobne kombinacje par (runlength, size) tabeli kodu Huffmana.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Pełna tabela kodowa
AC_HUFFMAN.pdf

liczy
162
wiersze
i
została
dołączona
w
pliku
Zakodować liczbę amplitude, używając liczby size obliczonej w kroku 2 posługując
się następującą tablicą:
Tab. 3. Tablica do zakodowania wartości współczynnika ACk jako amplitude
size
wartość ACk
kod amplitude
0
0
---
1
-1, 1
0, 1
2
-3, -2, 2, 3
00, 01, 10, 11
3
-7, …,-4, 4, …,7
000, …, 011, 100, …,111
4
-15, …,-8, 8, …,15
0000, …, 0111, 1000, …, 1111
…
…
…
11
-2047,…,-1024,1024,…,2047
000 0000 0000,…,111 1111 1111
W ten sposób działa algorytm realizowany w koderze JPEG. Podsumowując proces
kodowania można w pewnym uproszczeniu przedstawić tak jak to pokazano na rysunku 2.
Bloki 8x8
danych
źródłowych
DCT
Kwantyzator
Tablice
kwantyzacji
Koder
bitowy
Dane
skompresowane
Tablice
kodu
Huffmana
Rys. 2. Uproszczona struktura kodera JPEG
Algorytm wykorzystuje dane opisujące kodowany obraz oraz dwa zestawy tablic, tablice
kwantyzacji i tablice kodu Huffmana. W koderze po podziale obrazu na bloki następuje
obliczenie transformaty kosinusowej dla poszczególnych bloków (3) a następnie kwantyzacja
współczynników transformaty (6), (7), (8). Po skwantowaniu, tablice współczynników dla
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
poszczególnych bloków są przekształcane w wektory zgodnie z regułą zig-zag i kodowane
entropijnie z wykorzystaniem tablic kodu Huffmana. Osobno kodowane są składowe stałe dla
poszczególnych bloków i składowe zmienne w blokach.
Operacje wykonywane w dekoderze są w zasadzie odwrotnością czynności wykonanych
w koderze, tak jak pokazano to na rysunku 3. Skompresowane dane przekształcane są w
dekoderze bitowym, wykorzystującym tablice kodu Huffmana w wektory FQ (10), które po
zastosowaniu algorytmu odwrotnego do algorytmu zig-zag zamieniane są w tablice FQ(k, l)
(9). Po operacji odwrotnej do kwantyzacji, czyli pomnożeniu poszczególnych elementów
tablic FQ(k, l) przez odpowiednie elementy tablic Q(k, l) otrzymuje się przybliżenia tablic
współczynników transformaty kosinusowej F. Kolejnym etapem jest obliczenie odwrotnej
transformaty kosinusowej (4), czyli odtworzenie bloków danych.
Dane
skompresowane
Dekoder
bitowy
Tablice
kodu
Huffmana
Dekwantyzator
DCT-1
Tablice
kwantyzacji
Rys. 3. Uproszczona struktura dekodera JPEG
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Bloki 8x8
danych
odtworzonych
2. Uproszczony kodek JPEG
W części praktycznej ćwiczenia należy napisać program realizujący kodek, czyli zestaw
koder i dekoder, dla obrazów zapisanych według algorytmu JPEG. Kodowane będą obrazy
monochromatyczne o rozmiarze 256 x 256 pikseli zapisanych na 8 bitach. Ze względu na to,
że pełny proces kodowania i dekodowania jest dość skomplikowany (dotyczy to zwłaszcza
kroku 6) przyjęte zostaną następujące założenia upraszczające:

Kodowaniu i dekodowaniu podlegał będzie jedynie obraz monochromatyczny, czyli
pominięty zostanie krok 1 polegający na zamianie opisu obrazu na model barw YUV
lub YIQ .

Ze względu na zbytnie skomplikowanie opuszczony będzie krok 5 (zamiana tablicy
na wektor przy pomocy reguły zig-zag) i krok 6 (kodowanie entropijne).
Wprowadzone ograniczenia spowodują, że wynikiem kodowania będzie jedynie tablica
skwantowanych współczynników transformaty kosinusowej FQ = FQ(k, l) otrzymywana jako
wynik kroku 4.
Ponadto dla uzyskania możliwości doświadczalnego zbadania wpływu kwantyzacji na
jakość kompresji wprowadzono dodatkowo zmienną nazwaną α i przyjmującą wartości
całkowite 1, 2, … określającą stopień kompresji. Zmieniając α można w prosty sposób
wpływać na stopień kompresji w ten sposób, że przez wartość α mnożone są wszystkie
elementy tablicy kwantyzacji Q. Zależność opisującą proces kwantyzacji przyjmuje, więc
postać:
 F (k , l ) 

F Q (k , l )  Integer Round 
   Q( k , l ) 
(17)
Wzór (17) jest, więc rozszerzoną wersją wzoru (6) a jego senes jest taki, że im większa
będzie wartość zmiennej α tym elementy tablicy transformaty kosinusowej F(k, l) dzielone
będą przez większe liczby i w tablicy FQ = FQ(k, l) uzyska się więcej zer. Schemat
uproszczonego kodera uwzględniającego modyfikację polegającą na sterowaniu stopniem
kompresji przy pomocy zmiennej α pokazano na rysunku 4.
W dekoderze, którego schemat przedstawiony został na rysunku 5 operacja kwantyzacji
odwrotnej dla danego stopnia kompresji α realizowana jest przy pomocy zależności:
~
F k , l   F Q (k , l )    Q(k , l )
(18)
~
przy czym F k , l  jest tablicą współczynników transformaty kosinusowej odtworzoną
w dekoderze. Struktura uproszczonego dekodera zaprezentowana została na rysunku 5. Jak
widać operacje wykonywane w koderze i dekoderze są praktycznie symetryczne.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Obraz źródłowy
Odjęcie od wartości elementów
obrazu liczby 128
Podział obrazu na bloki
i obliczenie dla bloków
transformaty kosinusowej, wzór (3)
Tablica
kwantyzacji
Q ,wzór (7)
Kwantyzacja współczynników
transformaty kosinusowej,
wzór (17)
Stopień
kompresji
α
Obraz zakodowany FQ = FQ(k, l)
Rys. 4. Schemat uproszczonego kodera JPEG
Obraz zakodowany FQ = FQ(k, l)
Tablica
kwantyzacji
Q, wzór (7)
Odwrócenie kwantyzacji
współczynników transformaty
kosinusowej wzór (18)
Obliczenie dla bloków obrazu
odwrotnej transformaty
kosinusowej, wzór (4)
(wzór 4)
Dodanie do wartości elementów
obrazu liczby 128
Obraz zrekonstruowany
Rys. 5. Schemat uproszczonego dekodera JPEG
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Stopień
kompresji
α
 Szkielet programu kodeka JPEG w języku MATLAB
Program składał się będzie z trzech plików:

Programu „głównego” realizującego koder i dekoder o nazwie na przykład
jpeg_codec.m,

funkcji quantization.m wykonującej kwantyzację według wzoru (17),

funkcji dequantizatio.m służącej do odwrócenia operacji kwantyzacji,
realizującej wzór (18)
Funkcje
quantization.m
i
dequantizatio.m
w odpowiednich miejscach programu jpeg_codec.m
wywoływane
będą
Wskazówki dla realizacji poszczególnych funkcji są następujące:
Funkcja jpeg_codec.m
Koder (realizacja procesu z rysunku 4)

Utworzyć plik o nazwie jpeg_codec.m.

Przeczytać z pliku Lena_gray_8.tif obraz źródłowy i umieścić go w tablicy.

Przekonwertować elementy tablicy zawierającej przeczytany obraz do formatu
double. Należy zastosować zwykłą konwersję tablicy liczb całkowitych do tablicy
liczb typu double, czyli B = double(A) a nie B = im2double(A), która
skaluje elementy do wartości z przedziału [0, 1].

Od elementów otrzymanej w poprzednim kroku tablicy należy odjąć liczbę 128.

Podzielić tablicę zawierająca elementy obrazu na bloki i wykonać na elementach
bloków transformatę kosinusową. Można to bardzo łatwo zrobić przy pomocy funkcji
blkproc(…)(patrz system pomocy Help), która wykonuje na blokach o zadanym
rozmiarze w tablicy A, zadaną funkcję i wynik umieszcza w tablicy B. W programie
kodeka należy po prostu wywołać funkcję w postaci:
B = blkproc (A, [8,8], 'dct2');
Spowoduje to, że tablica A zostanie podzielona na bloki o rozmiarze 8 x 8, na każdym
z bloków zostanie wykonana dwuwymiarowa transformata kosinusowa opisana
wzorem (3), zrealizowana w pakiecie MATALB przy pomocy funkcji dct2 a wynik
obliczeń umieszczony zostanie w tablicy B.

Wykonać kwantyzację współczynników transformaty kosinusowej, stosując znów
funkcje blkproc(…), przy czym trzecim argumentem funkcji powinna być tym
razem funkcja realizująca kwantyzacje quantization. Funkcję ta należy napisać
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
samodzielnie a jej konstrukcja zostanie podana dalej. W efekcie powstanie tablica
zawierająca kwantowane współczynniki transformaty kosinusowej a więc zgodnie z
założeniami zakodowany obraz.
Dekoder (realizacja procesu z rysunku 5)

Wykonać odwrócenie kwantyzacji współczynników zakodowanego obrazu stosując
jeszcze raz funkcję blkproc(…), trzecim argumentem funkcji powinna być teraz
funkcja realizująca odwrócenie kwantyzacji dequantization. Podobnie jak
funkcję quantization należy ja samodzielnie napisać.

Stosując kolejny raz funkcję blkproc(…), tym razem z trzecim parametrem
idct2 obliczyć odwrotną transformatę kosinusową dla bloków przetwarzanej
tablicy. Funkcja idct2 służy w pakiecie MATLAB do obliczania odwrotnej
transformaty kosinusowej opisanej wzorem (4).

Do elementów otrzymanej w poprzednim kroku tablicy dodać liczbę 128.

Znormalizować elementy tablicy do wartości z przedziału [0, 1] przez podzielenie ich
przez liczbę 255.

Wykonać konwersję tablicy na obraz w formacie uint8 przy pomocy funkcji
im2uint8(…)otrzymując w efekcie obraz zrekonstruowany ze skompresowanych
danych.

W oknie graficznym wyświetlić obraz źródłowy (przeczytany z pliku) i obraz
zrekonstruowany.
Funkcja qantization
Zadaniem funkcji jest wykonanie kwantyzacji opisanej wzorem (17). Poszczególne
etapy, jakie należy wykonać przy pisaniu funkcji są następujące:

Utworzyć plik o nazwie quantization.m

Zadeklarować postać funkcji wpisując w pierwszej linii pliku.
function B = quantization(A)

Zadeklarować zmienną alpha (współczynnik kompresji α ) i ustawić wartość tej
zmiennej na przykład na 1.

Zadeklarować tablicę Q o rozmiarze 8 x 8 zgodnie ze wzorem (7).

Zakodować wzór (17) używając do zaokrąglenia funkcji round(…)
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Funkcja deqantization
Funkcja ma realizować odwrócenie operacji kwantyzacji opisane wzorem (18).
Struktura funkcji jest podobna do poprzednio opisanej funkcji quantization.

Utworzyć plik o nazwie dequantization.m

Zadeklarować postać funkcji wpisując w pierwszej linii pliku.
function B = dequantization(A)

Zadeklarować zmienną alpha (współczynnik kompresji) i ustawić wartość tej
zmiennej na przykład na 1.

Zadeklarować tablicę Q o rozmiarze 8 x 8 zgodnie ze wzorem (7).

Zakodować wzór (18).
Wykonanie programu jpeg_codec powinno spowodować wyświetlenie w oknie
graficznym dwóch obrazów, obrazu źródłowego i obrazu zrekonstruowanego, czyli
otrzymanego po przeprowadzeniu procesu kompresji i dekompresji. Obrazy powinny się
różnić. Wiadomo, że wykonywana według powyżej opisanego algorytmu kompresja JPEG
jest kompresją stratną a więc obraz zrekonstruowany nie jest już taki sam jak obraz źródłowy,
bowiem z obrazu źródłowego usunięte zostały niektóre szczegóły. Zmieniając wartość
współczynnika α (zrealizowanego w programie przy pomocy zmiennej alpha), przez
podanie kolejnych wartości całkowitych 1, 2, … itd. można wpływać na stopień kompresji i
obserwować jak zmienia się jakość obrazu zrekonstruowanego. Przykłady obrazów
źródłowego i zrekonstruowanego przy wartościach α = 1 i α = 10 pokazane zostały na
rysunkach 6 i 7. Jak widać na rysunkach dla α = 1 obraz zrekonstruowany prawie nie różni się
od źródłowego natomiast dla α = 10 można zaobserwować już znaczącą różnicę.
Można przeprowadzić eksperyment polegający na zmianie współczynnik kompresji α
i obserwacji obu obrazów. Ocena wizualna jest oczywiście w jakimś sensie miarodajna,
jednak dla obiektywnego porównania obrazów i stwierdzenia wpływu stopnia kompresji na
jakość jej rezultatu stosowane są pewne kryteria liczbowe.
3. Stopień kompresji i jakość obrazu zrekonstruowanego
Stopień kompresji obrazu uzyskany w efekcie zastosowania dowolnego algorytmu
kompresji można w oczywisty sposób zmierzyć porównując wielkość pliku zawierającego
obraz źródłowy z wielkością pliku, w którym zapisano dane po wykonaniu kompresji.
W przypadku uproszczonej wersji algorytmu, jaką zaproponowano w poprzednim punkcie nie
jest to jednak bezpośrednio możliwe, bowiem algorytm jako wynik kompresji nie tworzy
pliku a jedynie tablicę skwantowanych współczynników transformaty kosinusowej.
Implementacja pomija, bowiem ostatni krok algorytmu, czyli kodowanie entropijne. Można
jednak wprowadzić w miarę sensowne kryterium pomiaru stopnia kompresji. Kryterium takim
może być na przykład liczba zer w tablicy skwantowanych współczynników transformaty
kosinusowej. Można powiedzieć, że im więcej zer tym większa kompresja.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Rys. 6. Obraz źródłowy i zrekonstruowany dla α = 1
Rys. 7. Obraz źródłowy i zrekonstruowany dla α = 10
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
 Ocena stopnia kompresji
Przyjmując za kryterium oceny stopnia kompresji liczbę zer w tablicy skwantownych
współczynników transformaty kosinusowej należy zmodyfikować poprzednio napisany
program w sposób następujący:

W programie jpeg_codec po części implementującej koder obliczyć liczbę zer
w tablicy kwantowanych współczynników transformaty kosinusowej. Do obliczenia
liczby zer w tablicy najlepiej jest użyć funkcji nnz(…) (patrz system pomocy Help).

Dodać fragment kodu wyświetlający na konsoli liczbę odpowiadającą procentowej
zawartości zer w tablicy skwantowanych współczynników transformaty kosinusowej.
Po wprowadzeniu tych prostych modyfikacji należy zaobserwować jak zmienia się
procentowa zawartość zer, dla różnych wartości współczynnika α.
 Ocena jakości obrazu zrekonstruowanego
Ocenę jakości obrazu odtworzonego ze skompresowanych danych można przeprowadzić
porównując obraz źródłowy i zrekonstruowany. Do porównania dwóch obrazów powszechnie
stosuje się kryterium błędu średniokwadratowego MSE (Mean Square Error) wyrażonego
w postaci:
MSE ( X , Y ) 
1 n m
xi, j   yi, j 2

n  m i 1 j 1
(19)
gdzie:
X – tablica o elementach x(i, j) opisująca obraz źródłowy,
Y – tablica o elementach y(i, j) opisująca obraz zrekonstruowany,
n, m – rozmiary obrazów.
Często także kryterium MSE przedstawia się dla wygody, w trochę innej postaci, w skali
logarytmicznej. Kryterium nazywane jest wtedy PSNR (Peak Signal to Noise Ratio), co
oznacza stosunek szczytowej wartości sygnału do szumu i opisane jest wzorem:


255
PSNR  X , Y   20  log10 

 MSE  X , Y  
(20)
Jednostką PSNR jest tak zwany decybel oznaczany w skrócie jako dB.
Aby nie komplikować zadania w materiałach do ćwiczenia została dodana gotowa funkcja
[mse, psnr] = mse_error(A, B) obliczająca dla dwóch kwadratowych obrazów
wartości wskaźników MSE i PSNR.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007
Wykorzystując tą funkcję należy przeprowadzić eksperyment polegający na wyznaczeniu
MSE i PSNR dla obrazów źródłowego i zrekonstruowanego dla różnych wartości
współczynnika kompresji α a wyniki zestawić w tabelce lub zaprezentować na wykresie.
Studia Podyplomowe – Techniki Wizualizacji
Wrocław 2007

Podobne dokumenty