JPEG Filter Osnove JPEG Kodiranja

download JPEG Filter Osnove JPEG Kodiranja

of 34

  • date post

    06-Aug-2015
  • Category

    Documents

  • view

    38
  • download

    8

Embed Size (px)

Transcript of JPEG Filter Osnove JPEG Kodiranja

2012

[OSNOVE JPEG KOMPRESIJE]Na ovoj vjebi studenti e obraditi principe JPEG kompresije, sa naglaskom na diskretnu kosinusnu transformaciju (DCT) te e realizovati vlastiti kod za DCT koristei Matlab.

Ime: Prezime: Broj indeksa:

UVODNE NAPOMENE: Preporuka je da se na vjebe donesu sve stranice isprintane. Izvjetaj sa vjebe to ukljuuje popunjene stranice na predvienim mjestima nakon naknadne obrade kod kue treba dostaviti do datuma koji e biti naknadno definiran Izvjetaji s vjebe su jedan od elemenata koji se analizira i na zavrnom ispitu . Poto je ovaj tutorijal malo zahtjevniji, bie dovoljno da uradite prva tri poglavlja.

2

1. Diskretna kosinusna transformacija (DCT) u JPEG kompresijiDiskretna kosinusna transformacija (DCT) je transformacija srodna Fourierovoj koja ima niz korisnih osobina koje je ine pogodnom za primjenu u kompresiji signala sa gubicima (lossy). Kao i Fourierova transformacija, DCT izraava neku primljenu funkciju kao sumu sinusoida razliitih frekvencija i amplituda. DCT je diskretna transformacija to znai da se funkcija transformie u nekom konanom skupu taaka umjesto na kompletnom domenu. Za razliku od Fouriera transformacije, DCT koristi samo kosinusne funkcije. Postoje etiri vrste DCT transformacije, a najpoznatija je DCT II koja je nala svoju primjenu u mnogim multimedijalnim sistemima, njena najpoznatija primjena jeste u JPEG kompresiji. Na proteklim tutorijalima, rastersku grafiku smo posmatrali kao 2D tabelu u kojoj svako polje predstavlja jedan piksel. U sluaju slike u nijansama sive, ovu tabelu moemo matematiki opisati i kao funkciju dvije pozitivne cjelobrojne promjenljive f(x,y) ija vrijednost u nekoj taki odgovara intenzitetu svjetlosti. Ako je slika u boji, npr. koristei RGB model boje, DCT moramo primijeniti odvojeno na svaku komponentu boje, poto komponenta odgovara "intenzitetu". Ako primijenimo DCT na neku drugu vrstu vrijednosti npr. indeks boje u paleti dobiemo nezadovoljavajue rezultate. Kao to je ve spomenuto, postoji vie vrsta DCT-a. Najee koritena je DCT-II koja se naziva i samo DCT. DCT-II (ponekad i 2D DCT) je opisana formulom:

gdje su C(u) i C(v) konstante koje su jednake

U gornjem izrazu veliine M i N odreene su dimenzijama slike (dimenzije slike kao to emo vidjeti su M=8 i N=8 tj. 8x8 blok), dok je rezultat diskretne kosinusne transformacije matrica dimenzija u,v. Raunarski najzahtjevniji dio ove formule je raunanje kosinusa (vrijednosti korijena su u biti konstante). Da bi se DCT zavrio u nekom razumnom roku, mi nau rastersku sliku dijelimo na niz sitnih blokova i onda izraunavamo DCT funkciju F(u,v) za svaki od tih blokova. U JPEG standardu precizirano je da dimenzija tog bloka budu 8x8, to znai da je M=N=8. U teoriji vei blok bi trebao rezultirati kvalitetnijom kompresijom slike, ali i sporijim izvravanjem, pa je 8x8 kompromis koji je usvojen kao dio JPEG standarda. Osim toga, iz izraza za diskretnu kosinusnu transformaciju jasno je vidljivo da je za svaki element3

F(u,v) potrebno proi kroz sve elemente bloka, tj. izvriti 64 operacije (minimalno) za jedan element. Kako blok ima 64 elementa, slijedi da je za jedan blok potrebno izvriti minimalno 4096 operacija. Da budemo precizni: 191 operacija zbrajanja, 513 operacija mnoenja, raunanje 128 puta cos (kosinusne) funkcije te 128 operacija dijeljenja to je i za dananje raunare puno (sva ova izraunavanja su potrebna za dobivanje samo jednog FDCT elementa). Naravno, postoje puno bre metode koje se svode na 5 operacija mnoenja i 29 operacija zbrajanja. Moda je sada i jasnije zato je odabrana veliina bloka 8x8 piksela. Koeficijenti DCT transformacije sadravaju informaciju o frekventnom sadraju slike. Koeficijent F(0,0) je istosmjerni ili DC koeficijent i on je jednak srednjoj vrijednosti svih ostalih koeficijenata pomnoenoj sa 8 to se veoma lako moe dokazati.

Srednju vrijednost moemo izraunati prema standardnoj formuli kao sumu svih elemenata podijeljena sa brojem elemenata. Kako u naem sluaju imamo 64 elementa imamo sljedeu formulu:

Formulu (3) pomnoimo sa 64 i uvrstimo u izraz za F(0,0), dobijamo

DC koeficijent sadri najvei dio informacije o slici i najvaniji je za rekonstrukciju slike. Preostala 63 koeficijenta nazivaju se izmjeninim ili AC koeficijentima. AC koeficijenti sadravaju informaciju o prostornim frekvencijama u bloku odnosno u slici, pri tome, AC koeficijenti koji se nalaze u okolini DC koeficijenta odgovaraju niim prostornim frekvencijama, dok AC koeficijenti koji se smjeteni prema donjem desnom uglu 8x8 matrice, opisuju vee prostorne frekvencije. DCT transformacija na temelju frekvencijske analize nad elementima bloka, provodi preraspodjelu energije koju nosi pojedini element u bloku. Najvei dio energije koncentriran je u DC koeficijentu te nisko frekvencijskim AC koeficijentima koji ga okruuju. AC koeficijenti niih prostornih frekvencija nose vie korisne informacije nego oni viih frekvencija. Ovakav nain koncentracije energije u skladu je sa svojstvom ljudskog vizualnog sistema. Obino su vrijednosti AC koeficijenata za velike frekvencije po apsolutnoj vrijednosti manje od vrijednosti AC koeficijenata u okolini DC koeficijenta, to e se pokazati korisno u procesu kvantizacije, odnosno u procesu RLC (Run Length Coding) kodiranja. Ako smo prilikom kompresije slike koristili DCT, logino je onda da prilikom dekompresije slike koristimo Inverznu Diskretnu Kosinusnu Transformaciju (IDCT) F(u,v),

4

pomou koje emo dobiti polaznu sliku f(i,j) uz eventualno odreene gubitke. Inverzna diskretna kosinusna transformacija (IDCT) u svom opem obliku glasi:

gdje su i,j=0,1,...,7. Razlog za tildu iznad naziva funkcije f je to ona nije ekvivalentna polaznoj funkciji f(i,j) jer je mogue dolo do odreenih gubitaka. Ovom prilikom emo naglasiti jo jednom da DCT radi sa cjelobrojnim vrijednostima intenziteta svjetlosti koje su centrirane oko nule. Podsjetimo se da cjelobrojni RGB format u Matlabu pridruuje svakoj komponenti boje vrijednosti u opsegu 0-255. Ovdje emo navesti jedan implementacijski detalj, kojeg JPEG standard i nalae. Prije nego izvrimo DCT nad bilo kojim 8x8 blokom slike, potrebno je da od svakog piksela svih komponenti slike (Y,C b Cr) oduzmemo vrijednost 128, kako bismo kreirali sliku ija je srednja vrijednost piksel jednaka nuli (zero mean image). Logino je sada da pri obrnutom procesu treba izvriti dodavanje vrijednosti 128. O modelu boja YCbCr emo govoriti neto kasnije. Zadatak 1.1. U Matabu uitajte kolor sliku po elji (npr. neku od slika koje dolaze uz image toolbox) u matricu koristei funkciju imread(). Zatim napravite Matlab funkciju pod nazivom dct() koja iz primljene matrice izdvaja prvi blok dimenzija 8x8 i ispisuje ga na ekranu. Matlab kod upiite u prostor ispod.

Zadatak 1.2. Prepravite ovu funkciju tako da ispisuje SVE blokove dimenzija 8x8 u matrici. Imajte na umu da dimenzije slike ne moraju biti djeljive sa 8! Preostale piksele u rubnim blokovima popunite nulama. NAPOMENA: JPEG standard zahtijeva da matrica F(u,v) bude djeljiva sa 8, to znai da njene dimenzije nee odgovarati originalnim dimenzijama slike. U tu svrhu kreirajte dvije promjenjive, unutar kojih ete pohraniti dimenzije originalne slike. Takoer, JPEG standard zahtjeva da dodani redovi i kolone ne sadre nule, nego vrijednosti posljednje kolone i reda originalne slike, ali radi jednostavnosti vi dodane redove i kolone popunite nulama. Matlab kod upiite u prostor ispod.

Zadatak 1.3. Prepravite napravljenu funkciju tako da za svaki blok dimenzija 8x8 (nazovimo ga f) izraunava ekvivalentan DCT blok F prema formuli (1) za DCT na bloku 8x8. Taj blok5

treba smjestiti u neku matricu rezultata koju e funkcija dct() vraati. Matrica rezultata treba biti istih dimenzija kao primljena matrica. Savjet: ne morate se posebno brinuti za pred-izraunavanje vrijednosti kosinusa i 2/2 poto e Matlab vrlo efikasno cachirati te izraunate vrijednosti. No prilikom implementacije algoritma u C++ morate voditi rauna o tome. Matlab kod upiite u prostor ispod.

Zadatak 1.4. Na osnovu ovako napravljene funkcije dct() napravite inverznu funkciju idct() koristei formulu (4) za IDCT. Funkcije testirajte tako to ete nad uitanom slikom pozvati dct() pa idct() i tako dobijenu sliku prikazati: A = imread('slika.png'); B = dct(A); C = idct(B); imshow(A); figure; imshow(C); Matlab kod upiite u prostor ispod.

Ako ste sve odradili kako treba, trebali biste dobiti sliku praktino identinu polaznoj poto jo ustvari nismo doli do lossy dijela algoritma.

NISTE DOBILI OEKIVANI REZULTAT?

Slijedi spisak stvari koje biste trebali provjeriti: 1. Ako ste uitali sliku iji je format paleta, DCT nee raditi jer DCT oekuje da primljene vrijednosti odgovaraju intenzitetu svjetlosti u datoj taki. Detaljnije je objanjeno u Lab vjebi 5. 2. Ako je u pitanju kolor RGB slika, kod morate izvriti zasebno za svaku od komponenti boje. 3. DCT oekuje da su primljene vrijednosti cijeli brojevi. Dakle format vae slike bi trebao biti . Ako ovo nije format slike, koristite neku prikladnu funkciju za konverziju (pogledati Lab vjebu 5). Uz Matlab dolazi jedna pogodna kolor RGB slika pod imenom autumn.tif.

6

4. Ako ste slijedili savjet na stranici 3 da se prije poetka DCT-a od komponenti oduzme vrijednost 128, obratite panju da prije toga morate konvertovati uint8 u neki drugi tip. Razlog je to e se vrijednosti manje od nule zaokruiti na nulu (slovo u u uint8 oznaava unsigned). 5. Mnoenje sa kosinusom e izvriti automatsku konverziju rezultujueg tipa u double, to se odnosi i na funkciju idct(). Dakle rezultujua matrica e biti tipa sa vrijednostima u opsegu 0-255 to ne predstavlja validnu RGB sliku. Morate na kraju funkcije idct() izvriti konverziju nazad u tip uint8. 6. Ako sa donje i desne strane slike vidite crni okvir, to je zato to ste u DCT fazi popunili nedostajue vrijednosti blokova nulama, ali ih niste izbacili iz matrice