Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Samo Bračić
BREZIZGUBNO STISKANJE SLIK S ŠTIRIŠKIMI DREVESI
Diplomsko delo
Maribor, marec 2012
Navodila za izdelavo diplomskega dela Stran 1
Diplomsko delo univerzitetnega študijskega programa
Brezizgubno stiskanje slik s štiriškimi drevesi
Študent: Samo Bračić
Študijski program: Računalništvo in informacijske tehnologije UN
Mentor:
Somentor:
doc. dr. David Podgorelec, univ.dipl.inţ. rač. in inf.
doc. dr. Gregor Klajnšek, univ.dipl.inţ. rač. in inf.
Maribor, marec 2012
Navodila za izdelavo diplomskega dela Stran 2
Navodila za izdelavo diplomskega dela Stran 3
ZAHVALA
Zahvaljujem se mentorju dr. Davidu Podgorelcu in
somentorju dr. Gregorju Klajnšku za pomoč in
vodenje pri opravljanju diplomskega dela.
Posebna zahvala velja staršem, ki so mi omogočili
študij.
Navodila za izdelavo diplomskega dela Stran 4
BREZIZGUBNO STISKANJE SLIK S ŠTIRIŠKIMI DREVESI
Ključne besede: stiskanje, slike, štiriško drevo
UDK: 004.932(043.2)
Povzetek
V diplomskem delu obravnavamo algoritem brezizgubnega stiskanja slik s uporabo
podatkovne strukture štiriških dreves, ter njegove prednosti in slabosti. Prav tako
preučimo uporabnost Grayevih kod pri tovrstnem stiskanju in jih uporabimo kot del
algoritma. Algoritem izboljšamo s Huffmanovim algoritmom stiskanja s prilagajanjem.
Navodila za izdelavo diplomskega dela Stran 5
QUADTREE BASED LOSSLESS IMAGE COMPRESSION
Key words: stiskanje, slike, štiriško drevo
UDK: 004.932(043.2)
Abstract:
This thesis consideres quadtree based lossless image compression, its advantages and
disadvantages. Usage of Gray codes for the means of compression is also studied and
implemented. The algorithm is improved by Huffman’s adaptive method of compression.
Navodila za izdelavo diplomskega dela Stran 6
VSEBINA
1 UVOD ........................................................................................................................... 8
2 DIGITALNA SLIKA .................................................................................................. 9
3 ŠTIRIŠKO DREVO .................................................................................................. 11
3.1 STRUKTURA ŠTIRIŠKEGA DREVESA ....................................................................... 11
3.2 UPORABA ŠTIRIŠKIH DREVES V MULTIMEDIJIH ..................................................... 11
4 GRAYEVE KODE .................................................................................................... 13
4.1 OPIS ..................................................................................................................... 13
4.2 PRETVARJANJE BINARNE KODE V GRAYEVO KODO ............................................... 14
4.3 PRETVARJANJE GRAYEVE KODE V BINARNO ŠTEVILO ........................................... 15
4.4 UPORABA GRAYEVIH KOD PRI STISKANJU SLIK S ŠTIRIŠKIMI DREVESI .................. 15
5 ALGORITEM STISKANJA SLIK S ŠTIRIŠKIMI DREVESI ........................... 17
5.1 DELITEV NA BITNE PLOSKVE ................................................................................ 17
5.2 GRADNJA ŠTIRIŠKIH DREVES ................................................................................ 17
5.3 SHRANJEVANJE DREVESA V DATOTEKO ................................................................ 18
6 ALGORITEM RAZŠIRJANJA SLIK S ŠTIRIŠKIMI DREVESI ...................... 20
6.1 GRADNJA ŠTIRIŠKIH DREVES S SPROTNIM BARVANJEM BITNIH PLOSKEV .............. 20
6.2 ZDRUŢITEV BITNIH PLOSKEV V KONČNO SLIKO..................................................... 21
7 IZBOLJŠAVA Z VPELJAVO HUFFMANOVEGA ALGORITMA
STISKANJA S PRILAGAJANJEM................................................................................ 22
7.1 HUFFMANOV ALGORITEM S PRILAGAJANJEM ........................................................ 22
7.2 STISKANJE SLIK S METODO ŠTIRIŠKIH DREVES IN HUFFMANOVIM ALGORITMOM .. 22
7.3 RAZŠIRJANJE SLIK, STISNJENIH Z METODO ŠTIRIŠKIH DREVES IN HUFFMANOVIM
ALGORITMOM ................................................................................................................... 26
8 REZULTATI ............................................................................................................. 28
8.1 TESTNI PRIMER 1 .................................................................................................. 28
8.2 TESTNI PRIMER 2 .................................................................................................. 29
Navodila za izdelavo diplomskega dela Stran 7
8.3 TESTNI PRIMER 3 .................................................................................................. 30
8.4 TESTNI PRIMER 4 .................................................................................................. 31
8.5 TESTNI PRIMER 5 .................................................................................................. 32
8.6 TESTNI PRIMER 6 .................................................................................................. 33
8.7 TESTNI PRIMER 7 .................................................................................................. 34
8.8 INTERPRETACIJA REZULTATOV ............................................................................. 35
9 SKLEP ........................................................................................................................ 36
10 LITERATURA IN VIRI ........................................................................................... 37
Navodila za izdelavo diplomskega dela Stran 8
1 UVOD
S shranjevanjem slik v digitalni obliki se je pojavila tudi potreba po stiskanju takšnih
podatkov zaradi varčevanja s pomnilniškimi viri in hitrejšega prenosa podatkov. Cilj
stiskanja slik je zmanjšati velikost datoteke s reduciranjem podatkov na najbolj ključne
podatke. S tem namenom je bilo v preteklosti razvitih ţe obseţno število algoritmov
stiskanja, med katerimi je tudi algoritem brezizgubnega stiskanja z uporabo podatkovne
strukture štiriških dreves.
Stiskanje slik je lahko z izgubami ali brez. Stiskanje z izgubami se uporablja predvsem
za naravne slike, kot so digitalne fotografije, kjer nam manjša velikost datoteke za namene
shranjevanja in prenašanja pomeni več, kakor pa izguba manjših detajlov slike. Stiskanje
brez izgub je primerno za grafike, kjer je vsaka podrobnost slike pomembna, na primer
tehnične in medicinske slike.
V tem diplomskem delu bomo predstavili algoritem brezizgubnega stiskanja s
štiriškimi drevesi in preučili, kako se brezizgubno stiskanje s štiriškimi drevesi obnese na
različnih tipih digitalnih slik, ter za kateri tip slik je najbolj primerno. Ob spoznavanju
algoritma brezizgubnega stiskanja slik s štiriškimi drevesi bomo opisali tudi lastnosti in
uporabnost Grayevih dvojiških kod.
Prav tako bomo predstavili, kako lahko algoritem brezizgubnega stiskanja slik s
štiriškimi drevesi izboljšamo z vpeljavo Huffmanovega algoritma stiskanja s
prilagajanjem.
Diplomsko delo je, vključno z uvodom, sestavljeno iz osmih poglavij. Po uvodu bomo
v drugem poglavju predstavili pojem digitalne slike. V tretjem poglavju bomo opisali
strukturo štiriških dreves in njihovo uporabo v multimediji. Sledila bo razlaga Grayevih
kod. Nato bomo v petem in šestem poglavju opisali algoritem stiskanja in razširjanja slik s
štiriškimi drevesi, v sedmem poglavju bomo predstavili izboljšavo z uporabo
Huffmanovega algoritma s prilagajanjem, katerega rezultate bomo predstavili v osmem
poglavju in povzeli v devetem, sklepnem poglavju.
Navodila za izdelavo diplomskega dela Stran 9
2 DIGITALNA SLIKA
Digitalna slika je pravokotno polje slikovnih točk (pikslov), urejenih v m vrstic in n
stolpcev. Izrazu m×n pravimo ločljivost slike. Moderni prikazovalniki prikazujejo veliko
barv, zato je piksel predstavljen kot 24-bitna številka, kjer deleţ rdeče, zelene in modre
barve vsak zaseda 8 bitov. Tako je lahko 24-bitni piksel predstavljen v eni izmed 224
barv,
kar je pribliţno 16,78 milijonov barv. Tako slika s 24-bitnimi piksli in ločljivostjo
512×512 zaseda 786.432 zlogov pomnilnika, medtem ko pri ločljivosti 1024×1024 zaseda
celo 3.145.728 zlogov. Zaradi takšnih velikosti zasedanja pomnilniških virov je pomembno
stiskanje [1]. Slike, ki jih obravnavamo v tej diplomski nalogi imajo dodan še kanal alfa
(tako imenovani barvni prostor RGBA), kar pomeni da vsak piksel zaseda 32 bitov.
Za namene stiskanja slik je pomembno, da ločimo naslednje tipe slik:
monokromatska slika: slika, kjer ima vsak piksel lahko zgolj eno izmed dveh
vrednosti, ponavadi sta to bela in črna barva. Vsak piksel je predstavljen z enim
bitom, zato je monokromatska slika najenostavnejši tip slike.
sivinska slika: vsak piksel v sivinski sliki ima lahko eno izmed n vrednosti (od 0
do n -1), kar pomeni, da ima lahko enega izmed 2n odtenkov določene barve.
Vrednost n predstavlja število bitov za posamezen piksel in je ponavadi iz mnoţice
(4,8,12,16,24 itd). Mnoţici najbolj obteţenih (običajno vodilnih) bitov vseh pikslov
slike pravimo najtežja bitna ploskev. Sivinska slika ima n bitnih ploskev.
zvezna slika: sosednja piksla v zvezni sliki se razlikujeta za eno ali zelo majhno
število enot. Posledica tega je, da oko s spremljanjem pikslov zaznava zvezen
prehod med barvami na sliki. Zvezne slike so ponavadi naravne slike (digitalne
fotografije ipd.).
diskretna slika: diskretna slika je ponavadi umetno ustvarjena slika, ki lahko ima
malo ali mnogo barv, nima pa šuma in zabrisanih robov, tako kot naravne slike.
Narisani objekti in linije imajo jasne in strogo določene robove in so zato v
močnem kontrastu s preostankom slike (ozadjem). Stiskanje z izgubami se izkaţe
Navodila za izdelavo diplomskega dela Stran 10
pri takšnem tipu slike za neučinkovito, saj lahko ţe nekaj spremenjenih pikslov prej
jasno razločljiv vzorec naredi za nerazpoznavnega.
Navodila za izdelavo diplomskega dela Stran 11
3 ŠTIRIŠKO DREVO
3.1 Struktura štiriškega drevesa
Štiriško drevo je podatkovna struktura, kjer je vsako vozlišče list z uporabnimi podatki, ali
pa vmesno vozlišče, ki se veji v štiri podrejena štiriška drevesa. Takšno strukturo prikazuje
slika 1 . Strukturo sta poimenovala štiriško drevo (v angleščini: Quadtree) Raphael Finkel and
J.L. Bentley leta 1974 [5].
Slika 1: Struktura štiriškega drevesa.
3.2 Uporaba štiriških dreves v multimedijih
Štiriška drevesa so najpogosteje uporabljena za delitev dvodimenzionalnega prostora z
rekurzivno delitvijo v štiri kvadrante oziroma regije. Kadar uporabljamo štiriško drevo kot
podatkovno strukturo za kompresijo slike, ţelimo v liste drevesa zajeti kvadrante slike, ki
vsebujejo enake piksle. Če je slika enobarvna, predstavlja koren drevesa informacijo o sliki
kot celoti, v nasprotnem primeru pa se razveji v štiri poddrevesa, ki ustrezajo štirim enako
velikim kvadrantom slike, tako kot to prikazuje slika 2. Rekurzivno se ta poddrevesa lahko
Navodila za izdelavo diplomskega dela Stran 12
vejijo na enak način, tako da bi v najslabšem primeru (če bi vsak piksel bil drugačne barve)
dobili polno štiriško drevo, kjer bi vsak list vseboval svoj piksel slike.
Slika 2: Primer uporabe štiriških dreves pri določanju enobarvnih regij
Štiriška drevesa so mnogo laţja za manipulacijo in dostopanje kot ostali modeli, zato
je njihova uporaba v računalniški grafiki zelo obseţna. Popularna so predvsem v tako
imenovani fraktalni grafiki, saj s štiriškimi drevesi z lahkoto implementiramo rekurzivne
slike: oče drevesa ima štiri sinove, od katerih trije vsebujejo kazalec na očeta, en pa
vsebuje dejansko sliko [6].
Ostale prednosti štiriških dreves so:
Sliko izbrišemo v zgolj enem koraku. Vse kar moramo narediti, je, da izbrišemo
očeta drevesa.
Pribliţevanje določenega kvadranta je enokoračna operacija.
Če ţelimo zmanjšati kompleksnost slike, je dovolj ţe, da odstranimo zadnji nivo
vozlišč.
Dostopanje do določenih regij slike je zelo hitra operacija, kar je zelo uporabno za
posodabljanje območij slike.
Navodila za izdelavo diplomskega dela Stran 13
4 GRAYEVE KODE
4.1 Opis
Grayeva koda (poimenovana po Franku Gray-u) je dvojiški številski sistem, kjer se
dve zaporedni vrednosti razlikujeta zgolj v enem bitu [3]. Prvih 15 vrednosti 4-bitne
Grayeve kode prikazuje tabela 1. Prav tako je znana kot zrcalna dvojiška koda. Grayeva
koda velikosti 1 bita je enaka binarni kodi.
Tabela 1: Primerjava 4-bitne binarne in Grayeve kode.
Decimalno število Binarna koda Grayeva koda
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110
5 0101 0111
6 0110 0101
7 0111 0100
8 1000 1100
9 1001 1101
10 1010 1111
11 1011 1110
12 1100 1010
13 1101 1011
14 1110 1001
15 1111 1000
Navodila za izdelavo diplomskega dela Stran 14
4.2 Pretvarjanje binarne kode v Grayevo kodo
Pretvorba binarne kode v Grayeve kodo poteka z uporabo logične operacije XOR
(eksplicitni ali). Operacija XOR vrne 0, če sta obe vrednosti enaki, v nasprotnem primeru
vrne 1 (tabela 2). Najprej prepišemo najlaţji bit, nato pa se sprehodimo po preostalih bitih
v binarni kodi od najlaţjega do najteţjega bita v kodi. Izračun Grayeve kode prikazuje
tabela 3. Nad trenutnim in sosednjim bitom izvedemo operacijo XOR in zapišemo rezultat
v Grayevo kodo [3].
Vrednost 1 Vrednost 2 Vrednost 1 XOR Vrednost 2
0 0 0
0 1 1
1 0 1
1 1 0
Tabela 2: Logična operacija XOR.
Primer:
100100102 = 7310
Binarna koda Operacija Grayeva koda
10010010 Prepišemo najlaţji bit 0
10010010 0 XOR 1 10
10010010 1 XOR 0 110
10010010 0 XOR 0 1100
10010010 0 XOR 1 11010
10010010 1 XOR 0 110110
10010010 0 XOR 0 1101100
10010010 0 XOR 1 11011010
Tabela 3: Pretvorba binarnega števila v Grayevo kodo.
Navodila za izdelavo diplomskega dela Stran 15
4.3 Pretvarjanje Grayeve kode v binarno število
Pri pretvarjanjanju Grayeve kode v binarno število prepišemo najteţji bit. Nato izvajamo
operacijo XOR nad naslednjim bitom v Grayevi kodi in pred tem pridobljenim bitom
binarne kode (tabela 4).
Primer:
11011010Gray = 732
Grayeva koda Operacija Binarna koda
11011010 Prepišemo najteţji bit 1
11011010 1 XOR 1 10
11011010 0 XOR 0 100
11011010 1 XOR 0 1001
11011010 1 XOR 1 10010
11011010 0 XOR 0 100100
11011010 1 XOR 0 1001001
11011010 0 XOR 0 10010010
Tabela 4: Pretvarjanje Grayeve kode v binarno kodo.
4.4 Uporaba Grayevih kod pri stiskanju slik s štiriškimi drevesi
Pri metodi stiskanja slike s štiriškimi drevesi, barvne slike stiskamo, tako da razdelimo
sliko na enobarvne ploskve. Če uporabljamo barvni prostor RGBA, tako razdelimo sliko na
rdečo, zeleno, modro in alfa ploskev.
Dobljene ploskve lahko razdelimo še na 8 bitnih ploskev, tako da decimalne vrednosti
pikslov pretvorimo v binarno kodo, kjer vsak bit leţi na svoji bitni ploskvi. Takšne
dvobarvne bitne ploskve učinkoviteje stisnemo, saj obstaja velika verjetnost, da bodo
enobarvna področja obseţnejša.
Pri stiskanju bitnih ploskev se pokaţe uporabnost Grayevih kod, kadar barvna slika
vsebuje območja, kjer se barve razlikujejo zgolj v odtenkih. Dva odtenka, ki sta
človeškemu očesu morda celo nerazločljiva, predstavljata računalniku dve popolnoma
različni decimalni števili in s tem tudi različni binarni predstavitvi teh števil. Prednost
Grayeve kode se kaţe v lastnosti, ki pravi, da se dve zaporedni števili zapisani v Grayevi
Navodila za izdelavo diplomskega dela Stran 16
kodi razlikujeta zgolj v enem bitu, kar pomeni, da se vrednosti bliţjih odtenkov določene
barve razlikujejo zgolj v par bitih. Rezultat tega je, da je število in predvsem obseg
enobarvnih območij na bitnih ploskvah, določenimi z Grayevo dvojiško predstavitvijo
števil, znatno višje, kot pa na bitnih ploskvah, določenih s standardno dvojiško
predstavitvijo brez predznaka.
Slika 3: Primerjava bitnih ploskev pri pikslih z bliţnjimi odtenki. V zgornji vrstici vidimo bitne
ploskve določene s standardno dvojiško predstavitvijo, v spodnji pa z Grayevo dvojiško
predstavitvijo. Opazimo, da nastane 6 enovitih Grayevih ploskev, medtem ko pri standardnih
binarnih ploskvah ni enovita niti ena ploskev.
Navodila za izdelavo diplomskega dela Stran 17
5 ALGORITEM STISKANJA SLIK S ŠTIRIŠKIMI DREVESI
5.1 Delitev na bitne ploskve
Digitalno sliko najprej razdelimo na 4 barvne ploskve barvnega prostora RGBA, kjer
vsebuje vsak piksel ploskve R vrednost R istoleţnega piksla digitalne slike, vsak piksel
ploskve G vrednost G istoleţnega piksla digitalne slike, vsak piksel ploskve B vrednost B
istoleţečega piksla digitalne slike ter vsak piksel ploskve A vrednost A istoleţnega piksla
digitalne slike.
Nato vsako izmed ploskev R, G, B in A razdelimo na 8 bitnih (monokromatskih)
ploskev, kjer vsak piksel pi,j na bitni ploskvi Pl,k zavzema vrednost enega bita na mestu k v
Grayevi kodi piksla si,j na ploskvi Sl, pri čemer velja, da je S mnoţica barvnih ploskev S =
{R, G, B, A}.
5.2 Gradnja štiriških dreves
Za vsako izmed bitnih ploskev nato kličemo rekurzivno funkcijo ZgradiDrevo
(psevdokod 1), ki sprejme kot argument dimenzije kvadranta na trenutni bitni ploskvi, pri
čemer zavzema S1 indeks prvega stolpca kvadranta, S2 indeks zadnjega stolpca kvadranta,
V1 indeks začetne vrstice kvadranta in V2 indeks končne vrstice kvadranta. Funkcija se
sprehodi po pikslih podanega kvadranta in kakor hitro najde piksel pi,j , ki se razlikuje od
piksla pS1,V1, razdeli kvadrant na štiri enake četrtine (tabela 5). Če je širina kvadranta K liho
število, se dodeli dodaten stolpec podkvadrantoma K0,1 in K1,1. Če je višina kvadranta K
liho število, se dodeli dodatna vrstica podkvadrantoma K0,0 in K1,0. Za vsak podkvadrant
rekurzivno kličemo funkcijo ZgradiDrevo.
Navodila za izdelavo diplomskega dela Stran 18
Tabela 5: Razdelitev kvadranta K na podkvadrante
Če ugotovimo, da zavzemajo vsi piksli kvadranta enako vrednost, označimo, da gre za
list drevesa in shranimo barvo kvadranta.
V prvem klicu funkcije nad vsako bitno ploskvijo podamo argumente:
S1 = 0
S2 = širina slike - 1
V1 = 0
V2 = višina slike - 1
5.3 Shranjevanje drevesa v datoteko
Najprej shranimo v datoteko širino in višino končne slike. Funkcija ZgradiDrevo med
potekom gradnje štiriških dreves sproti shranjuje drevesa v datoteko. Vsakič, ko se
kvadrant deli na podkvadrante, zapišemo v datoteko bit z vrednostjo 1. Vsakič, ko
ugotovimo, da je kvadrant list drevesa, to označimo tako, da zapišemo v datoteko bit z
vrednostjo 0, nato pa shranimo še barvo kvadranta, ki zavzema vrednost 0 ali 1. Zaradi
takšnega načina shranjevanja je ključnega pomena, da se pri gradnji štiriških dreves, tako
pri stiskanju kot pri razširjanju, drţimo enakega vrstnega reda rekurzivnih klicev funkcije
ZgradiDrevo nad podkvadranti razdeljenega kvadranta.
K0,0 K0,1
K1,0 K1,1
Navodila za izdelavo diplomskega dela Stran 19
Psevdokod 1: Gradnja štiriškega drevesa s sprotnim zapisovanjem kode v datoteko
function ZgradiDrevo( S1, S2, V1, V2)
Nadaljuj = true;
for( i = S1 to S2)
for( j = V1 to V2)
if (Piksel(i,j) != Piksel(S1,V1) )
Nadaljuj = false;
ZapisiVDatoteko(1);
SredinaŠirine = (S2 - S1) / 2;
SredinaVišine = (V2 – V1) / 2;
ZgradiDrevo( S1, SredinaŠirine, V1, SredinaVišine);
ZgradiDrevo(SredinaŠirine + 1, S2, V1, SredinaVišine);
ZgradiDrevo( S1, SredinaŠirine, SredinaVišine + 1, V2);
ZgradiDrevo(SredinaŠirine + 1, S2, SredinaVišine + 1, V2);
break;
end for
end for
if (Nadaljuj == true)
ZapisiVDatoteko(0);
ZapisiVDatoteko(Barva);
end function
Funkcija ZgradiDrevo za vsak v parametrih prejet kvadrant preveri, ali je enobarven.
Spremenljivka Nadaljuj določa, ali kvadrant izpolnjuje pogoj enobarvnosti in je primeren
za zapis v datoteko, zato je na začetku funkcije inicializirana z vrednostjo true.V kolikor
med prehodom skozi piksle kvadranta naletimo na piksel drugačne barve od barve prvega
piksla kvadranta, Nadaljuj zavzame vrednost false, s čemer preprečimo zapis v datoteko,
funkcija pa razdeli kvadrant na četrtine in nad vsako četrtino rekurzivno kliče funkcijo
ZgradiDrevo.
Navodila za izdelavo diplomskega dela Stran 20
6 ALGORITEM RAZŠIRJANJA SLIK S ŠTIRIŠKIMI DREVESI
6.1 Gradnja štiriških dreves s sprotnim barvanjem bitnih ploskev
Najprej preberemo iz datoteke širino in višino končne slike, nato ustvarimo 24 bitnih
ploskev prebranih dimenzij. Pri razširjanju bitnih ploskev iz datoteke, stisnjene s
postopkom, opisanim v poglavju 5, funkcija DrevoIzKode (psevdokod 2) rekurzivno bere
datoteko bit za bitom in sproti gradi drevo. Funkcija DrevoIzKode prejme štiri argumente,
ki določajo dimenzije trenutnega kvadranta, pri čemer je S1 indeks začetnega stolpca
kvadranta, S2 indeks končnega stolpca kvadranta, V1 indeks začetne vrstice kvadranta in V2
indeks končne vrstice kvadranta. Dimenziji začetnega kvadranta sta določeni s
dimenzijama končne slike, ki smo ju prebrali na začetku.
V prvem klicu funkcije nad vsako bitno ploskvijo podamo argumente:
S1 = 0
S2 = širina slike -1,
V1 = 0 in
V2 = višina slike -1.
Gradnja drevesa poteka tako:
Če prebrani bit zavzame vrednost 1, algoritem razdeli trenutni kvadrant K na štiri enake
četrtine K0,0, K0,1, K1,0 in K1,1. Če je širina kvadranta K liho število, se dodeli dodaten
stolpec podkvadrantoma K0,1 in K1,1. Če je višina kvadranta K liho število, se dodeli
dodatna vrstica podkvadrantoma K0,0 in K1,0. Za vsaki podkvadrant rekurzivno kličemo
funkcijo DrevoIzKode.
Če prebrani bit zavzame vrednost 0, preberemo iz datoteke še naslednji bit, ki nam
pove barvo tega kvadranta. Nato določimo prebrano barvo vsem pikslom trenutnega
kvadranta.
Navodila za izdelavo diplomskega dela Stran 21
6.2 Združitev bitnih ploskev v končno sliko
Vsaki izmed posamičnih barvnih ploskev barvnega prostora RGBA določimo
vrednosti pikslov, tako da vsakemu pikslu si,j ploskve Sk, pri čemer velja S = {R,G,B,A},
določimo 8-bitno Grayevo kodo gi,j. Posamezni bit gi,j,m zavzema vrednost piksla pi,j bitne
monokromatske ploskve Pk,m. Grayevo kodo gi,j nato pretvorimo v decimalno število in
dodelimo to vrednost pikslu si,j.
Preostane nam še samo, da določimo vrednost pikslov qi,j = (ri,j, gi,j, bi,j, ai,j) končne
slike Q, pri čemer velja ri,j ∈ R, gi,j ∈ G, bi,j ∈ B in ai,j ∈ A.
Psevdokod 2: Algoritem razširjanja slik s štiriškimi drevesi
function DrevoIzKode(S1, S2, V1, V2)
Bit = BeriIzDatoteke();
if (Bit == 1)
SredinaŠirine = (S2 - S1) / 2;
SredinaVišine = (V2 – V1) / 2;
DrevoIzKode( S1, SredinaŠirine, V1, SredinaVišine);
DrevoIzKode(SredinaŠirine + 1, S2, V1, SredinaVišine);
DrevoIzKode( S1, SredinaŠirine, SredinaVišine + 1, V2);
DrevoIzKode(SredinaŠirine + 1, S2, SredinaVišine + 1, V2);
else
Barva = BeriIzDatoteke();
for i = S1 to S2
for j = V1 to V2
Piksel(i,j) = Barva;
end for
end for
end function
Navodila za izdelavo diplomskega dela Stran 22
7 IZBOLJŠAVA Z VPELJAVO HUFFMANOVEGA ALGORITMA
STISKANJA S PRILAGAJANJEM
7.1 Huffmanov algoritem s prilagajanjem
Huffmanov algoritem s prilagajanjem (znan tudi kot dinamični huffmanov algoritem) je
tehnika stiskanja s prilaganjem na osnovi Huffmanovega algoritma. Algoritem gradi kodo
med prehodom skozi simbole brez predznanja o izvirni datoteki, česar posledica je
stiskanje z zgolj enim prehodom in prilagajanje spreminjajočem se pogojem v podatkih.
Prednost stiskanja s samo enim prehodom je stiskanje v realnem času, slabost pa
občutljivost na napake pri prenosu, saj ţe zaradi izgube enega samega bita koda postane
neuporabna [7].
Huffmanov algoritem stiskanja podatkov ima to slabost, da mora dekodirnik poznati
frekvence ponavljanja znakov v datoteki, zato mora stisnjena datoteka vsebovati
frekvenčno tabelo znakov, ki doprinese h končni velikosti stisnjene datoteke. Prav tako
mora kodirnik narediti dva prehoda skozi nestisnjeni datoteki, najprej mora ugotoviti
frekvence znakov in zgraditi Huffmanovo drevo, šele v drugem prehodu nato dejansko
stisne datoteko. Na osnovi Huffmanovega algoritma so Newton Faller in Robert G.
Gallagher, ter kasneje Donald Knuth in Jeffrey Vitter, razvila algoritem s prilagajanjem
[2].
7.2 Stiskanje slik s metodo štiriških dreves in huffmanovim algoritmom
Delitev na Grayeve bitne ploskve ostane ista, do sprememb pride pri gradnji štiriškega
drevesa. Pri metodi brez izboljšave smo drevo gradili rekurzivno v globino. Za potrebe
Navodila za izdelavo diplomskega dela Stran 23
Huffmanovega stiskanja potrebujemo informacije o vozliščih na posameznih nivojih, zato
bomo gradili drevo iterativno v širino.
Algoritem, ki ga bomo uporabljali, ni pravi adaptivni Huffmanov algoritem, ampak zgolj
poenostavljena inačica. Uporabljali bomo zgolj tri simbole oziroma barve vozlišč - sivo, ki
je vmesno vozlišče in ni list, črno, ki je list z bitno vrednostjo oz. barvo 1, ter bela, ki
označuje list z bitno vrednostjo oz. barvo 0.
Za vsako barvo vodimo števec pojavitev. Ob vsaki pojavitvi zapišemo v datoteko ustrezno
kodo iz frekvenčne tabele, po vsaki pojavitvi pa preverimo vse tri števce, če ustrezajo
pogoju, ki pravi: barva, ki ima trenutno največ pojavitev, mora imeti kodo 1, barva ki ima
druga največ pojavitev, mora imeti kodo 01, barva s trenutno najmanj pojavitvami pa ima
kodo 00. V kolikor razporeditev barv v Huffmanovi frekvenčni tabeli ne ustreza pogoju,
barvam ustrezno zamenjamo kode. Tako kodirnik in dekodirnik vedno začneta z enako
kodno tabelo (tabela 6).
Barva Koda
Siva 1
Črna 01
Bela 00
Tabela 6: Kodna tabela
Algoritem, ki ga prikazuje psevdokod 3, prične z ustvarjanjem očeta, ki ga doda v vektor
kvadrantov Seznam, ki je vektor vozlišč štiriškega drevesa ploskve na trenutnem nivoju. V
naslednjem koraku se sprehodimo skozi elemente vektorja Seznam. Ker v trenutnem
koraku nimamo informacije o barvi kvadranta, preverjamo, ali so enobarvni (črni ali beli)
ali dvobarvni (sivi). Če ugotovimo, da je trenutno obravnavani kvadrant dvobarven, ga
razdelimo na 4 sinove med seboj enakih dimenzij in jih dodamo v začasni vektor
naslednjega nivoja ZacasniSeznam, ter v datoteko zapišemo kodo, ki jo določa trenutna
Huffmanova frekvenčna tabela. Če je kvadrant enobarven, zgolj zapišemo v datoteko kodo
barve, ki jo določa trenutna Huffmanova frekvenčna tabela. Seznam nadomestimo z
vektorjem ZacasniSeznam in sprehod po vektorju ponavljamo, dokler ne pridemo do
zadnjega nivoja štiriškega drevesa. Po vsakem zapisu v datoteko osveţimo Huffmanovo
Navodila za izdelavo diplomskega dela Stran 24
frekvenčno tabelo, ko pa zaključimo z obravnavanjem trenutne ploskve, tabelo
ponastavimo.
Navodila za izdelavo diplomskega dela Stran 25
Psevdokod 3: Izboljšava s Huffmanovim algoritmom – stiskanje
function Stiskanje()
Nadaljuj = true;
for each (Ploskev in Grayeve_Ploskve)
Oce = Kvadrant(0, SirinaSlike-1, VisinaSlike-1)
Seznam.Dodaj(Oce);
for each( Kvadrant in Seznam)
for( i = S1 to S2)
if( Nadaljuj == true)
for( j = V1 to V2)
if (Piksel(i,j) != Piksel(S1,V1) )
Nadaljuj = false;
HuffmanStevec[Sivo]++;
DodajVDatoteko(Sivo);
PreveriHuffmanoveStevce();
break;
RazdeliKvadrantNaSinove();
ZacasniSeznam.Dodaj(PrviSin);
ZacasniSeznam.Dodaj(DrugiSin);
ZacasniSeznam.Dodaj(TretjiSin);
ZacasniSeznam.Dodaj(CetrtiSin);
break;
end if
end for
else
break;
end for
if(Nadaljuj == true)
HuffmanStevec[Piksel.Barva]++;
DodajVDatoteko(Piksel.Barva);
PreveriHuffmanoveStevce();
end if
Navodila za izdelavo diplomskega dela Stran 26
Seznam = ZacasniSeznam;
end for
PonastabiHuffmanovoTabelo();
end for
end function
7.3 Razširjanje slik, stisnjenih z metodo štiriških dreves in huffmanovim
algoritmom
Algoritem razširjanja, ki ga prikazuje psevdokod 4, ima na začetku na voljo enako
frekvenčno tabelo kot algoritem za stiskanje. Najprej ustvari očeta štiriškega drevesa in mu
določi barvo glede na prebran bit iz datoteke, obravnavan s Huffmanovim algoritmom.
Očeta nato doda v vektor vozlišč trenutnega nivoja štiriškega drevesa – Seznam.
Nato izvedemo sprehod po vektorju Seznam in preverjamo barve posameznih kvadrantov.
Če je barva kvadranta siva, razdelimo kvadrant na štiri med seboj enako velike
podkvadrante in jim s prebranim bitom iz datoteke, ter glede na Huffmanovo frekvenčno
tabelo, dodelimo barvo. Če je barva kvadranta črna ali bela, kvadrant pobarvamo z
določeno barvo.
Navodila za izdelavo diplomskega dela Stran 27
Psevdokod 4: Izboljšava s Huffmanovim algoritmom – razširjanje
function Razsirjanje()
for each( Ploskev in GrayevePloskve)
Ploskev = new BitnaPloskev(Sirina, Visina);
Oce = Kvadrant(0, SirinaSlike-1, VisinaSlike-1)
Oce.Barva = DobiBarvoIzDatoteke();
Seznam.Dodaj(Oce);
for each( Kvadrant in Seznam)
if( Kvadrant.Barva == Siva)
RazdeliKvadrantNaSinove();
ZacasniSeznam.Dodaj(PrviSin);
ZacasniSeznam.Dodaj(DrugiSin);
ZacasniSeznam.Dodaj(TretjiSin);
ZacasniSeznam.Dodaj(CetrtiSin);
else if( Kvadrant.Barva == Crna)
PobarvajPloskev(Ploskev, Crna);
else
PobarvajPloskev(Ploskev, Bela);
Seznam = ZacasniSeznam;
end for
PonastaviHuffmanovoTabelo();
end for
end function
Navodila za izdelavo diplomskega dela Stran 28
8 REZULTATI
V tem poglavju bomo predstavili vzorec iz mnoţice testnih primerov, ki najbolje prikaţejo
dobre in slabe lastnosti delovanja algoritma brezizgubnega stiskanja s štiriškimi drevesi.
8.1 Testni primer 1
Testni primer 1: v tem primeru smo testirali enobarvno sivinsko sliko, kjer so vsi piksli
enake barve. Štiriško drevo iz vsake bitne ploskve je sestavljeno iz natanko enega vozlišča,
zato je tudi stopnja stiskanja najniţja.
Ločljivost: 400×400 pikslov
Nestisnjena velikost: 640054 zlogov
Stisnjena velikost: 17 zlogov
Faktor stiskanja: 37650,235: 1
Navodila za izdelavo diplomskega dela Stran 29
8.2 Testni primer 2
Testni primer 2: v tem primeru obravnavamo risano sliko, ki je razdeljena na enobarvne
četrtine. Štiriško drevo iz vsake bitne ploskve je sestavljeno iz 5 vozlišč, očeta in štirih
sinov, kar ima za posledico zelo nizko stopnjo stiskanja.
Ločljivost: 500×500 pikslov
Nestisnjena velikost: 1000054 zlogov
Stisnjena velikost: 1139 zlogov
Faktor stiskanja: 878,011: 1
Navodila za izdelavo diplomskega dela Stran 30
8.3 Testni primer 3
Testni primer 3: v tem primeru obravnavamo umetno zvezno sliko s četrtinami, ki se v
odtenku razlikujejo za eno števko. Slika je primer učinkovitosti uporabe Grayevih kod, saj
je stopnja stiskanja zaradi le-teh niţja, kot pa pri testnem primeru 2, kjer četrtine med seboj
niso bile zveznih barv.
Ločljivost: 500×500 pikslov
Nestisnjena velikost: 1000054 zlogov
Stisnjena velikost: 241 zlogov
Faktor stiskanja: 4149,602: 1
Navodila za izdelavo diplomskega dela Stran 31
8.4 Testni primer 4
Testni primer 4: Preprosta diskretna slika s obarvanimi četrtinami in osminami
Ločljivost: 400 × 400 pikslov
Nestisnjena velikost: 640054 zlogov
Stisnjena velikost: 34 zlogov
Faktor stiskanja: 18825,118: 1
Navodila za izdelavo diplomskega dela Stran 32
8.5 Testni primer 5
Testni primer 5: V tem primeru obravnavamo naravno sliko neba z drevesom in streho z
namenom prikaza učinkovitosti Grayevih kod pri naravnih zveznih slikah.
Ločljivost: 667 × 500 pikslov
Nestisnjena velikost: 1334054 zlogov
Stisnjena velikost: 424035 zlogov
Faktor stiskanja: 3,146: 1
Navodila za izdelavo diplomskega dela Stran 33
8.6 Testni primer 6
Testni primer 6: Naravna slika, delno pokrita s nebom (zveznost)
Ločljivost: 667 × 500 pikslov
Nestisnjena velikost: 1334054 zlogov
Stisnjena velikost: 1014540 zlogov
Faktor stiskanja: 1,315: 1
Navodila za izdelavo diplomskega dela Stran 34
8.7 Testni primer 7
Testni primer 7: V tem primeru obravnavamo naravno sliko z mnoţico majhnih zveznih
območij. Zaradi majhnih dimenzij zveznih območij so vsa štiriška drevesa bitnih ploskev
zelo razvejana, česar posledica je večja velikost stisnjene datoteke.
Ločljivost: 667 × 500 pikslov
Nestisnjena velikost: 1334054 zlogov
Stisnjena velikost: 1620398 zlogov
Faktor stiskanja: 1: 1,215
Navodila za izdelavo diplomskega dela Stran 35
8.8 Interpretacija rezultatov
Nizko stopnjo, ki pomeni visoko učinkovitost stiskanja, opazimo pri:
uniformnih slikah (testni primer 1)
diskretnih slikah (testni primeri: 2 in 4) in
zveznih slikah (testni primer 3)
Zmerno nizko stopnjo stiskanja opazimo pri naravnih slikah, kjer slika vsebuje večja
območja zveznih barv (testni primer 5), ki pa pada s številom in velikostjo takšnih območij
(testni primer 6).
Pri nezveznih, barvno razgibanih slikah pa opazimo, da je stisnjena datoteka lahko tudi
večja od nestisnjene (testni primer 7).
Razliko med stiskanjem zveznih in diskretnih slik najbolje prikazuje razlika med testnima
primeroma 2 in 3, kjer je velikost stisnjene zvezne slike pribliţno 4,73-krat manjša od
stisnjene diskretne slike.
Ugotovili smo, da stiskanje deluje najslabše, če niti dva sosednja piksla v sliki ne ponudita
zvezne spremembe barve.
Navodila za izdelavo diplomskega dela Stran 36
9 SKLEP
Preučili smo algoritem brezizgubnega stiskanja slik s štiriškimi drevesi. Spoznali smo
pojem digitalnih slik, nad katerimi izvajamo algoritme stiskanja. Ob preučevanju algoritma
brezizgubnega stiskanja slik s štiriškimi drevesi smo spoznali tudi lastnosti, računanje in
uporabnost Grayevih dvojiških kod.
Prišli smo do zaključka, da se algoritem brezizgubnega stiskanja slik s štiriškimi
drevesi najbolje obnese na slikah, kjer imamo večja območja uniformnih barv. Prav tako se
odlično obnese nad slikami z večjimi območji zvezno prehajajočih barv, kar je posledica
uporabe Grayevih dvojiških kod. Grayeve kode imajo lastnost, ki pravi, da se dve
zaporedni Grayevi kodi razlikujeta zgolj v enem bitu, kar pri delitvi barvne slike na bitne
ploskve pomeni, da dobimo večje število in večji obseg uniformnih območij na bitnih
ploskvah, kot pa če bi uporabili standardne binarne kode.
Problem nastane pri zelo razgibanih slikah, ki vsebujejo mnoţico majhnih enobarvnih
območij. V takšnem primeru se algoritem, ne samo ne obnese, ampak celo ustvari
datoteko, večjo od izvirne nestisnjene slike.
Navodila za izdelavo diplomskega dela Stran 37
10 LITERATURA IN VIRI
[1] David Salomon, Data Compression, Springer-Verlag London Limited, 2007, str. 461-
464
[2] ADAPTIVE HUFFMAN CODING
http://www.cs.duke.edu/csed/curious/compression/adaptivehuff.html#tree (19.2.2012)
[3] Wikipedia – Gray code http://en.wikipedia.org/wiki/Graycode (19.2.2012)
[4] How to understand and use Gray code
http://morkalork.com/mork/article/74/How_to_understand_and_use_Gray_code.htm
(19.2.2012)
[5] Wikipedia - Quadtree http://en.wikipedia.org/wiki/Quadtree (19.2.2012)
[6] Project #32: PICTURE REPRESENTATION USING QUAD TREES -- Winter 1999
http://www.cs.ubc.ca/~pcarbo/cs251/welcome.html (19.2.2012)
[7] Wikipedia – Adaptive Huffman coding
http://en.wikipedia.org/wiki/Adaptive_Huffman_coding (19.2.2012)
Navodila za izdelavo diplomskega dela Stran 38
Navodila za izdelavo diplomskega dela Stran 39
Navodila za izdelavo diplomskega dela Stran 40