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

Podobne dokumenty
Założenia i obszar zastosowań. JPEG - algorytm kodowania obrazu. Geneza algorytmu KOMPRESJA OBRAZÓW STATYCZNYCH - ALGORYTM JPEG

KOMPRESJA OBRAZÓW STATYCZNYCH - ALGORYTM JPEG

Kompresja obrazów w statycznych - algorytm JPEG

Według raportu ISO z 1988 roku algorytm JPEG składa się z następujących kroków: 0.5, = V i, j. /Q i, j

Techniki wizualizacji. Ćwiczenie 2. Obraz cyfrowy w komputerze

Kompresja sekwencji obrazów - algorytm MPEG-2

Kodowanie transformacyjne. Plan 1. Zasada 2. Rodzaje transformacji 3. Standard JPEG

Kompresja sekwencji obrazów

Joint Photographic Experts Group

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

Kompresja danych DKDA (7)

Sieci neuronowe - projekt

3. Macierze i Układy Równań Liniowych

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Kodowanie informacji. Kody liczbowe

Inżynieria obrazów cyfrowych. Ćwiczenie 3. Wybrane modele kolorów i ich zastosowania

2. Układy równań liniowych

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

5. Rozwiązywanie układów równań liniowych

Kodowanie transformujace. Kompresja danych. Tomasz Jurdziński. Wykład 11: Transformaty i JPEG

0 + 0 = 0, = 1, = 1, = 0.

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 11,

mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 4, strona 1. GOLOMBA I RICE'A

Zastosowanie kompresji w kryptografii Piotr Piotrowski

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne

Kompresja Kodowanie arytmetyczne. Dariusz Sobczuk

Sortowanie zewnętrzne

Kodowanie i kompresja Streszczenie Studia dzienne Wykład 9,

Instytut Politechniczny Państwowa Wyższa Szkoła Zawodowa. Diagnostyka i niezawodność robotów

Transformaty. Kodowanie transformujace

Klasyfikacja metod kompresji

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Algorytmy i struktury danych. Wykład 4

Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI

Aproksymacja funkcji a regresja symboliczna

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Dane obrazowe. R. Robert Gajewski omklnx.il.pw.edu.pl/~rgajewski

Obliczenia iteracyjne

Wybrane metody kompresji obrazów

Transformata Fouriera

Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości

Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Instrukcja do pracowni specjalistycznej

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Zasady arytmetyki stałoprzecinkowej oraz operacji arytmetycznych w formatach Q

Rijndael szyfr blokowy

Zad. 3: Układ równań liniowych

Macierze. Rozdział Działania na macierzach

Zajęcia wprowadzające W-1 termin I temat: Sposób zapisu wyników pomiarów

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Podstawy MATLABA, cd.

Przedmowa 11 Ważniejsze oznaczenia 14 Spis skrótów i akronimów 15 Wstęp 21 W.1. Obraz naturalny i cyfrowe przetwarzanie obrazów 21 W.2.

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

8. Analiza widmowa metodą szybkiej transformaty Fouriera (FFT)

Klasyfikacja metod kompresji

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Metoda eliminacji Gaussa. Autorzy: Michał Góra

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium Nr 4

Logiczny model komputera i działanie procesora. Część 1.

Rozdział 1 PROGRAMOWANIE LINIOWE

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Metody numeryczne Wykład 4

Python: JPEG. Zadanie. 1. Wczytanie obrazka

Stan wysoki (H) i stan niski (L)

Techniki wizualizacji. Ćwiczenie 4. Podstawowe algorytmy przetwarzania obrazów

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

LICZBY ZMIENNOPRZECINKOWE

Cyfrowe przetwarzanie i kompresja danych. dr inż.. Wojciech Zając

Kodowanie Huffmana. Platforma programistyczna.net; materiały do laboratorium 2014/15 Marcin Wilczewski

Luty 2001 Algorytmy (7) 2000/2001

Systemy liczbowe używane w technice komputerowej

Kwantyzacja wektorowa. Kodowanie różnicowe.

ZADANIE 1. Rozwiązanie:

Rozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm

Programowanie strukturalne i obiektowe. Funkcje

Synteza strukturalna automatu Moore'a i Mealy

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

2 Kryptografia: algorytmy symetryczne

Kompresja dźwięku w standardzie MPEG-1

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

Przetwarzanie i transmisja danych multimedialnych. Wykład 8 Transformaty i kodowanie cz. 2. Przemysław Sękalski.

Ćwiczenie 6. Transformacje skali szarości obrazów

Temat: Algorytm kompresji plików metodą Huffmana

Kompresja JPG obrazu sonarowego z uwzględnieniem założonego poziomu błędu

1 Układy równań liniowych

AKADEMIA MORSKA KATEDRA NAWIGACJI TECHNICZEJ

Zadanie 2: Arytmetyka symboli

Wykład II. Reprezentacja danych w technice cyfrowej. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Pętle. Dodał Administrator niedziela, 14 marzec :27

teoria informacji Kanały komunikacyjne, kody korygujące Mariusz Różycki 25 sierpnia 2015

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Arytmetyka liczb binarnych

Układy równań i nierówności liniowych

Urządzenia Techniki. Klasa I TI. System dwójkowy (binarny) -> BIN. Przykład zamiany liczby dziesiętnej na binarną (DEC -> BIN):

Polcode Code Contest PHP-10.09

Księgarnia internetowa Lubię to!» Nasza społeczność

Kilka prostych programów

Transkrypt:

Doc. dr inż. Jacek Jarnicki Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej jacek.jarnicki@pwr.wroc.pl 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.

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: Y 0. 229 U 0. 146 V 0. 617 0. 587 0. 288 0. 517 0. 114 R 0. 434 G 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). C( k )C(l ) F( k,l ) 4 7 7 2i 1 2 j 1 f (i, j )cos k cos l 16 i0 j0 16 (3)

f (i, j ) 4 1 7 7 2i 1 2 j 1 C( k )C(l )F( k,l )cos k cos l 16 k0 l0 16 (4) gdzie: 1 / 2 dla k 0 1 / 2 dla l 0 C ( k ) i C( l ) (5) 1 dla k 0 1 dla l 0 Jak widać przekształcenie polega na obliczeniu dla tablicy f o rozmiarze 88, innej tablicy F, o elementach F(k, l) również o rozmiarze 88. 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 F = F (k, l), której wyliczenie sprowadza się do podzielenia współczynnika transformaty kosinusowej z tablicy F przez odpowiedni element tablicy kwantyzacji 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. Tablica, o elementach (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 ( k,l ) Integer Round (6) ( k,l ) 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 56 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 (k, l) (7) 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99

17 18 24 47 24 40 51 61 18 21 26 66 26 58 60 56 24 26 56 99 99 99 99 99 47 99 99 99 99 99 99 99 ( k, l) (8) 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 Dla typowych obrazów fotograficznych uzyskana w wyniku kwantyzacji tablica F = F (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 (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 (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 F = F (k, l) na wektor. Zamiana tablicy na wektor polega na zapisaniu elementów tablicy F w odpowiedniej kolejności określonej przez tak zwany algorytm zig-zag. Schemat wyjaśniający ideę algorytmy zig-zag pokazano poniżej. F F F ( k,l ) F ( 0, 0 ) ( 1, 0 ) ( 2, 0 ) F F F ( 0, 1) ( 11, ) ( 2, 1) F F F ( 0, 2 ) ( 1, 2 ) ( 2, 2 ) (9) Dla wygody dalszego opisu dogodnie jest wprowadzić następującą konwencje zapisu elementów tablicy F : F DC AC (10) 1 AC2 AC3 AC63

Pierwszy element wektora współczynników DC = F (0, 0) nosi nazwę składowej stałej, następne elementy AC 1 = F (0, 1), AC 2 = F (1, 0) itd. aż do AC 63 = F (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 F 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 F wykonywane jest osobno dla składowych stałych DC i składowych zmiennych AC i. 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. DC 0 DC 1 DC 2 blok 0 blok 1 blok 2 DC k DC k+1 blok k blok k+1 DC 2k blok 2k Rys. 1. Obraz podzielony na bloki

W poprzednich krokach algorytmu dla każdego z bloków została obliczona skwantowana składowa stała transformaty kosinusowej DC i (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 0 1 2 k k 1 m DC DC DC,, DC DC,, DC (11) gdzie m jest liczbą bloków obrazu. Algorytm kodowania elementów wektora DC jest następujący: Zbudować wektor w postaci: gdzie: 0 1 2 k 1,, k,, (12) m DC 0 DC 0 DC dla k 1, k k 1 k 2,,m (13) Dla kolejnych k określić liczby size przy pomocy zależności: size IntegerRound log 2 abs 1 (14) k 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

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 AC 1 - AC 63 Kodowanie składowych zmiennych AC k 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: 2 3 63 AC 1 AC AC,, AC (15) Wykonana w kroku 4 kwantyzacja współczynników transformaty kosinusowej spowodowała, że stosunkowo dużo współczynników AC k przyjmuje wartość 0. Na wektor (15) można, więc spojrzeć jako na układ zbudowany z niektórych niezerowych współczynników AC k, przedzielonych ciągami współczynników o wartości zerowej, czyli: AC AC AC,, AC, AC,, 0 AC,, AC, 1 2 3 63 k 1 0 k 0 k 1 Jeśli dwa niezerowe współczynniki AC k 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, AC k. 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 symbol _ 2 amplitude gdzie elementy runlength, size i amplitude to: runlength, size runlength liczba zer pomiędzy niezerowym współczynnikiem AC k i poprzednim niezerowym współczynnikiem AC k-1,

size liczba określającą zakres, w którym znajduje się wartość współczynnika AC k, amplitude liczba wyrażająca wartość współczynnika AC k. Do zakodowania ciągu współczynników w postaci 0,, 0, AC k 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 AC k i poprzednim niezerowym współczynnikiem AC k-1 Dla niezerowego współczynnika AC k obliczyć size ze wzoru size IntegerRound log 2 abs 1 Zakodować parę (runlength, size) według tabeli kodu Huffmana. Fragment tabeli pokazano poniżej. k 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 AC k. Tabela 2 jest tylko fragmentem zwierającym najbardziej prawdopodobne kombinacje par (runlength, size) tabeli kodu Huffmana.

Pełna tabela kodowa liczy 162 wiersze i została dołączona w pliku AC_HUFFMAN.pdf 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 AC k jako amplitude size wartość AC k 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 Koder bitowy Dane skompresowane Tablice kwantyzacji 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

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 F (10), które po zastosowaniu algorytmu odwrotnego do algorytmu zig-zag zamieniane są w tablice F (k, l) (9). Po operacji odwrotnej do kwantyzacji, czyli pomnożeniu poszczególnych elementów tablic F (k, l) przez odpowiednie elementy tablic (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 Dekwantyzator DCT -1 Bloki 8x8 danych odtworzonych Tablice kodu Huffmana Tablice kwantyzacji Rys. 3. Uproszczona struktura dekodera JPEG

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 YI. 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 F = F (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. Zależność opisującą proces kwantyzacji przyjmuje, więc postać: F ( k, l) Integer Round F( k, l) ( 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 F = F (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: ~ przy czym F k, l ~ F k, l F ( k, l) ( k, l) (18) 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.

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,wzór (7) Kwantyzacja współczynników transformaty kosinusowej, wzór (17) Stopień kompresji α Obraz zakodowany F = F (k, l) Rys. 4. Schemat uproszczonego kodera JPEG Obraz zakodowany F = F (k, l) Tablica kwantyzacji, wzór (7) Odwrócenie kwantyzacji współczynników transformaty kosinusowej wzór (18) Stopień kompresji α Obliczenie dla bloków obrazu odwrotnej transformaty kosinusowej, wzór (4) Dodanie do wartości elementów obrazu liczby 128 Obraz zrekonstruowany Rys. 5. Schemat uproszczonego dekodera JPEG

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 wywoływane będą w odpowiednich miejscach programu jpeg_codec.m 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ć

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ę o rozmiarze 8 x 8 zgodnie ze wzorem (7). Zakodować wzór (17) używając do zaokrąglenia funkcji round( )

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ę 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.

Rys. 6. Obraz źródłowy i zrekonstruowany dla α = 1 Rys. 7. Obraz źródłowy i zrekonstruowany dla α = 10

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: gdzie: n m 1 2 MSE( X, Y) xi, j yi, j (19) n m i1 j1 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 PSNRX, Y 20 log10 (20) MSE X, Y 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.

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.