Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
MARKO KOCMUT
DIPLOMSKA NALOGA
MARIBOR, SEPTEMBER 2009
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
Marko Kocmut
Stiskanje podatkov LIDAR
Diplomska naloga
Maribor, september 2009
FAKULTETA ZA
ELEKTROTEHNIKO
UNIVERZA V MARIBORU RAČUNALNIŠTVO IN
INFORMATIKO 2000 Maribor, Smetanova ul. 17
Diplomska naloga univerzitetnega študijskega programa
Stiskanje podatkov LIDAR
Študent: Marko Kocmut
Študijski program: univerzitetni, Računalništvo in
informatika
Smer : Programska oprema
Mentor: prof. dr. Borut Ţalik
Somentor: doc. dr. David Podgorelec
Maribor, september 2009
iii
ZAHVALA
Zahvaljujem se mentorju prof.
dr. Borutu Ţaliku in somentorju
doc. dr. Davidu Podgorelcu za
pomoč ter vodenje pri pripravi
diplomske naloge.
Posebna zahvala gre tudi mojim
staršem, ki so mi omogočili
študij ter me spodbujali pri
njem.
iv
STISKANJE PODATKOV LIDAR
Ključne besede: LIDAR, stiskanje podatkov, algoritmi stiskanja, aritmetično kodiranje,
Huffmanovo kodiranje
UDK: 004.627.021(043.2)
Povzetek
Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja podatkov
LIDAR (angl. Light Detection and Ranging), ki so shranjeni v datotekah LAS. V
diplomskem delu podrobneje opišemo strukturo datoteke LAS. V drugem delu kratko
predstavimo namen stiskanja podatkov in v grobem opišemo različne vrste algoritmov.
Podrobneje opišemo idejo aritmetičnega kodiranja ter Huffmanovega kodiranja. V
implementiranem algoritmu uporabimo aritmetično kodiranje, zato predstavimo konkreten
način implementacije le-tega. V zadnjem delu predstavimo razviti algoritem in ga
primerjamo z nekaterimi brezplačnimi in plačljivimi univerzalnimi algoritmi za stiskanje
podatkov.
v
LIDAR DATA COMPRESSION
Keywords: LIDAR, data compression, compression algorithms, arithmetic coding,
Huffman coding
UDK: 004.627.021(043.2)
Abstract
The purpose of this diploma work is to develop an algorithm for compressing LIDAR
(Light Detection and Ranging) data, which are saved in LAS files. Firstly, we discuss in
details the structure and meaning of each part of the LAS file. In the continuation we
examine why data can be compressed and which algorithms can be applied. These
algorithms are then briefly considered. Huffman and arithmetic coding are explained in
details. Arithmetic coding is used in our compression algorithm, which concrete
implementation is presented. At the end, we compare the developed algorithm with other
software for data compression.
vi
VSEBINA
VSEBINA VI
KAZALO SLIK VII
1. UVOD 1
2. TEHNOLOGIJA LIDAR 3
2.1. DELOVANJE IN ZAJEMANJE PODATKOV S TEHNOLOGIJO LIDAR 4 2.1.1. SMERI GIBANJA LEČE LASERJA PRI TEHNOLOGIJI LIDAR 6 2.2. DATOTEKA LAS 7
3. STISKANJE PODATKOV 13
3.1. RLE 14 3.2. KODIRNIKI S SLOVARJEM 15 3.3. STATISTIČNO KODIRANJE 16 3.3.1. HUFFMANOVO KODIRANJE 17 3.3.2. ARITMETIČNO KODIRANJE 20 3.4. NAPOVEDOVALNI ALGORITMI 23
4. IMPLEMENTACIJA PROGRAMA 24
4.1. NALAGANJE DATOTEKE LAS IN RAZRED LASFILE 24 4.2. ALGORITMI NAPOVEDOVANJA VREDNOSTI 26 4.3. IMPLEMENTACIJA ARITMETIČNEGA KODIRNIKA 34 4.4. STRUKTURA STISNJENE DATOTEKE 37 4.5. VIZUALIZACIJA PODATKOV LIDAR 38 4.6. APLIKACIJA 39 4.7. PRIMERJAVA IMPLEMENTIRANEGA ALGORITMA Z NEKATERIMI PROGRAMI ZA STISKANJE PODATKOV 43
5. SKLEP 48
VIRI IN LITERATURA 50
vii
KAZALO SLIK
Slika 1: Večkratni odboji ___________________________________________________ 4
Slika 2: Delovanje tehnologije LIDAR ________________________________________ 6
Slika 3: Vzorec cikcak _____________________________________________________ 7
Slika 4: Vzporedni vzorec __________________________________________________ 7
Slika 5: Eliptični vzorec ____________________________________________________ 7
Slika 6: Gradnja Huffmanovega drevesa ______________________________________ 18
Slika 7: Huffmanovo drevo z kodami_________________________________________ 19
Slika 8: Postopek aritmetičnega kodiranja _____________________________________ 22
Slika 9: Predstavitev realnega števila po standardu IEEE 754 ______________________ 26
Slika 10: Paralelogramska napoved __________________________________________ 28
Slika 11: Kodiranje delta __________________________________________________ 28
Slika 12: Napovedovanje koordinate y ________________________________________ 30
Slika 13: Zakodirana razlika y ______________________________________________ 31
Slika 14: Napovedovanje s pomočjo ravnine ___________________________________ 32
Slika 15: Normalizacija ___________________________________________________ 37
Slika 16: Glavno okno aplikacije ____________________________________________ 40
Slika 17: Pogovorno okno napredovanja ______________________________________ 41
Slika 18: Informacije o datoteki LAS _________________________________________ 42
Slika 19: Primerjanje dveh datotek ___________________________________________ 43
Slika 20: Obvestila ob primerjavi datotek _____________________________________ 43
1
1. UVOD
Tehnologija LIDAR se je uveljavila na različnih področjih, kot so arheologija,
geologija, fizika in astronomija, kjer se uporablja za simulacije, reliefe itd. Eno izmed
najbolj razširjenih področij, ki je v svetu računalništva zelo pomembno in je imelo tudi
poglavitno vlogo, zakaj smo se lotil izdelave te diplomske naloge, je internet oz. svetovni
splet. Ker datoteke, ki hranijo podatke LIDAR, vsebujejo veliko število točk, ki se lahko
giblje od nekaj milijonov pa do nekaj deset milijonov, so te datoteke zelo velike. Velikost
pa je med glavnimi faktorji, ki se upoštevajo pri prenosu datotek preko interneta.
Najprimernejša in tudi najbolj očitna rešitev je, da podatke LIDAR, predvsem točke, na
podlagi redundance stisnemo oziroma zakodiramo. Namen te diplomske naloge je
implementirati algoritem, ki bo učinkovito stisnil podatke LIDAR.
Ker je stiskanje podatkov pomembno področje v svetu računalništva, so razvili mnogo
programov za stiskanje podatkov, ki uporabljajo različne algoritme oz. metode. Prednost
splošnih programov je zagotovo ta, da delujejo na kakršnihkoli podatkih. Prav zaradi tega
pa za določen tip podatkov niso optimalni. Če poznamo podatke, lahko bolje načrtujemo
postopek njihovega stiskanja, posledično pa smo pri stiskanju običajno uspešnejši. Boljšo
učinkovitost stiskanja doseţemo, če si lahko privoščimo izgube. V našem primeru stiskanja
podatkov LIDAR pa smo se odločili za brezizgubno stiskanje.
V drugem poglavju diplomske naloge podrobno predstavimo tehnologijo LIDAR.
Opišemo, kako se posamezne točke zajemajo in kako ta tehnologija sploh deluje.
Predstavimo tudi format datotek, v katerih se podatki shranjujejo. V tretjem poglavju na
kratko opišemo namen stiskanja podatkov, povzamemo zgodovino stiskanja podatkov ter
opišemo najbolj znane metode oz. algoritme za stiskanje podatkov. Usmerimo se samo v
brezizgubne algoritme, pri čemer podrobneje opišemo aritmetično in Huffmanovo
kodiranje, ki sta bila najprimerjnejša za uporabo v našem postopku v kombinaciji s
postopkom napovedovanja vrednosti. V četrtem poglavju podrobno opišemo izdelano
2
aplikacijo ter implementiran algoritem. Na koncu poglavja primerjamo implementiran
algoritem stiskanja z drugimi, večinoma univerzalnimi programi za stiskanje in arhiviranje,
kot so ZIP, RAR, 7Z, in drugimi manj znanimi. V sklepnem poglavju povzamemo naše
delo ter predstavimo moţne izboljšave algoritma.
3
2. TEHNOLOGIJA LIDAR
Tehnologija LIDAR (angl. LIght Detection And Ranging) je zelo uporabna na različnih
področjih, kot so npr. merjenje razdalje, merjenje hitrosti, merjenje rotacije, merjenje
kemijskih sestav in koncentracij [1]. Moţnost merjenja razdalje so začeli zelo hitro
uporabljati za tvorjenje zelo podrobnih in natančnih računalniških modelov reliefov
zemeljskega površja. Zato sicer obstajajo digitalni modeli višin (angl. DEM - Digital
Elevation Model), ki pa se zaradi obstoja tehnologije LIDAR v zadnjih časih izdelajo
ravno s pomočjo podatkov, pridobljenih z tehnologijo LIDAR. Klasičen postopek zbiranja
podatkov za DEM je teţji, zamudnejši in mnogo draţji. Potencial tehnologije LIDAR je
uvidela tudi policija, saj se lahko LIDAR uporablja za merjenje hitrosti. V tem poglavju
bomo opisali postopek merjenja razdalje, saj je ta pomemben za tvorbo datotek z
višinskimi točkami, slednje pa ţelimo stisniti oz. zakodirati.
Tehnologija se zaradi moţnosti merjenja razdalje med drugim uporablja za prebiranje
točk površja in deluje na podoben način kot radar. Razlika napram radarju je, da radar
uporablja radijske valove, pri tehnologiji LIDAR pa se uporablja svetloba oz. laser, ki
proizvaja svetlobne impulze. Ker deluje LIDAR po istem principu kot radar, je postopek
sledeč. Najprej generiramo laserski ţarek, ki ga pošljemo proti površju, od katerega se
potem odbije. Nato izmerimo čas od trenutka sproţitve ţarka pa do trenutka, ko se ţarek
odbije v ustrezen senzor. Ta čas se deli s hitrostjo laserskega ţarka in tako dobimo razdaljo
od izvora do objekta, ki je laserski ţarek odbil. Laserje pogosto pritrdijo na letala, ki so
najhitrejši način za prebiranje točk pokrajine. Hitrost delovanja in zajemanja točk je
popolnoma odvisna od laserja in njegove zmogljivosti tvorjenja ţarkov. Le-ta je med 2.000
do 5.000, pri boljših napravah pa tudi do 50.000 ţarkov na sekundo. Zelo zmogljiv pa
mora biti tudi senzor, ki zajema odbite ţarke, saj mora zajeti tudi večkrat odbite ţarke (do
5 odbojev), kar je prikazano na sliki 1. Za primer lahko vzamemo laser, ki deluje s
frekvenco 30 kHz (tvori 30.000 impulzov), kar pomeni, da mora senzor delovati z
4
frekvenco 150 kHz, saj mora loviti tudi večkratne odboje. Do teh pride predvsem na
drevesih, kjer se del ţarka odbije, spet drugi del se prebije skozi liste in se odbije kasneje.
Takšnim ploskvam pravijo mehke ploskve, med katere štejemo drevesa, podrastje itd. Na
koncu zajete podatke največkrat shranijo v binarno datoteko LAS, katere strukturo bomo
predstavili v podpoglavju 2.2 .
Za tehnologijo LIDAR, ki se uporablja za prebiranje površja, najdemo različna
poimenovanja, med njimi lahko omenimo ALSM (angl. Airborne Laser Swath Mapping),
lasersko merjenje višin (angl. laser altimetry), v vojaškem kontekstu pa se pojavlja oznaka
LADAR (angl. Laser Detection and Ranging).
Slika 1: Večkratni odboji [2]
2.1. Delovanje in zajemanje podatkov s tehnologijo LIDAR
Kot smo omenili, tehnologija LIDAR deluje s pomočjo laserja, pritrjenega na trup
letala, ki izvaja prelete nad površjem. Takšen sistem pa ni popoln, saj nam laser meri le
razdaljo od letala pa do tal. Ta informacija ni zadostna , saj potrebujemo še informacijo o
poloţaju letala, nagibu oz. rotaciji letala. Zato sta za natančno zajemanje podatkov potrebni
še naslednji komponenti:
5
Sistem globalnega določanja poloţaja oz. GPS (angl. Global Positioning
System), ki je namenjen za določanje relativnega poloţaja senzorja (koordinate
x, y, z), pritrjenega na letalo. Na tleh se nahajajo še druge naprave GPS, katerih
poloţaj je nespremenjen in jih uporabljamo kot referenčne naprave napravi GPS
v letalu.
Inercialna merilna enota – IMU (angl. Inertial Measuring Unit) meri
komponente »roll«, »pitch« in »yaw« torej kote rotacije senzorja, pritrjenega na
letalo, okrog osi x, y in z (z drugimi besedami, ta naprava meri nagib, rotacijo
in smer letala).
Zajemanje podatkov oz. gibanje laserske leče je lahko od sistema do sistema različno.
Zato mora celotni sistem upoštevati tudi kot, pod katerim je bil tvorjen laserski ţarek. Ob
vseh sistemih, ki ob laserskih impulzih generirajo podatke, se izračunajo relativne višine,
ki se kasneje z ustreznimi programi najpogosteje zapišejo v binarno datoteko LAS. Na sliki
2 je prikazana shema delovanja in potrebne komponente za prebiranje reliefa.
6
Slika 2: Delovanje tehnologije LIDAR (prirejeno po [3])
2.1.1. Smeri gibanja leče laserja pri tehnologiji LIDAR
Kot smo ţe opisali, je lahko gibanje leče laserja različno, kar moramo upoštevati pri
določanju poloţaja in višine. V tem podpoglavju na kratko predstavimo načine gibanja
laserske leče in vzorce zajemanja podatkov [2]. Najpogostejši način gibanja leče na
napravi je »cikcak« ali sinusna krivulja. Moţni se tudi vzporedni in eliptični vzorci, vendar
datotek LAS s takšnim vzorci nismo našli na spletu, od koder smo črpali praktične primere.
Na sliki 3 je prikazan najpogostejši vzorec cikcak, slika 4 prikazuje vzporedni vzorec, slika
5 pa eliptični vzorec zajemanja podatkov.
7
Slika 3: Vzorec cikcak
Slika 4: Vzporedni vzorec
Slika 5: Eliptični vzorec
2.2. Datoteka LAS
Še preden se lotimo kodiranja podatkov, je potrebno podrobno opisati strukturo in
vsebino datoteke, ki jo bomo kodirali oz. stiskali. Kot smo ţe omenili, se podatki LIDAR
najpogosteje shranjujejo v binarne datoteke LAS. Najpogosteje se uporabljajo formati 1.0,
1.1 in 1.2. Omenimo lahko tudi format 2.0, ki je svobodnejši glede strukture podatkov in
načina zapisa podatkov v datoteko [4]. V okviru diplomske naloge bomo predstavili format
1.2 [5], ki je nadgradnja formatov 1.0 in 1.1 [6].
8
Binarna datoteka LAS, zapisana v formatu 1.2, je sestavljena iz treh blokov (tabela 1).
V tabeli 2 je prikazana struktura glave datoteke, ki hrani skupne podatke. S pomočjo teh
podatkov tako na primer dejansko izračunamo absolutne koordinate točk. Posamezna
koordinata x se tako izračuna z enačbo:
.
Druge koordinate se izračunajo na podoben način. Naslednji blok v strukturi hrani zapise
spremenljive dolţine (angl. Variable Length Records), katerih število je navedeno v glavi
datoteke. Struktura tega bloka datoteke je prikazana v tabeli 3.
Tabela 1 : Struktura datoteke LAS
Glava
Zapisi spremenljive dolţine
Točke
Tabela 2 : Glava datoteke LAS
Element/polje Opis Tip Velikost Obvezen
File Signature 4 znaki »LASF«. char[4] 4 zlogi *
File Source ID ID med 0 in 65535 unsigned short 2 zloga *
Global encoding Vsebuje nekatere podatke o
datoteki. unsigned short 2 zloga *
Project ID – GUID data 1 ID projekta. unsigned long 4 zlogi
Project ID – GUID data 2 ID projekta. unsigned short 2 zloga
Project ID – GUID data 3 ID projekta. unsigned short 2 zloga
Project ID – GUID data 4 ID projekta. unsigned char[8] 8 zlogov
Version Major
Verzija datoteke. V
kombinaciji s poljem
»Version Minor«.
unsigned char 1 zlog *
Version Minor
Verzija datoteke. V
kombinaciji s poljem
»Version Major«.
unsigned char 1 zlog *
System Identifier
Identifikator, ki nam pove,
na kakšen način so podatki
nastali.
char[32] 32 zlogov *
Generating Software
Informacija o programski
opremi, ki je bila
uporabljena pri generiranju.
char[32] 32 zlogov *
File Creation Day of Year Dan v letu, ko je bila
datoteka kreirana. unsigned short 2 zloga
File Creation Year Leto kreiranja, izraţeno s
štirimestnim številom. unsigned short 2 zloga
Header Size Velikost glave datoteke v
zlogih. unsigned short 2 zloga *
Offset to point data Odmik v zglogih do prvega
zapisa točke. unsigned long 4 zlogi *
Number of variable
length records
Število zapisov s
spemenljivo dolţino. unsigned long 4 zlogi *
9
Point data format ID
Format zapisa točk. Format
1.2 podpira formate 0, 1, 2
in 3.
unsigned char 1 zlog *
Point data record length Dolţina (v zlogih) zapisa
ene točke. unsigned short 2 zloga *
Number of point records Skupno število točk v
datoteki. unsigned long 4 zlogi *
Number of points by
return
Število odbojev, ki se
upoštevajo pri odboju
laserskega ţarka.
unsigned long[5] 20 zlogov *
X scale factor Skalnirni faktor za
komponento x. double 8 zlogov *
Y scale factor Skalnirni faktor za
komponento y. double 8 zlogov *
Z scale factor Skalnirni faktor za
komponento z. double 8 zlogov *
X offset Odmik x. double 8 zlogov *
Y offset Odmik y. double 8 zlogov *
Z offset Odmik z. double 8 zlogov *
Max X Maksimalna vrednost
komponente x. double 8 zlogov *
Min X Minimalna vrednost
komponente x. double 8 zlogov *
Max Y Maksimalna vrednost
komponente y. double 8 zlogov *
Min Y Minimalna vrednost
komponente y. double 8 zlogov *
Max Z Maksimalna vrednost
komponente z. double 8 zlogov *
Min Z Minimalna vrednost
komponente z. double 8 zlogov *
Tabela 3 : Zapisi spremenljive dolžine
Element/polje Opis Format Velikost Obvezen
Reserved Rezervirano. unsigned short 2 zloga
User ID ID uporabnika, ki je
kreiral ta zapis
spremenljive dolţine.
char[16] 16 zlogov *
Record ID Vrednost je odvisna od
polja »User ID« in jo
lahko določi uporabnik.
unsigned short 2 zloga *
Record Length after
Header
Število zlogov po glavi
zapisa spremenljive
dolţine.
unsigned short 2 zloga *
Description Opis podatkov. char[32] 32 zlogov
Data Podatki. / /
10
V predhodnem odseku je bila opisana predvsem glava datoteke. Večina podatkov, ki
so v datoteki, pa se nahaja v tretjem bloku, kjer so točke. V glavi datoteke se poleg števila
točk nahaja tudi informacija o strukturi zapisa teh točk v datoteki. Moţnih je več načinov
formatov zapisa, med katerimi je format 0 »najrevnejši«, format 3 pa »najbogatejši« z
vsebovanimi podatki. Struktura zapisa točk je predstavljena v tabelah 4, 5, 6 in 7.
Tabela 4 : Format zapisa točk 0
Format Element/polje Opis Format Velikost Obvezen
0
X Koordinata x. long 4 zlogi *
Y Koordinata y. long 4 zlogi *
Z Koordinata z. long 4 zlogi *
Intensity Intenziteta oz. intenzivnost
vrnjenega ţarka.
unsigned
short 2 zloga
Return Number Kateri odboj za posamezen
ţarek. 3 bits 3 biti *
Number of Returns Skupno število odbojev
ţarka. 3 bits 3 biti *
Scan Direction
Flag
Smer, v katero je potovalo
zrcalo laserja ob pošiljanju
ţarka.
1 bit 1 bit *
Edge of Flight
Line
Označuje zadnjo točko pri
skeniranju površja. 1 bit 1 bit *
Classification
Klasifikacija posamezne
točke (tla, nizka podrast,
srednja podrast, ...).
unsigned
char 1 zlog *
Scan Angle Rank Kot, pri katerem je bila
točka zajeta. char 1 zlog *
User Data Poljubni podatki. unsigned
char 1 zlog
Point Source ID ID izvora/datoteke, iz
katere je ta točka.
unsigned
short 2 zloga *
Tabela 5 : Format zapisa točk 1
Format Element/polje Opis Format Velikost Obvezen
1
X Koordinata x. long 4 zlogi *
Y Koordinata y. long 4 zlogi *
Z Koordinata z. long 4 zlogi *
Intensity Intenziteta oz. intenzivnost
vrnjenega ţarka.
unsigned
short 2 zloga
Return Number Kateri odboj za posamezen
ţarek. 3 bits 3 biti *
Number of Returns Skupno število odbojev
ţarka. 3 bits 3 biti *
Scan Direction
Flag
Smer, v katero je potovalo
zrcalo laserja ob pošiljanju
ţarka.
1 bit 1 bit *
Edge of Flight
Line
Označuje zadnjo točko pri
prebiranju površja. 1 bit 1 bit *
11
Classification
Klasifikacija posamezne
točke (tla, nizka podrast,
srednja podrast, ...).
unsigned
char 1 zlog *
Scan Angle Rank Kot, pri katerem je bila
točka zajeta. char 1 zlog *
User Data Poljubni podatki. unsigned
char 1 zlog
Point Source ID ID izvora/datoteke, iz
katere je ta točka.
unsigned
short 2 zloga *
GPS Time Čas GPS, ko je bila točka
odbrana. double 8 zlogov *
Tabela 6 : Format zapisa točk 2
Format Element/polje Opis Format Velikost Obvezen
2
X Koordinata x. long 4 zlogi *
Y Koordinata y. long 4 zlogi *
Z Koordinata z. long 4 zlogi *
Intensity Intenziteta oz. intenzivnost
vrnjenega ţarka.
unsigned
short 2 zloga
Return Number Kateri odboj za posamezen
ţarek. 3 bits 3 biti *
Number of Returns Skupno število odbojev
ţarka. 3 bits 3 biti *
Scan Direction
Flag
Smer, v katero je potovalo
zrcalo laserja ob pošiljanju
ţarka.
1 bit 1 bit *
Edge of Flight
Line
Označuje zadnjo točko pri
skeniranju površja. 1 bit 1 bit *
Classification
Klasifikacija posamezne
točke (tla, nizka podrast,
srednja podrast, ...).
unsigned
char 1 zlog *
Scan Angle Rank Kot, pri katerem je bila
točka zajeta. char 1 zlog *
User Data Poljubni podatki. unsigned
char 1 zlog
Point Source ID ID izvora/datoteke, iz
katere je ta točka.
unsigned
short 2 zloga *
Red Rdeča komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
Green Zelena komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
Blue Modra komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
Tabela 7 : Format zapisa točk 3
Format Element/polje Opis Format Velikost Obvezen
3
X Koordinata x. long 4 zlogi *
Y Koordinata y. long 4 zlogi *
Z Koordinata z. long 4 zlogi *
12
Intensity Intenziteta oz. intenzivnost
vrnjenega ţarka.
unsigned
short 2 zloga
Return Number Kateri odboj za posamezen
ţarek. 3 bits 3 biti *
Number of Returns Skupno število odbojev
ţarka. 3 bits 3 biti *
Scan Direction
Flag
Smer, v katero je potovalo
zrcalo laserja ob pošiljanju
ţarka.
1 bit 1 bit *
Edge of Flight
Line
Označuje zadnjo točko pri
prebiranju površja. 1 bit 1 bit *
Classification
Klasifikacija posamezne
točke (tla, nizka podrast,
srednja podrst, ...).
unsigned
char 1 zloga *
Scan Angle Rank Kot, pri katerem je bila
točka zajeta. char 1 zlog *
User Data Poljubni podatki. unsigned
char 1 zlog
Point Source ID ID izvora/datoteke, iz
katere je ta točka.
unsigned
short 2 zloga *
GPS Time Čas GPS, ko je bila točka
producirana. double 8 zlogov *
Red Rdeča komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
Green Zelena komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
Blue Modra komponeta v
sistemu RGB za točko.
unsigned
short 2 zloga *
13
3. STISKANJE PODATKOV
Kodiranje oz. stiskanje podatkov je pretvarjanje vhodnega podatkovnega niza v
spremenjen izhodni niz, pri katerem pričakujemo manjšo velikost slednjega [7]. Ta
postopek je moţen zaradi neoptimalnega shranjevanja podatkov na računalnikih. Razlog,
ki stoji za neoptimalnim hranjenjem podatkov, je, da je njihova obdelava v grobi (angl.
raw) obliki enostavnejša in tudi hitrejša. To lastnost lahko izkoristimo tako, da podatke, ki
jih ne uporabljamo pogosto, zakodiramo in tako zmanjšamo količino pomnilnika, ki bi ga
sicer potrebovali za hranjenje oz. arhiviranje. Drugo področje, ki zelo vpliva na razvoj
algoritmov in iskanje načinov stiskanja podatkov, je splet. Uporabniki spleta so omejeni s
hitrostjo povezave, zato je potrebno zmanjšati čas prenosa podatkov in s tem izboljšati
odzivnost. Eden izmed načinov izboljšave odzivnosti je, da povečamo hitrost prenosa, kar
pa je lahko zelo drago (polaganje boljših linij, uporaba zmogljivejše strojne opreme). Drug,
cenejši način je, da podatke zakodiramo in tako zmanjšamo izhodiščno količino podatkov,
ki jo je potrebno prenesti.
Pionirski algoritmi stiskanja podatkov so bili razviti za tekst [7]. Prvotne ideje veljajo
še danes in so zelo podobne metodam stiskanja podatkov, ki jih uporabljamo sedaj [7].
Osnovna ideja temelji na spoznanju, da znake, ki se pojavijo pogosteje, zakodiramo z
manjšim številom bitov.
Algoritme lahko delimo na brezizgubne (angl. lossless compression) in izgubne (angl.
lossy compression). Pri brezizgubnem stiskanju je po kodiranju moţno dobiti originalne
podatke v neokrnjeni obliki. Pri izgubnem stiskanju pa se zaradi zahteve po boljši stopnji
stiskanja odpovemo določeni natančnosti in s tem spremenimo izvorne podatke.
Algoritme oz. metode za odstranjevanje redundance, ki se lahko uporabljajo za
brezizgubno stiskanje, lahko v splošnem delimo na stiskanje s tekočo dolţino (angl. Run
14
Length Encoding; RLE), kodirnike s slovarjem (algoritmi LZ), statistične metode ter
napovedovalne algoritme, kot sta PPM (angl. Prediction by Partial Matching) in DMC
(angl. Dynamic Markov Compression) [8]. Grob opis idej teh algoritmov sledi v nadaljnjih
podpoglavjih.
Učinkovitost algoritmov stiskanja merimo s stopnjo stiskanja (angl. compression ratio),
ki je določeno z enačbo:
3.1. RLE
Stiskanje s tekočo dolţino (angl. run length enoding) je enostaven način stiskanja, ki se
uporablja predvsem pri stiskanju teksta in slik. Omenimo lahko, da se ta metoda uporablja
za prenos podatkov preko telefaksa, kjer se informacije prenašajo v obliki črnobelih slik.
Ravno na takšnih slikah ima ta metoda največji učinek, saj lahko daljše nize črnih in belih
pikslov učinkovito zakodiramo. Delovanje algoritma je naslednje: če se podatek x pojavi n
krat, potem n-to pojavitev znaka x zamenjamo s parom vrednosti nx. Za primer lahko
vzamemo stiskanje enostavne črnobele slike (primer 1) ter teksta (primer 2).
Primer 1:
bbbbbbbbbbbbbbbčččččččččččččččččbbbbbbbbbbbbbb →15b17č14b (dobra stopnja
stiskanja)
Primer 2:
bbaabbaacd → 2b2a2b2a1c1d (slaba stopnja stiskanja)
Kot vidimo iz primerov, je metoda učinkovita le na podatkih, kjer imamo daljša
zaporedja enakih podatkov. Če bi imeli vhodne podatke, ki ne bi vsebovali daljših nizov
ponovljenih simbolov, bi se hitro zgodilo, da bi izvorne podatke s to metodo zakodirali v
prostorsko večji izhod (to je prikazano na primeru 2). Zato se pri tej metodi upošteva
preprosto pravilo, da zaporedje enakih znakov zakodiramo le, če za zapis števila ponovitev
in za znak potrebujemo skupno manj bitov, kot bi jih potrebovali za niz ponovljenih enakih
simbolov. Pri tem je treba nekoliko spremeniti način zapisa kodiranja. Dobimo:
<posebni znak><število ponavljanj><znak, ki se ponavlja>
15
Algoritem, ki upošteva navedeno pravilo, bi niz zakodiral, kot je prikazano v primeru 3,
kjer se kot posebni ločilni znak uporablja »|«. Pri konkretnem kodiranju pa lahko pride tudi
do teţave, da je znak, ki se ponavlja, enak našemu »posebnemu znaku«. V tem primeru
lahko uporabimo način, pri katerem zapis kodirnega niza zasede štiri znake, pri tem pa ne
potrebujemo posebega ločilnega znaka. Namesto ločilnega znaka nam trije zaporedno
enaki znaki povedo, da imamo kodirni niz. Četrti znak v kodirnem zaporedju, pa je število
ponovitev ponavljajočega znaka, ki še sledijo. Tako bi kodirni niz »aaa3« pomenil 6
ponovitev znaka »a«. Ta način pa ima slabost, da pride pri treh ponovitvah znaka do
razšitive niza, saj trem ponovitvam dodamo še število ponovitev znaka (razširitev niza :
»aaa0«). Zaporedja enakih znakov, ki pa so krajša od tri, se pri tem načinu zapišejo v
nespremenjeni obliki.
Primer 3:
abcaaaaaacbbbbbbadddd → abc|6ac|6ba|4d (zakodiran niz)
3.2. Kodirniki s slovarjem
V skupini algoritmov s slovarjem je zagotovo med najbolj znanimi druţina algoritmov
LZ. Splošni algoritmi s slovarjem ne uporabljajo nobenega statističnega modela in ne
variabilnih kod, ampak uporaljajo slovar, ki je sestavljen iz predhodno prebranih in
kodiranih simbolov [7]. Največkrat se te metode uporabljajo za stiskanje teksta, čeprav se
lahko z njimi srečamo tudi pri stiskanju slik ali zvoka. Kodirniki jemljejo nize črk in števil,
ki jih s pomočjo slovarja, zakodirajo kot ţetone (angl. token). Slovarji so lahko statični ali
pa dinamični, v njih pa hranimo predhodno prebrane nize simbolov. Velikosti slovarjev so
lahko poljubne, vendar število vnosov določa število bitov, potrebnih za predstavitev
posamezne kode iz slovarja. Enostaven primer stiskanja s slovarjem je predstavil Ismail
Mohamed [7]. Njegova metoda je dvokoračna, kar pomeni, da v prvem prehodu pregleda
vhodni niz in si naredi slovar vseh znakov. V drugem koraku pa s slovarjem zakodiramo
podatke. Kot smo ţe omenili, so med najbolj znanimi metodami stiskanja s slovarjem
algoritmi LZ-77, LZ-78, LZW in še katera izpeljanka. Algorirem LZ-77 se imenuje tako,
ker sta ga razvila Abraham Lempel in Jacob Ziv leta 1977 [7]. Znan je tudi pod imenim
drseče okno (angl. sliding window) oz. LZ1 in deluje tako, da vhodni niz pregledujemo
znak za znakom. Ob branju hranimo manjši slovar prebranih znakov (angl. search buffer),
v katerem iščemo znake, ki so trenutno na vhodu. Če se znak oziroma zaporedje znakov
nahaja v slovarju, potem se prebrano zaporedje elementov zakodira z indeksom, ki je v
16
slovarju, in številom elementov, ki se v slovarju ponovijo. Da bi delovanje algoritma bolje
razumeli, podajamo v nadaljevanju primer postopka določanja ţetonov, ki se zakodirajo.
Primer:
Prva vrednost v ţetonu pomeni indeks v slovarju. Ker imamo na začetku prazen slovar, je
v prvem ţetonu vrednost 0. Druga vrednost v ţetonu pomeni število simbolov, ki se
ponovijo v slovarju. Tretji element v ţetonu je prvi simbol, ki se ne ponovi oz. ki prekine
znani niz iz slovarja.
3.3. Statistično kodiranje
Med pomembnejšimi statističnimi metodami kodiranja lahko omenimo Shannon-
Fanojevo, Huffmanovo in aritmetično kodiranje [7]. Pri statističnih algoritmih generiramo
variabilne kode, ki morajo biti unikatne oz. enolične. Kode se določijo s statistiko
(pogostejši simboli dobijo krajše kode, redkejši simboli pa daljše). Za primer vzamimo niz
s štirimi simboli a, b, c in d. Pri statičnih kodah se število bitov, potrebnih, da dobi vsak
simbol unikatno kodo, določi z enačbo:
št.bitov .
Tako bi za kodo dolţine enega simbola iz nabora štirih različnih enako verjetnih simbolov
potrebovali minimalno 2 bita (kode : a→00, b→01, c→10, d→11). V primeru različnih
verjetnosti pa imajo simboli sicer enolične, vendar različno dolge kode. Pomembno je, da
imajo simboli z večjo verjetnostjo pojavitve krajše kode, s tem pa zasedejo manj prostora.
... AABCAACABCAABCBCA ...
Slovar Slovar naslednjih
prebranih znakov(angl. Look-Ahead buffer)
znakov
Slovar prebranih znakov Slovar naslednjih znakov žeton
/ AACAACABCABAAAC (0,0,"A")
A ACAACABCABAAAC (1,1,"C")
AAC AACABCABAAAC (3,4,"B")
AACAACAB CABAAAC (3,3,"A")
AACAACABCABA AAC (1,2,"C")
17
Primer verjetnosti in pripadajočih kod je prikazan v tabeli 8. Kode se ne smejo dodeljevati
naključno, zato so v tabeli kot primer prikazane napačno in pravilno generirane kode.
Tabela 8 : Variabilne kode
Simbol Verjetnost Napačne kode Pravilne kode
a 0,49 1 1
b 0,25 01 01
c 0,25 010 000
d 0,01 001 001
Na prvi pogled med pravilnimi in napačnimi kodami ni razlike, vendar bi se ta pojavila,
ko bi ţeleli niz odkodirati. Če bi imeli zakodiran niz z napačnimi kodami, potem bi lahko
pri dekodiranju določenih nizov prišlo do dvoumnosti. Za primer vzemimo zakodiran niz
101001, ki bi ga lahko odkodirali na dva načina in sicer 1|010|01, kar je acb, in 1|01|001,
kar je abd. Zatorej je potrebno te kode ustrezno načrtovati. Recept, ki ga uporabljamo pri
generiranju, se imenuje predponska lastnost (angl. prefix property). Ta lastnost zahteva, da
se koda, ki je ţe oddana, ne sme uporabiti kot predpona pri določanju kod drugim
simbolom.
3.3.1. Huffmanovo kodiranje
Huffmanovo kodiranje je zelo priljubljena metoda, ki jo je leta 1952 predstavil D.
Huffman [7]. Potencial metode se je pokazal v naslednjih letih, saj so jo intenzivno
raziskovali in nadgrajevali. Uporabili so jo v veliko programih, bodisi samostojno ali pa
kot korak v večnivojskem kodiranju. Sam princip kodiranja je zelo podoben Shannon-
Fanojevemu kodiranju, vendar je Huffmanovo kodiranje v splošnem učinkovitejše, saj daje
boljše kode, še posebej če so verjetnosti pojavitve simbolov blizu potencam števila 2 z
negativnimi celimi eksponenti. Do razlike v kodah pride zaradi načina generiranja kod, saj
se v Shannon-Fanojevem algoritmu kode generirajo od najbolj levega proti najbolj desnem
bitu (drevo se gradi od zgoraj navzdol), medtem ko Huffmanov algoritem gradi drevo od
spodaj navzgor, posledično pa se kode generirajo od najbolj desnega proti najbolj levemu
bitu. Pri obeh metodah (Huffman, Shannon-Fano) pa dobimo kode spremenljive dolţine, ki
izpolnjujejo lastnost predpone.
Kodiranje pričnemo s prebiranjem podatkov in generiranjem statistične tabele
simbolov [9]. Sledi korak urejanja statistične tabele glede na verjetnosti pojavitev simbolov
v datoteki. Tretji korak je sestavljanje drevesa, ki ga dobimo tako, da iz statistične tabele
18
vzamemo zadnja dva elementa z najmanjšima verjetnostima pojavitve. Z elementoma
zgradimo vozlišče, ki ga kot element z novo sešteto verjetnostjo vstavimo nazaj v
statistično tabelo. Še pred vstavljanjem vozlišča v tabelo je potrebno predhodno izbrana
elementa izbrisati iz statistične tabele. Jemanje dveh najmanj verjetnih elementov iz tabele
ponavljamo tako dolgo, dokler v tabeli ne ostane le en element, ki predstavlja naše končno
drevo. Za boljše razumevanje sledi v nadaljevanju primer gradnje takšnega drevesa. Za
primer bomo vzeli datoteko, ki vsebuje pet simbolov, katerih verjetnosti oz. števila
pojavitev so podane v tabeli 9. Potek gradnje drevesa pa je prikazan na sliki 6.
Tabela 9 : Huffmanovo kodiranje - statistična tabela
Simbol a b c d e
Verjetnost/Št.pojavitev 18/44 =0.41;
18
12/44=0.27;
12
6/44=0.13;
6
6/44=0.13;
6
2/44=0.05;
2
Slika 6: Gradnja Huffmanovega drevesa
19
Pri gradnji drevesa lahko naletimo na določene probleme. Največji problem je
zagotovo ta, da lahko dobimo za kratko vhodno sporočilo daljše kodirano sporočilo, saj je
pri Huffmanovem kodiranju potrebno posebej na izhod dodati simbole in pripadajoče
frekvence. Do problemov lahko pride tudi pri urejanju statistične tabele. Ta problem se
pojavi, če imamo v statistični tabeli več enakih verjetnosti in ne poznamo zaporedja, po
katerem smo verjetnosti uredili. Na ta problem smo naleteli tudi v primeru na sliki 6, kjer
imamo dve verjetnosti/št. pojavitev z vrednostjo 6. Na sliki 7 je prikazano, kako dodelimo
kode posameznim simbolom, v tabeli 10 pa imamo dobljene/generirane kode. Kode bi
lahko bile malo drugačne, če bi elemente z enakimi verjetnostmi pojavitve uredili drugače.
Da se izognemo takšnim teţavam, pa si določimo pravila urejanja oz. način izbiranja
elementov. Drug enostavnejši način pa je, da zraven simbolov zapišemo generirane
variabilne kode. Kot je razvidno iz tabele s kodami, je najdaljša koda dolga 4 bite. To
dolţino kode lahko poveţemo z globino drevesa, ki je v določenih algoritmih, ki
uporabljajo Huffmanovo kodiranje, zelo pomembna, saj se lahko globina omeji.
Zadnji korak pri Huffmanovem kodiranju je uporaba generiranih kod, ki so navedene v
tabeli 10, na vhodnih podatkih.
Slika 7: Huffmanovo drevo z kodami
Tabela 10 : Kode simbolov
Simbol a b c d E
Koda 1 01 001 0001 0000
Zakodirane vrednosti je potrebno odkodirati oz. dekodirati, za kar potrebujemo
algoritem, imenovan dekodirnik (angl. decoder). Kot smo ţe omenili, mora dekodirnik za
dekodiranje niza poznati drevo oz. kode posameznih simbolov. Zato je potrebno zraven
kodiranega sporočila poslati dekodirniku tudi statistično tabelo, iz katere si bo zgradil
drevo, ali pa tabelo z generiranimi variabilnimi kodami, s pomočjo katerih bo lahko
20
dekodirnik generiral izvorni niz. Ko imamo tabelo s kodami, prebiramo zakodiran niz bit
za bitom in pri tem spremljamo, v kateri del drevesa oz. lista nas bo koda prinesla.
Osnovni način Huffmanovega kodiranja pa so poskusili izboljšati, saj algoritem
zahteva dvojno delo. Najprej je potrebno generirati statistično tabelo in tvoriti drevo, šele
potem se izvede konkretno kodiranje. Z ţeljo po izboljšanju in pohitritvi Huffmanovega
kodiranja se je razvilo Huffmanovo kodiranje s prilagajanjem. Pri tem načinu se kodiranje
in generiranje drevesa izvajata istočasno. Izvajanje pričnemo s prazno statistično tabelo in
drevesom, ki se med branjem vhodnih simbolov prilagajata in dopolnjujeta. Vrednosti, ki
se v določenem trenutku ne nahajajo v drevesu, se preprosto zapišejo nekodirane. Te
vrednosti se nato vstavijo v tabelo, kjer se jim v primeru nove pojavitve dodeli koda.
Dekodirnik pri tem pozna določeno izhodno kodo (angl. escape code), ki mu pove, da je
naslednji simbol nekodiran. Ker pa se tekom kodiranja in dekodiranja spreminja tudi
drevo, je potrebno spreminjati tudi unikatno izhodno kodo, kar pa je manjša ovira, saj
preprosto dodelimo eno izmed še nedodeljenih kod. Ko kodirnik naleti na kodo, ki je ne
pozna, jemlje to kot ločilno kodo, za katero se nahajajo nekodirani simboli.
3.3.2. Aritmetično kodiranje
Druga popularna statistična metoda stiskanja podatkov je aritmetično kodiranje. Čeprav
je Huffmanovo kodiranje enostavno in učinkovito, pa ima tudi svoje slabosti. Optimalne
kode dobimo le ob verjetnostih pojavitev, ki so podobne potencam števila 2 z negativnimi
eksponenti ( ). Druga slabost Huffmanovega kodiranja je, da imajo
Huffmanove kode vedno celo število bitov, pri čemer pa prihaja do izgub. Za primer
poglejmo simbol z verjetnostjo 0,4, ki bi na podlagi osnovne entropijske enačbe teorije
informacij zahteval le - bita. V primeru Huffmanovega kodiranja bi se
dolţina kodiranega niza določila kot celoštevilska vrednost, zato bi se simbolu določila
koda dolţine oz. velikosti 1 ali pa 2 bita. Problem določanja celoštevilskih dolţin kod
uspešno obide aritmetično kodiranje, saj se celotni vhodni niz zakodira kot eno samo
realno število. Osnutke aritmetičnega kodiranja je v zgodnjih šestdesetih letih prejšnjega
stoletja predstavil Peter Elias [7]. Prve praktične implementacije pa so se pojavile v
osemdesetih ter devetdesetih letih prejšnjega stoletja (Rissanen, Pasco, Rubin, Moffat,
Witten) [7].
Aritmetično kodiranje zakodira celotno datoteko kot eno realno število, ki je z intervala
[0,1) [10]. Celoten postopek se prične z intervalom (spodnjo,zgornjo mejo), ki se
21
postopoma oţi glede na verjetnosti pojavitve simbolov, ki se pojavljajo na vhodu. Simboli
z večjimi verjetnostmi pojavitve imajo manjši vpliv na oţenje intervala, medtem ko
simboli z manjšimi verjetnostmi veliko bolj vplivajo nanj.
Kot je običajno za statističe metode kodiranja podatkov, je prvi korak določanje
verjetnosti pojavitev posameznih simbolov. Če ţelimo izkoristiti najboljše zmogljivosti, ki
jih ponuja ta algoritem, je potrebno določiti natančne verjetnosti posameznih simbolov v
datoteki. To pa lahko naredimo le, če izvedemo predhodno branje in pri tem generiramo
potrebno statistiko. Zatorej je v večini primerov aritmetično kodiranje dvoprehodno. To pa
pomeni, da izvedemo dve branji datoteke. Moţne so tudi enoprehodne rešitve, kjer
pribliţno (»čez palec«) in na podlagi izkušenj določimo statistiko ali pa uporabimo
dinamično aritmetično kodiranje, kar pa pomeni hitrejše delovanje in skoraj enako končno
velikost stisnjene datoteke. Dinamično aritmetično kodiranje je v osnovi podobno
Huffmanovemu kodiranju s prilagajanjem, saj tudi tukaj gradimo statistično tabelo sproti.
Da bolje ponazorimo delovanje algoritma, ga bomo predstavili s krajšim primerom.
Denimo, da ţelimo zakodirati niz »MISS HEISS«. V prvem koraku bi zgradili statistiko,
kot je prikazano v tabeli 11.
Tabela 11 : Statistika - aritmetično kodiranje
simbol število pojavitev
simbola
verjetnost interval
S 4 4/10 = 0,4 [0-0,4)
I 2 2/10=0,2 [0,4-0,6)
M 1 1/10=0,1 [0,6-0,7)
H 1 1/10=0,1 [0,7-0,8)
E 1 1/10=0,1 [0,8.-0,9)
presledek 1 1/10=0,1 [0,9-1,0)
Ko imamo generirano statistiko, je le-to potrebno še pred izvajanjem kodiranja zapisati
na izhod oz. v datoteko. Zapisu simbolov in verjetnosti sledijo stisnjeni podatki. Še preden
se lotimo stiskanja, je potrebno ustrezno kalibrirati (nastaviti) kodirnik (angl. coder). Pri
aritmetičnem kodiranju zakodiramo vhod kot realno število z intervala [0,1), zato je
potrebno inicializirati spodnjo (angl. low) in zgornjo (angl. high) mejo intervala. Vrednosti
mej se za potrebe našega primera in laţjega razumevanja inicializirajo na 0 oz. 1.
Konkretna implementacija kodirnika bo predstavljena v poglavju 4.3 in bo malo drugačna,
saj v računalnikih ne poznamo realnih števil z neskončno natančnostjo. Spodnja in zgornja
meja se v kodirniku nenehno, glede na verjetnosti prebranih simbolov, spreminjata.
22
Spreminjanje je določeno z enačbama, navedenima v nadaljevanju, pri čemer je
spremenljivka velikost dolţina trenutnega intervala in se določi kot zgornja_meja –
spodnja_meja. Vrednosti zgornja_meja(simbol) in spodnja_meja(simbol) predstavljata
zgornjo in spodnjo mejo intervala, ki smo ju določili v času priprave statistike. Celoten
postopek kodiranja niza »MISS HEISS« je predstavljen v tabeli 12.
Tabela 12 : Primer aritmetičnega kodiranja
Simbol spodnja meja zgornja meja
/ 0.0 1.0
M 0.0 + (1.0 * 0.6) = 0.6 0.0 + (1.0 * 0.7) = 0.7
I 0.6 + (0.1 * 0.4) = 0.64 0.6 + (0.1 * 0.6) = 0.66
S 0.64 + (0.02 * 0.0) = 0.64 0.64 + (0.02 * 0.4) = 0.648
S 0.64 + (0.008 * 0.0) = 0.64 0.64 + (0.008 * 0.4) = 0.6432
presledek 0.64 + (0.0032 * 0.9) = 0.64288 0.64 + (0.0032 * 1.0) = 0.6432
H 0.64288 + (0.00032 * 0.7) = 0.643104 0.64288 + (0.00032 * 0.8) = 0.643136
E 0.6431296 0.6431328
I 0.64313088 0.64313152
S 0.64313088 0.643131136
S 0.64313088 0.643130982
Kot vidimo iz primera v tabeli 12, bo končna koda, ki se bo zapisala v datoteko, lahko
poljubno število med 0.64313088 in 0.643130982. Tako smo niz »MISS HEISS« pretvorili
v število 0.6431309. Na sliki 8 je še grafično ponazorjeno oţenje intervala, ki se izvaja
med kodiranjem.
Slika 8: Postopek aritmetičnega kodiranja
Zakodiran niz je potrebno tudi dekodirati. Podobno kot pri kodiranju je tudi pri
dekodiranju prvi korak generiranje statistike, vendar jo tukaj preprosto preberemo iz glave
23
datoteke. Iz prebrane statistike generiramo ustrezne intervale oz. verjetnosti, ki pripadajo
posameznim simbolom. S tako pripravljenimi podatki lahko iz zakodiranega števila
generiramo originalno zaporedje simbolov. Postopek se izvaja podobno kot pri kodiranju,
kar pomeni da iz zakodiranega števila tvorimo novo število, ki pa ne vsebuje vpliva
predhodno dekodiranega simbola. To število nam nato pade v nov interval generirane
statistike. Postopek odstranjevanja vpliva simbola se nato ponovi. Če za primer vzamemo
zakodirano število 0.6431309, potem lahko hitro ob pogledu v tabelo 11 ugotovimo, da
kodirano število pade v interval [0.6-0.7), kar predstavlja simbol »M«. V naslednjem
koraku je potrebno iz zakodiranega števila in simbola, ki ga pridobimo, določiti novo
število, ki ne bo več imelo vpliva simbola »M«. To število nam bo določalo nov interval in
s tem nov simbol. Izluščimo ga z naslednjo enačbo:
V našem primeru bi dobili naslednjo enačbo: . Ugotovimo,
da to število spada v interval simbola »I«. Tako smo do sedaj odkodirali niz »MI«. Če bi ta
postopek nadaljevali, bi odkodirali še preostanek niza »MISS HEISS«.
3.4. Napovedovalni algoritmi
Napovedovalne algoritme bi lahko prav tako uvrstili med statistične, saj prav tako
uporabljajo statistiko za napovedovanju naslednjih vrednosti. Med te algoritme lahko
štejemo PPM (angl. Prediction by Partial Matching) in DMC (angl. Dynamic Markov
Compression) [8]. Oba sta si zelo podobna. Razlika je predvsem v tem, da se pri DMC
določi oz. napove naslednji bit, pri PPM pa se napove naslednji simbol.
24
4. IMPLEMENTACIJA PROGRAMA
Po raziskovanju in pregledu področja smo se odločili, da bi bilo za kodiranje podatkov
LIDAR najprimernejše aritmetično kodiranje, saj za določen simbol porabi ravno toliko,
kolikor bi naj na podlagi osnovne entropijske enačbe teorije informacij in nič več.
Implementacija aritmetičnega kodirnika je precej zahtevna, saj lahko nepazljivost oz.
napaka vzame kar veliko časa, preden jo zaslediš. V podpoglavju 4.3 bomo predstavili
podroben opis implementacije aritmetičnega kodirnika, ki ga je predlagal Ian H. Witten
[11]. Aritmetični kodirnik sam zase ni tako nerazumljiv, izziv pa je predvsem to, da
računalnik ne zmore predstavitve realnega števila z neskončno natančnostjo. Drugi, nič
manj pomemben del naloge je priprava podatkov, ki jih bomo podali kodirniku oz. jih
aritmetični kodirnik generira v prvem prehodu. Kodirajo se namreč števila, katerih je kljub
končni aritmetiki računalnika zelo veliko, zato je potrebno dobro omejiti nabor števil oz.
simbolov, ki se pojavijo v datoteki. Ta del algoritma je zelo pomemben, saj bo lahko
implementiran aritmetični kodirnik ugodneje zakodiral podatke, če bo aritmetični model
ugoden. Program je implementiran v okolju Visual Studio 2008 in v jeziku
C++/MFC(angl. Microsoft Foundation Classes).
4.1. Nalaganje datoteke LAS in razred LasFile
Predpogoj za ustrezno delovanje algoritma in aplikacije je nalaganje oz. branje
podatkov iz datoteke LAS. Formati datotek LAS, ki jih implementirana knjiţnica podpira,
so 1.0, 1.1 in 1.2 .
Datoteka LAS je načrtovana tako, da je kar najenostavnejša za obdelavo, zaradi česar
pa je datoteka zelo velika, saj so podatki, podobno kot pri slikah v datotekah BMP,
shranjeni enostavno in neoptimalno. Za branje smo implementirali knjiţnico oziroma
razred LasReader, ki omogoča branje točko po točko ter hitrejšo moţnost, kjer preberemo
25
večjo količino podatkov naenkrat, s tem pa zmanjšamo potrebno število dostopov do diska.
V aplikaciji ima osrednjo vlogo razred LasFile, ki ga prikazuje naslednji blok.
Razred vsebuje standardne metode, kot so OpenLasFile, katere namen je odpiranje
datoteke LAS ter pripravljanje vsega potrebnega za branje datoteke. Druga pomembna
class LasFile
{
public:
LasFile(void);
~LasFile(void);
Las_GL_Points GetOpenGLLasPoints(char* szFileName, int point_count =
3000000);
// Vrne točke, ki jih lahko prikažemo z OpenGL.
int SaveLasFile(char* szFileName);
// Shrani trenutno odprto datoteko LAS.
bool ZipLasFile(char* szFileNameOrg, char* szFileNameZip, int mode, HWND
p_hWnd = NULL);
// Funkcija stisne datoteko LAS.
bool UnZipLasFile(char* szFileNameZip, char* szFileNameOrg, int mode, HWND
p_hWnd = NULL);
// Funkcija odpakira stisnjeno datoteko LAS.
private:
bool CompressLasFile(LASReader& reader, char* szFileNameZip, HWND p_hWnd =
NULL);
// Metoda stisne datoteko.
bool DeCompressLasFile(LASReader& reader, char* szFileNameOrg, HWND p_hWnd
= NULL);
// Metoda odpakira datoteko.
LAS_GL_POINT ReturnGLPoint(int offsett, LASReader* reader);
// Vrne oz. prebere eno točko.
bool OpenLasFile(char* szFileName,LASReader* reader, int& point_format);
// Odpre navadno datoteko LAS.
bool GetMaxDifferences(LASReader& reader, DiffPoint& differ);
// Funkcija vrne točko, v kateri so navedene maksimalne razlike med
sosednjimi točkami.
public:
int CompareLasFile(char* szFileName1, char* szFileName2, HWND p_hWnd =
NULL);
// Funkcija poišče razlike med datotekama LAS.
LAS_Header GetLasFileInfo(char* szFileName);
// Funkcija vrne podatke - glavo datoteke LAS.
bool WriteCumulativeValues(LasPointModel &p_model, LASWriter &zip_file);
// V datoteko zapišemo frekvence pojavitev znakov.
bool CodeLasPoint(ArithmeticCoder &coder, LasPointModel &model, DiffPoint
¤t_diff);
// Funkcija zakodira novo točko v stisnjeno datoteko.
void ReadCumulativeValues(LasPointModel &model, LASReader &reader);
// Funkcija prebere frekvence simbolov.
bool CodeEndPoint(LasPointModel & model, ArithmeticCoder& coder);
// Zapišemo končno točko (predvsem zato,da lepo zaključimo aritmetični
kodirnik).
int GetBestHistoryItem(CAverage& p_history, int p_diff);
// Vrne indeks najboljšega elementa iz zgodovine predhodnih točk.
};
26
metoda je CompareLasFile, ki primerja dve datoteki LAS in je bila zelo pomembna pri
razvoju algoritma. Ta metoda je zagotovo potrebna, saj v programu potrebujemo način
preverjanja enakosti datotek, s čim potrdimo pravilno in brezizgubno delovanje našega
algoritma. Tukaj bi bilo mogoče uporabiti ţe pripravljena orodja, vendar smo ţeleli
kompaktno aplikacijo, ki bo med drugim podpirala tudi to enostavno nalogo. Funkcija
»GetOpenGLLasPoints« je namenjena za preprosto vizualizacijo datoteke LAS. Kot smo
napisali, vsebuje datoteka LAS veliko število točk, kar onemogoča nalaganje in prikaz
vseh točk, zato ta funkcija, če ni specificirano drugače, vrne okrog 3 milijone točk. Takšno
zalogo točk z veliko verjetnostjo prikaţe vsak sodoben računalnik. Dosedanje funkcije so
bile pomembne za ogrodje naše aplikacije, niso pa glavne v algoritmičnem smislu. Glavni
funkciji, ki predstavljata naš algoritem, sta »CompressLasFile« in »DecompressLasFile«,
ki dejansko kodirata in dekodirata ţeleno datoteko. Funkcijo kodiranja bomo podrobneje
opisani v podpoglavju 4.3.
4.2. Algoritmi napovedovanja vrednosti
Priprava podatkov je v večini algoritmov ključnega pomena, saj omogoča hitrejše
delovanje algoritma, je pa zato sama priprava podatkov običajno časovno potratna.
Problem, ki se je pojavil, je, da imamo opravka s celimi in realnimi števili. Pri delu z
realnimi števili je potrebno biti še posebej pazljiv, saj niso vsi procesorji narejeni po istem
kopitu, to pa lahko za sabo potegne nezaţelene napake pri zaokroţevanju. Drugi razlog,
zakaj realnim številom posvečamo toliko pozornosti, je njihova velikost, saj ta števila v
primerjavi s celimi zasedejo enkrat več prostora.
Ker toliko omenjamo realna števila, pa začnimo z njimi. Realno število je veliko 8
zlogov (64 bitov), kar je v primerjavi z ostalimi elementi v strukturi točke, veliko in prav
tukaj je potencial, da bi izdatno zmanjšali velikost elementa. Na sliki 10 je prikazana
struktura realnega števila po standardu IEEE 754, ki je uporabljen v datoteki LAS [12]. Pri
realnih številih imamo predznak, eksponent in mantiso. V algoritmu smo realna števila
razdelili na posamezne dele. S tem smo dobili samo cela števila. Pri računanju z njimi pa
ne vnašamo napak, kot se lahko zaradi zaokroţevanja zgodi pri realnih številih.
Slika 9: Predstavitev realnega števila po standardu IEEE 754
27
Realna števila torej razbijemo na osnovne gradnike, s tem pa imamo v datoteki sama
cela števila [13]. Še vedno pa teţava ostaja, saj je tudi celih števil, ki jih lahko predstavimo
z računalnikom, zelo veliko. Števila je zato potrebno nekako omejiti in zmanjšati njihovo
raznolikost. Če se spomnimo, tehnologija LIDAR deluje tako, da zaporedno prebira
vrednosti, ki jih shrani v datoteko. To pomeni, da so si zaporedni podatki večinoma zelo
podobni in bi lahko s preprostim odštevanjem dobili razlike, ki bi jih zakodirali. Ta rešitev
je tudi osnova za naš algoritem. S samim odštevanjem in aritmetičnim kodirnikom smo bili
performančno nekoliko slabši kot sistem za arhiviranje RAR. Vendar je bil naš namen
izdelati specifični kodirnik, ki naj bi se obnesel bolje od splošnonamenskih rešitev, kot je
RAR, saj bi bil naš trud drugače nesmiseln. Rezerve za izboljšave algoritma smo našli pri
načinu napovedovanja naslednjih vrednosti.
Na področju stiskanja geometrijskih podatkov, kamor lahko štejemo tudi točke, ki jih
pridobimo s tehnologijo LIDAR, je bilo objavljenih veliko člankov ki opisujejo načine
stiskanja. V nekaterih člankih se zatečejo k napovedovanju naslednjih vrednosti, kar pa v
večini ni tako zelo preprosto. Ena izmed bolj preprostih metod je linearni napovedovalnik,
pri katerem računamo razlike med napovedano in dejansko vrednostjo, shranimo pa vektor
razlike. Kot ţe samo ime metode pove, uporabimo linearno napovedovalno shemo. Med
zelo uporabljenimi shemami na tem področju je tudi paralelogramski napovedovalnik,
znan tudi pod imenom napovedovalnik Lorenzo [14, 15]. Primer delovanja
paralelogramskega napovedovalnika je prikazan na sliki 10. Med preproste
napovedovalnike lahko štejemo tudi naše izhodišče, se pravi računanje razlik med
zaporednimi točkami, ki je znano tudi pod imenom kodiranje delta (angl. delta-coding)
[16]. Nekoliko prilagojeno kodiranje delta, kjer s predhodnima točkama napovemo tretjo in
zakodiramo razliko med dejansko in napovedano vrednostjo, smo uporabili tudi v našem
algoritmu. Primer je prikazan na sliki 11.
28
Slika 10: Paralelogramska napoved
Slika 11: Kodiranje delta
V splošnem lahko napovedujemo vrednosti oz. simbole, ki imajo nek smiseln potek,
kar pa je v primeru točk v datoteki LAS očitno, saj so točke zajete zaporedno in so si zelo
podobne. Pod podobne mislimo na to, da bo razlika med zaporednima koordinatama x v
točkah majhna. Podobno velja tudi za koordinati y in z. To pa je zadosten razlog, zakaj so
predhodno omenjeni načini napovedovanja točk primerni in uporabni. V poglavju 2.1.1
smo predstavili vzorce zajemanja točk, kar lahko izkoristimo tudi za napovedovanje
29
vrednosti. V algoritmu je največji potencial, če bi napovedovali koordinate x, y in z ter čas
GPS. Če pogledamo format zapisa točk 1, predstavljen v poglavju 2.2, potem vidimo, da te
štiri komponente zasedejo 20 od skupno 28 zlogov. To pa je dobrih 70 % celotne strukture
posamezne točke in ravno pravšnje mesto, da prihranimo kar največ moţnega prostora. Da
bi povečali stopnjo stiskanja, se nekatere komponente v posameznih točkah napovedujejo.
Za koordinato x ne moremo uporabiti napovedovanja, ker ne vemo, kje se točka nahaja.
Zato smo pri tem elementu in ostalih elementih, ki jih ne napovedujemo, omejeni na
računanje razlik. Teh razlik ne računamo z enačbo:
,
kjer je p1 trenutna točka in p2 predhodna točka. V algoritmu je uporabljena druga enačba,
ki daje boljše rezultate:
.
V tej enačbi sta p1 in p2 trenutna in predhodna točka, p3 pa je predhodnik točke p2.
Ker za računanje koordinate x nismo ţeleli uporabiti osnovne razlike, smo tukaj dodali
malo izboljšavo, ki je mogoča zaradi zaporednega zajemanja podatkov in gibanja leče
laserja po nekem vzorcu. Ker pa so ti vzorci lahko različni, napovedovanja po teh vzorcih
nismo uporabiti ţe pri koordinati x, saj v datoteki nikjer ni navedeno, po kakšnih tirnicah
se je zrcalo laserja premikalo. Izkoristimo pa lahko razlike med točkami, ki so precej
konstantne. Računanje koordinate x je izvedeno tako, da v kroţno vrsto zapisujemo razlike
in nato vrnemo povprečno razliko. Da bi izničili vpliv redkih skokov, se pri računanju
povprečne vrednosti odstranita najmanjša in največja vrednost razlike. Dobljeno povprečno
razliko primerjamo z dejansko razliko med trenutno in predhodno točko.
Zato pa lahko gibanje laserske leče izkoristimo pri koordinati y in poskušamo vrednost
napovedati. Pri tem si lahko pomagamo s koordinato x, ker se točke zajemajo po
določenem vzorcu (najpogosteje sinusuida), in lahko tako iz koordinate x precej natančno
določimo koordinato y. To naredimo tako, da iz zgodovine predhodnih razlik koordinat x
poiščemo dve takšni razliki, ki sta kar najbolj podobni trenutni razliki x. Nato s pomočjo
teh dveh točk tvorimo enačbo premice y = kx + n. V to enačbo premice vstavimo trenutno
razliko koordinate x. Kot rezultat dobimo napoved razlike koordinate y. Primer delovanja
napovedovanja je prikazan na slikah 12 in 13. Na sliki 12 vidimo relacijo med razlikami
koordinat x in razlikami koordinat y, ki so zaradi načina zajemanja in gibanja leče urejene
v vzorec cikcak (sinusuida). Izmed razlik, ki jih hranimo v zgodovini, izberemo dve, ki sta
najbliţje glede na razliko x (zeleni točki, v spodnjem delu slike). Na podlagi teh dveh točk
tvorimo enačbo premice. V enačbo premice vstavimo trenutno razliko koordinate x, kot
30
rezultat pa dobimo pribliţno napoved razlike koordinate y. Zakodira se razlika, kot je
prikazano na sliki 13.
Slika 12: Napovedovanje koordinate y
31
Slika 13: Zakodirana razlika y
Kot je razvidno s slike, so razlike po koordinati y majhne, s tem pa se omejimo na zelo
malo število števil oz. simbolov v primerjavi z izvorno datoteko.
Koordinate z pa ni mogoče napovedati tako lahko. Teren je lahko zelo razgiban, kar
pomeni, da se koordinata z zelo hitro spreminja in povzroči slabšo stiskanje podatkov. Zato
smo se tudi pri napovedovanju koordinate z zatekli k uporabi geometrije. Uporabili smo ţe
zakodirani koordinati x in y, ki ju vstavimo v enačbo ravnine, generirano iz predhodnih
treh točk, iz katere dobimo napoved za višino oziroma koordinato z. To napoved lahko
enačimo s paralelogramsko napovedjo, vendar tukaj ne potrebujemo triangulacije. Le-ta bi
bila neprijetna, saj imamo opravka z veliko količino točk , kar bi vsekakor upočasnilo
delovanje algoritma stiskanja, pa četudi bi imeli še tako učinkovit algoritem triangulacije.
Torej s pomočjo predhodnih treh točk izračunamo ravnino, ki nam sluţi za osnovo pri
napovedovanju. Uporabimo enačbo ravnine:
Ax + By + Cz + D = 0,
pri čemer se vrednosti A, B, C in D izračunajo z naslednjimi enačbami.
S takšnim napovedovanjem koordinate z, dokaj natančno napovemo višino, saj pri tem
upoštevamo bliţnji relief oz. površje. Na sliki 14 je prikazan praktični primer takšnega
napovedovanja. V primeru, da so točke kolinearne (točke so na premici in ne moremo
določiti ravnine), se koordinata zakodira kot navadna razlika, enako kot pri koordinati x.
32
Slika 14: Napovedovanje s pomočjo ravnine
Za napovedovanje in računanje vrednosti smo implementirali štiri razrede. To so razred
DiffPoint, katerega osnovni namen je, da izračuna razliko med dvema zaporednima
točkama. Razreda Average in History sta si zelo podobna in se uporabljata pri
napovedovanju koordinat x in y. Oba imata implementirano kroţno vrsto, v katero
dodajamo predhodno zakodirane elemente. Če je določen element ţe v vrsti, ga
pomaknemo na začetek, če pa ga še ni v vrsti, ga dodamo na začetek vrste, pred tem pa
odstranimo najstarejši oz. zadnji element v vrsti. Kot smo ţe omenili, se povprečje računa
tako, da se ignorirata najmanjša in največja razlika, ki bi lahko slabo vplivali na
napovedovanje vrednosti. Za računanja omenjenega povprečja, ki se uporablja pri
koordinati x, je v programu uporabljen razred Average. Razred History pa se uporablja pri
napovedovanju koordinate y in nam sluţi kot shramba, iz katere poiščemo najbliţja
elementa, ki ju uporabimo za tvorjenje premice. Zadnji razred iz tega sklopa je Plane, ki
predstavlja geometrijsko ravnino, s katero napovemo koordinato z. V nadaljevanju je
implementiran preprost algoritem napovedovanja vrednosti.
difference = difference.Diff(p_pre_point, pre_point);
average.InsertValue(difference);// Povprečje razlik
// Zgodovina razlik
history.InsertNewValueX(difference);
history_predict.InsertValue_X(difference);
33
history_mantisa.InsertValue_Man(difference);
// Na podlagi predhodnih treh točk generiramo ravnino.
plane.GeneratePlane(pre_point.m_x - min_x, pre_point.m_y- min_y,
pre_point.m_z - min_z, p_pre_point.m_x - min_x, p_pre_point.m_y- min_y,
p_pre_point.m_z - min_z, pp_pre_point.m_x - min_x, pp_pre_point.m_y-
min_y, pp_pre_point.m_z - min_z);
int z = plane.EstimateHeight(cur_point.m_x - min_x, cur_point.m_y -
min_y); // Na podlagi (x,y) ter enačbe ravnine določimo višino z.
if(z!=-1)
{
z_point.m_z = z + min_z;
curr_diff = z_difference.Diff(z_point, cur_point).m_z;
}
difference = average.GetAverage(); // Povprečje razlik predhodnih točk
current_t = current_t.Diff(pre_point,cur_point); // trenutna razlika
//Na podlagi x izberemo najbližji element iz zgodovine.
selected_hist_item = history.GetNearestDiff(current_t.m_x);
e_difference = history.GetDifference(selected_hist_item);
//Na podlagi x napovemo točko.
predict = history_predict.PredictValue(current_t.m_x);
current = difference - current_t; // Povprečje - trenutna
e_current = e_difference - current_t; // Približek - trenutna
p_current = predict - current_t; // Napovedan - trenutna
DiffPoint man;
man = history_mantisa.GetNearXYPoint(current_t.m_x, current_t.m_y);
DiffPoint m_current = man - current_t;
current_differance = current_t;
current_differance.m_x = current.m_x;
current_differance.m_y = p_current.m_y;
current_differance.m_z = e_current.m_z;
current_differance.m_sign = m_current.m_sign;
current_differance.m_exponent = m_current.m_exponent;
current_differance.m_mantisa = m_current.m_mantisa;
if(z!=-1)
current_differance.m_z = curr_diff;
pp_pre_point = p_pre_point;
p_pre_point = pre_point;
pre_point = cur_point;
V implementiranem algoritmu napovedovanja vrednosti se uporabljajo različne metode
napovedovanja. Za nekatere elemente uporabljamo razliko zaporednih elementov,
povprečje, izpeljanko paralelogramskega napovedovanja in kodiranja delta. Te metode so
dokaj enostavne, kar pomeni tudi, da časovno niso zahtevne in nam tako ne upočasnijo
izvajanja algoritma.
34
4.3. Implementacija aritmetičnega kodirnika
Aritmetično kodiranje je enostavno za razumevanje, pri implementaciji pa se lahko
hitro kaj zatakne. Implementirani aritmetični kodirnik je narejen po navodilih, ki jih je
predstavil Ian H. Witten [11]. Večina in tudi ta aritmetični kodirnik mora simulirati
aritmetiko, kot jo poznamo iz matematike, s končno aritmetiko računalnika. Postopek
kodiranja je zelo podoben osnovni razlagi. Najprej določeni interval razdelimo na
podintervale. Izmed teh podintervalov izberemo na podlagi novega simbola nov interval z
neko velikostjo. V naslednjem koraku bi ta podinterval delili naprej na podintervale. Ker
pa imamo končno natančnost, je potreben postopek ponovne normalizacije, saj slej ko prej
pridemo do takšnega zmanjšanja intervala, da določenega podintervala ne moremo deliti
naprej na manjše podintervale. Za primer lahko vzamemo interval, ki je velik 10 enot,
moramo pa ga razdeliti na 11 podintervalov. Pred delitvijo je potrebno izvesti postopek
normalizacije, ki poskrbi za to, da imamo dovolj velik interval, da ga bomo lahko v
naslednjem koraku razdelili na več podintervalov. Po končanem kodiranju je potrebno
zakodirati znak EOF (angl. End of File), ki nam predstavlja konec niza simbolov. Zraven
aritmetičnega kodirnika potrebujemo aritmetični model oz. statistiko, ki jo generiramo v
prvem branju datoteke oz. vhoda. Ker delamo z različnimi podatki, je razred aritmetičnega
modela implementiran kot šablona, kar nam prihrani nepotrebno podvajanje kode, saj se
statistika za vsak element generira na enak način. Da bolje ponazorimo osnovno delovanje,
je v nadaljevanju naveden psevdokod kodiranja in dekodiranja posameznega simbola.
Intervali so tukaj predstavljeni kot kumulativne frekvence, saj bi bilo nesmiselno hraniti
spodnjo in zgornjo mejo za posamezen simbol. Kumulativna frekvenca je seštevek
verjetnosti pojavitve do posameznega simbola. Posamezna kumulativna frekvenca v
aritmetičnem kodirniku predstavljala spodnjo mejo intervala simbola, ki je hkrati tudi
zgornja meja predhodnega intervala simbola. Tako s hranjenjem samo spodnje meje
(namesto spodnje in zgornje) prihranimo pri pomnilniku, ki bi ga sicer potrebovali pri
izvajanju.
kumulativne_frekvence // Intervali simbolov.
zgornja_meja // Zgornja meja aritmetičnega kodirnika.
spodnja_meja // Spodnja meja aritmetičnega kodirnika.
Funkcija zakodiraj_simbol(simbol, kumulativne_frekvence)
{
35
velikost_intervala = zgornja_meja – spodnja_meja;
zgornja_meja = spodnja_meja + velikost_intevala * kumulativne_frekvence[simbol - 1];
spodnja_meja = spodnja_meja + velikost_intervala * kumulativne_frekvence[simbol];
Ponovna_normalizacija();
}
vrednost; // Vrednost, ki jo moramo dekodirati in iz katere moramo odstraniti vpliv
predhodno zakodiranega simbola.
št_simbolov; // Število različnih simbolov, ki so zakodirani.
kumulativne_frekvence // Intervali simbolov.
zgornja_meja // Zgornja meja aritmetičnega dekodirnika.
spodnja_meja // Spodnja meja aritmetičnega dekodirnika.
Funkcija odkodiraj_simbol(kumulativne_frekvence)
{
// Poišče indeks simbola, kateremu pripada trenutno zakodirana vrednost. Pri tem
primerjamo vrednost z vsemi možnimi intervali simbolov.
For simbol =0; simbol <št_simbolov; simbol=simbol+1;
{
kumulativne_frekvence[simbol] ≤ (vrednost - spodnja_meja)/(zgornja_meja-
spodnja_meja)< kumulativne_frekvence[simbol-1]
}
velikost_intervala = zgornja_meja – spodnja_meja;
zgornja_meja = spodnja_meja + velikost_intervala * kumulativne_frekvence[simbol -1];
spodnja_meja = spodnja_meja + velikost_intervala* kumulativne_frekvence[simbol]
Ponovna_normalizacija();
}
Postopek normalizacije skrbi za to, da imamo vedno dovolj velik interval [10]. Koda
implementiranega postopka normalizacije je navedena v nadaljevanju. Normalizacija
deluje tako, da primerja zgornjo in spodnjo mejo. Če sta meji blizu, potem to pomeni, da
bomo morali interval nekako razširiti. To tudi pomeni, da so vodilni biti pri bitni
predstavitvi zgornje in spodnje meje enaki. Identične bite zapišemo na izhod oz. v
datoteko.
Širjenje intervala je moţno izvesti na tri različne načine. V prvem pošljemo na izhod
ničlo, v drugem pošljemo na izhod ena, v tretjem pa na izhod ne pošljemo ničesar, ampak
samo skaliramo interval. Če sta na primer vrednosti spodnje in zgornje meje manjši od
polovice maksimalne velikosti intervala, potem imata spodnja in zgornja meja intervala
prva bita zagotovo enaka. Bolj nazoren primer s števili v bitni obliki je prikazan v tabeli
13. Konkreten primer širjenja intervala in postopek ponovne normalizacije sta prikazana na
sliki 15.
36
void ArithmeticCoder::EncoderNormalize(void)
{
for(;;)
{
if(m_high < HALF) // m_high in m_low imata prvi bit 0
BitPlusFollow(0);
else if(m_low >= HALF) // m_high in m_low imata prvi bit v številu
1
{
BitPlusFollow(1);
m_low -= HALF;
m_high -= HALF;
}
// Bita sta različna
else if(m_low >= FIRST_QTR && m_high < THIRD_QTR)
{
m_opposite_bits++;
m_low -= FIRST_QTR;
m_high -= FIRST_QTR;
}
else break; // Skočimo iz zanke
// Povečamo interval
m_low = m_low * 2;
m_high = m_high * 2 + 1;
}
}
Tabela 13 : Postopki pri ponovni normalizaciji
Način
širjenja
intervala
Akcija spodnja meja zgornja meja
1 Spodnja in zgornja meja sta manjši
od polovice maksimalne velikosti
intervala. V tem primeru na izhod
pošljemo 0. Temu je tako, ker sta
prva bita spodnje in zgornje meje
enaka.
00000000 – 0 01010100 - 84
2 Širimo interval in na izhod ne
pošljemo ničesar.
01010101 - 85 10101010 - 171
3 Spodnja in zgornja meja sta večji od
polovice maksimalne dolţine
intervala. V tem primeru na izhod
pošljemo 1, ki predstavlja prvi bit
tako v spodnji kot v zgornji meji.
10101011 - 171 11111111 - 055
37
Slika 15: Normalizacija
4.4. Struktura stisnjene datoteke
Struktura datoteke LAS je bila predstavljena v poglavju 2.2. Struktura naše stisnjene
datoteke pa je zelo podobna osnovni datoteki LAS. Ker je velikost originalne glave v
primerjavi s točkami zanemarljiva, smo pustili glavo in zapise spremenljive dolţine v
nespremenjeni obliki. Tem podatkom sledi logični blok, v katerem je shranjena statistika in
vsebuje simbole ter intervale obstoječih simbolov, ki jih dobimo iz aritmetičnega modela
in so nujno potrebni za uspešno dekodiranje datoteke. Za simboli in intervali simbolov se
nahaja četrti in tudi zadnji blok, kjer so stisnjene točke. Strukturo stisnjene datoteke LAS
vidimo v tabeli 14.
Tabela 14 : Struktura stisnjene datoteke
Glava
Zapisi spremenljive dolţine
Simboli in intervali simbolov
Stisnjene točke
Prvi, drugi in tretji blok so zapisani v orginalni obliki brez uporabe algoritmov
stiskanja. Četrti blok hrani stisnjene točke, ki jih lahko z aritmetičnim dekodirnikom
dekodiramo in povrnemo v izvorno stanje. Struktura prvega in drugega bloka je znana ţe iz
poglavja 2.2, kjer smo opisali format binarne datoteke LAS. V tretjem bloku imamo
zapisane simbole in pripadajoče intervale simbolov. Ta blok je zelo odvisen od formata
38
točk, saj se za vsak element iz posamičnega formata generirajo simboli in pripadajoče
frekvence. Če bi ţeleli stisniti datoteko, ki vsebuje točke v formatu 0, potem bi bila
struktura tretjega bloka takšna, kot je prikazano v tabeli 15. Za vsak element (x, y, z,
intensity, ...) je generirana ločena statistika. Pred statistiko je navedeno še število simbolov,
ki jih imamo za določen element. Sledijo pa simboli in pripadajoči intervali simbolov.
Tabela 15: Simboli in intervali simbolov
št. simbolov za komponento x
simbol 0 interval simbola
... ...
simbol n interval simbola
št. simbolov za komponento y
simbol 0 interval simbola
... ...
simbol n interval simbola
št. simbolov za komponento z
simbol 0 interval simbola
... ...
simbol n interval simbola
št. simbolov za intenziteto
simbol 0 interval simbola
... ...
simbol n interval simbola
....
št. simbolov za User Data
simbol 0 interval simbola
... ...
simbol n interval simbola
št. simbolov za Point Source ID
simbol 0 interval simbola
... ...
simbol n interval simbola
4.5. Vizualizacija podatkov LIDAR
V diplomski nalogi smo izdelali tudi preprost prikazovalnik podatkov iz datotek,
pridobljenih s tehnologijo LIDAR. Sama vizualizacija je implementirana s pomočjo
programskega vmesnika OpenGL (angl. Open Graphics Library) [17], ki omogoča
prikazovanje 2D oz 3D računalniške grafike. Vmesnik je sestavljen iz več kot 250 različnih
funkcij, ki omogočajo, da s pomočjo osnovnih gradnikov izrišemo sceno. Produkt je
razvilo podjetje SGI (Silicon Graphics Incorporated) leta 1992 in je med najbolj
uporabljenimi knjiţnicami za vizualizacijo. V naši aplikaciji je bilo uporabljene le nekaj
osnovne funkcionalnosti. Ker je v datotekah LAS veliko točk, je temu potrebno prilagoditi
39
tudi izris točke. Zato se v aplikaciji vedno izriše točno takšno število točk, kot ga
navedemo (privzeto okrog 3 milijone točk).
Za vizualizacijo je potrebno inicializirati področje, ki nam bo sluţila kot platno za izris
podatkov LIDAR. V inicializaciji postavimo osnovne nastavitve, kot so npr. velikost okna,
barva ozadja, luči, ...
V metodi za izris so bili uporabljeni naslednji ukazi OpenGL:
void glBegin() – funkcija, ki določa pričetek kode za izris. Ta metoda ima
vhodni argument, ki ji pove, kaj bo morala izrisati. Le-ta je lahko
GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, .... V našem
primeru smo uporabili GL_POINTS, saj izrisujemo točke LIDAR.
void glEnd() – funkcija, ki v programu zaključuje kodo za izris.. Ta funkcija
mora biti klicana za vsak primerek funkcije glBegin().
vodi glColor3f(glFloat red, glFloat green, glFloat blue) – s funkcijo nastavimo
barvo izrisa elementov po tem ukazu. Barvo nastavljamo v sistemu RGB.
Zraven treh parametrov je opcijski parameter alpha, ki določa prosojnost
elementov in je privzeto nastavljen na 1.0.
void glPointSize(glFloat size) – funkcija določi velikost oznak točk, ki jih bomo
izrisali po klicu te funkcije. Privzeta vrednost je 1.0.
void glVertex3f(glFloat x, glFloat y, glFloat z) – metoda se kliče med ukazoma
glBegin() in glEnd() in določa x, y ter z koordinato točke, ki jo ţelimo izrisati.
Koda izrisa točk je sorazmerno enostavna ter je navedena v nadaljevanju.
glColor3f( 0.0f, 0.0f, 0.0f ); // Črna barva
glPointSize(2);
glBegin(GL_POINTS);
for(int i=0; i<m_points.GetPointCount(); i++)
{
glVertex3d(m_points.GetPoints()[i].x,
m_points.GetPoints()[i].y,m_points.GetPoints()[i].z);
}
glEnd();
4.6. Aplikacija
Izgled uporabniškega vmesnika aplikacije je dokaj enostaven. Na sliki 16 lahko
vidimo, da aplikacija omogoča osnovno prikazovanje podatkov LIDAR. Na sliki, ki
40
prikazuje vizualizacijo površja Albanije, je jasno razvidna razgibanost pokrajine.
Omenimo naj, da to niso vse točke iz datoteke, ampak jih je prikazanih okrog 3 milijone.
Na sliki se tudi jasno vidijo ploskve, ki nastanejo zato, ker letalo ne zmore zajeti celotnega
območja prebiranja naenkrat. Zato letalo naredi več preletov, pri tem pa so na meji točke
bolj gosto zajete (se podvajajo), to se pa na sliki opazi kot rob. Ob prikazu aplikacija
omogoča preprosto navigacijo po karti, implementirano v obliki rotacije in pribliţevanja
oz. oddaljevanja prikazanega reliefa. Na kolešček miške je vezano
pribliţevanje/oddaljevanje, ob pritisku leve miškine tipke ter premikanju miške pa
opravimo rotacijo objekta/reliefa.
Slika 16: Glavno okno aplikacije
Moţnosti v meniju so naslednje:
41
File → Load File – z izbiro te moţnosti naloţimo datoteko, ki jo ţelimo
prikazati. Po kliku se nam na odpre pogovorno okno za iskanje po disku, s
katerim izberemo ţeleno datoteko.
File → SaveFile – moţnost shrani trenutno naloţeno datoteko LAS. Po kliku se
nam prikaţe pogovorno okno za iskanje po disku, v katerega vnesemo ţeleno
ime nove datoteke.
File → Compress File – ukaz izvede stiskanje datoteke, ki jo izberemo iz
pogovornega okna za brskanje po disku. Ob kliku se prikaţe okno, ki nas
obvešča o napredovanju stiskanja. Pogovorno okno je prikazano na sliki 17, na
kateri vidimo, da nad napredovalno črto (angl. progress bar) aplikacija izpisuje
tudi informacije o tem, kaj se trenutno v algoritmu izvaja. V primeru na sliki 17
se je generirala statistika simbolov datoteke. Če pride med stiskanjem do
kakršne koli napake, se kreirana datoteka tudi izbriše, saj je neuporabna.
Stisnjeno datoteko lahko prepoznamo po končnici *.lz.
File → Decompress File – kot ţe samo ime pove, je ta moţnost namenjena
dekodiranju stisnjene datoteke. Ob kliku se odpre pogovorno okno za brskanje
po disku, v katerem izberemo datoteko, ki jo ţelimo dekodirati. Po izbiri
datoteke se odpre podobno okno kot pri stiskanju, ki nas obvešča o napredku
dekodiranja.
File → Exit – izbira te moţnosti poskrbi za to, da se program zaključi.
Info → Las File Info – ob kliku tega ukaza se prikaţe pogovorno okno, ki je
namenjeno prikazu osnovnih informacij o datoteki. Ta funkcija prikaţe v
človeku prijazni obliki celotno glavo datoteke.
Info → Compare Las File – moţnost odpre ob kliku pogovorno okno za
primerjavo datotek LAS.
Slika 17: Pogovorno okno napredovanja
Med moţnostmi smo omenjali tudi izpis podatkov iz glave datoteke. Ti podatki so
lahko pomembni, če se ţelimo informirati o številu točk, kakšen je format datoteke, kakšen
42
je format zapisa točk, ... Primer izgleda tega prikaza vidimo na sliki 18. Na sliki so
prikazane informacije o predhodno odprti in izrisani datoteki (Albanija). Kot vidimo, je ta
datoteka v formatu 1.0. Datoteko so generirali s programsko opremo TerraScan.
Slika 18: Informacije o datoteki LAS
Ker smo izdelovali algoritem, ki bo kodiral in dekodiral podatke, je bilo nujno izvesti
tudi primerjavo dveh datotek, da bi preverili pravilnost stiskanja in razširjanja. Pogovorno
okno za izvajanje primerjave dveh datotek je predstavljeno na sliki 19. Tudi to okno
prikazuje napredek postopka, ki ga izvajamo. O rezultatu smo obveščeni s pogovrnim
oknom, ki je prikazano na sliki 20.
43
Slika 19: Primerjanje dveh datotek
a)
b)
Slika 20: Obvestila ob primerjavi datotek
4.7. Primerjava implementiranega algoritma z nekaterimi programi za
stiskanje podatkov
Še preden predstavimo uspešnost algoritma, bomo predstavili tudi statistike, ki smo jih
pri gradnji oziroma razvoju algoritma spremljali. Zelo pomembno je, kako generiramo
tabelo s statistiko, ki ima velik vpliv na samo stiskanje datoteke. Kot smo ţe navedli, je
bila osnova za algoritem računanje razlik med zaporednimi točkami. Nato smo začeli
testirati z raznimi povprečji, zgodovino razlik ter napovedovanjem točk.
V tabeli 16 je prikazano število simbolov, ki jih dobimo z računanjem navadnih razlik
med zaporednimi točkami. Vrednosti v tabeli 16 so generirane na podlagi datoteke
»Serpent Mound Model LAS Data.las«, ki je shranjena v formatu 1.0 s 3.265.110 točkami.
Testiranja algoritma so bila izvedena na prenosnem računalniku HP 8710p z 2.2 GHz (Intel
Core 2 Duo) procesorjem, 2 GB pomnilnika(RAM), 160 GB trdega diska s 5400 obrati ter
grafično kartico NVIDIA Quadro NVS 320M, ki ima 256 MB grafičnega (GDDR3)
pomnilnika.
44
Tabela 16 : Statistika (razlika)
element število simbolov frekvenca najpogostejšega simbola
X 8828 157840
Y 4045 153477
Z 2790 254716
Način z računanjem razlik je učinkovit, vendar smo ţeleli doseči še boljše stiskanje
podatkov. V tabeli 17 so rezultati, ki jih je dalo izboljšano napovedovanje koordinat x, y in
z, ki smo ga predstavili v poglavju 4.2. Število različnih simbolov (predvsem za koordinato
y), ki se generirajo po tem načinu, se občutno zmanjša, kar pomeni boljše pogoje za
aritmetični kodirnik.
Tabela 17 : Statistika (izboljšave)
element število simbolov frekvenca najpogostejšega simbola
X 8463 731620
Y 1299 1750499
Z 2834 300955
Računanje razlik med razlikami zaporednih točk ter napovedovanje koordinate y s
pomočjo koordinate x je privedlo do bistvene izboljšave. Uvedli pa smo še izboljšavo, ki
pa je zelo odvisna od razgibanosti površja. Ravnino, ki se izračuna s pomočjo treh
predhodnih točk, smo uporabili za napovedovanje vrednosti z. Kot pohvalo izboljšavam
naj povemo, da je stiskanje z napovedovanjem s preprosto razliko točk generiralo iz testne
datoteke LAS z velikostjo 89282 KB datoteko z velikostjo 11834 KB. Izboljšave so to
datoteko stisnile še za pribliţno 2 MB na velikost 9696 KB.
Kot smo navedli, so rezultati stiskanja podatkov dobri, vendar lahko učinkovitost
algoritma dokaţemo le tako, da ga postavimo ob bok drugim programom za stiskanje
podatkov. Ker je tematika stiskanja podatkov zelo pomembna, je bilo razvitih veliko
najrazličnejših programov, ki uporabljajo takšne in drugačne algoritme. V tabeli 18 so
navedeni nekateri programi z algoritmi, ki jih uporabljajo pri stiskanju podatkov. Ker bi
bila primerjava z vsemi programi nesmiselna, navajamo le tiste, ki jih vsakodnevno največ
uporabljamo. Primerjavo bomo izvedli tudi z algoritmom Martina Isenburga [18], prav
tako namenjenim posebej za stiskanje podatkov LIDAR.
45
Tabela 18 : Programi za stiskanje podatkov
Program Avtor Uporabljeni algoritmi
7-Zip Igor Pavlov f + LZMA + PPMII + LZ77 + BWT
ARJ ARJ Software LZSS + Huff
Cabarc Microsoft LZX+Huff+SF
JAR ARJ Software LZSS+Huff
GZip Jean-loup Gailly LZ77
WinAce Marcel Lemke LZ77+Huff
WinRAR Eugene Roshal LZ77+PPMII+Huff
WinZip WinZip Computing LZH + LZW + SF + Huff + PPMd
LIDAR kodiranje Martin Isenburg kodiranje »range«
BWT - Burrows-Wheeler Transform
V tabeli 18 so navedeni različni programi, ki uporabljajo algoritme, ki niso bili opisani
ali omenjeni v okviru te diplomske naloge. LZMA je izboljšana verzija algoritma LZ77.
BWT (angl. Burrows-Wheeler Transform) je algoritem stiskanja podatkov, ki ni izpeljanka
nobenega algoritma, opisanega v tem diplomskem delu. V tem algoritmu je osnovna ideja,
da vhodne podatke preuredimo tako, da imamo ţeleno zaporedje, ki je urejeno tako, da so
enaki znaki skupaj, posledično pa jih bomo lahko zaradi ugodnega zaporedja uspešneje
zakodirali oziroma stisnili. V tabeli 18 je navedeno tudi kodiranje »range«, ki je izpeljanka
aritmetičnega kodiranja. Tabela 19 navaja tudi najpomembnejše informacije (s stališča
stiskanja podatkov) o datoteki, ki so bile uporabljene za testiranje algoritma. Kot lahko
ugotavljamo, so datoteke, shranjene v formatu 1.2 redkost, saj je večina datotek, ki smo jih
našli in uporabljali, shranjena še v formatu 1.0.
Tabela 19 : Testne datoteke
Naziv datoteke pomembnejši parametri
Velikost Število točk format točk Verzija
LAS1 46.971 KB 2.404.613 0 1.0
LAS2 43.134 KB 2.208.166 0 1.0
LAS4 47.336 KB 2.423.315 0 1.0
Serpent Mound Model 89.282 KB 3.265.110 1 1.0
Albanija nizek 929.688 KB 34.000.000 1 1.0
Albanija visok 185.099 KB 6.769.294 1 1.0
xyzrgb_manuscript 54.733 KB 2.155.617 2 1.2
I27128las 531.200 KB 19.426.701 1 1.0
46
Tabela 20 : Statistika meritev
Naziv datoteke WinRar 7-Zip Win-Ace
Čas Velikost Čas Velikost Čas Velikost
LAS1 11 sek 12.508 KB 26 sek 15.391 KB 12 sek 12.355 KB
LAS2 10 sek 11.300 KB 24 sek 14.264 KB 11 sek 11.141 KB
LAS4 11 sek 12.144 KB 28 sek 15.475 KB 12 sek 11.985 KB
Serpent Mound
Model
20 sek 15.819 KB 50 sek 26.991 KB 21 sek 15.538 KB
Albanija nizek 213 sek 194.977 KB 541 sek 239.489 KB 250 sek 193.566 KB
Albanija visok 41 sek 38.979 KB 119 sek 47.041 KB 47 sek 38.434 KB
xyzrgb_manuscript 11 sek 6.437 KB 32 sek 9.787 KB 10 sek 6.413 KB
I27128las 105 sek 87.574 KB 314 sek 115.393 KB 115 sek 86.219 KB
Naziv datoteke WinZip Isenburg Naš algoritem
Čas Velikost Čas Velikost Čas Velikost
LAS1 8 sek 24.621 KB / / 20 sek 10.290 KB
LAS2 7 sek 22.603 KB / / 18 sek 9.082 KB
LAS4 7 sek 24.673 KB / / 21 sek 10.241 KB
Serpent Mound
Model
12 sek 40.239 KB 4 sek 10.816 KB 23 sek 9.696 KB
Albanija nizek 143 sek 435.485 KB 45 sek 158.533 KB 296 sek 133.894 KB
Albanija visok 29 sek 87.031 KB 8 sek 31.171 KB 57 sek 26.507 KB
xyzrgb_manuscript 7 sek 18.715 KB 3 sek 5.277 KB 12 sek 5.386 KB
I27128las 78 sek 236.481 KB 21 sek 77.364 KB 151 sek 66.606 KB
Tabela 21 : Primerjava stopnje stiskanja
Stopnja stiskanja
Naziv datoteke WinRAR 7-Zip WinAce WinZip Isenburg Razvit alg.
LAS1 26,6% 32,8 % 26,3 % 52,4 % / 21,9 %
LAS2 26,2% 33.1 % 25,8 % 52,4 % / 21 %
LAS4 25,6 % 32,7 % 25,3 % 52,1 % / 21,6 %
Serpent Mound Model 17,7 % 30,2 % 17,4 % 45,1 % 12,1 % 10,8 %
Albanija nizek 21 % 25,8 % 20,8 % 46,8 % 17,1 % 14,4 %
Albanija visok 21 % 25,4 % 20,8 % 47 % 16,8 % 14,3 %
xyzrgb_manuscript 11.8 % 17,9 % 11,7 % 34,2 % 9,6 % 9,8 %
I27128las 16.5 % 21,2 % 16,2 % 44,5 % 14,6 % 12,5 %
Kot vidimo iz tabele 20, je naš algoritem uspešnejši od vseh univerzalnih programov za
stiskanje podatkov. Algoritem je dosegel najboljše rezultate pri vseh testnih datotekah
razen pri datoteki »xyzrgb_manuscript«, kjer ga je za 0,2 % premagal algoritem Isenburga,
prav tako razvitega za stiskanje podatkov LIDAR. V tabeli so navedeni tudi časi stiskanja
datoteke, vendar bi lahko bili ti časi z optimalnejšim programiranjem bistveno boljši. V
tabeli 21 so navedene stopnje stiskanj. Če pozorno pogledamo odstotke, lahko opazimo, da
so tri datoteke stinjene na okrog 21 %, nekaj jih je med 10 % in14% in ena je pod 10 %.
47
Temu je tako, ker je stopnja stiskanja zelo odvisna od formata točk v datoteki. Tako je
format točk 0 najbolj skop, kar pomeni, da imamo manj vrednosti, ki bi jih lahko naš
algoritem uspešno napovedal in stisnil. Formati 1,2 in verjetno tudi 3 so ugodnejši s
stališča stiskanja podatkov, saj so dodane vrednost v »bogatejših« formatih (napram
formatu 0), zelo podobne predhodnim vrednostim (barva RGB, čas GPS) v datoteki, zato
jih lahko bolje napovedujemo.
48
5. SKLEP
Količine podatkov, ki se obravnavajo in uporabljajo v vsakodnevnem ţivljenju, se iz
dneva v dan povečujejo. Res je, da so se cene pomnilniških medijev zelo spustile in so
razmeroma nizke, vendar to še ne pomeni, da bi po nepotrebnem porabljali denar za nove
komponente, ko pa bi lahko z algoritmi te podatke veliko bolj učinkovito stisnili in
shranili. Med podatke, ki lahko zasedejo velike količine pomnilniškega prostora, lahko
štejemo tudi datoteke LAS, ki hranijo podatke, pridobljene s tehnologijo LIDAR, in so
lahko velike tudi do nekaj giga zlogov. Največja datoteka, s katero smo imeli opravka, je
bila velika pribliţno 930 M zlogov. Ker se intenzivno razvijajo tudi različni GIS
(geografski informacijski sistemi), pri katerih so vir podatkov tudi točke LIDAR, se
pomembnost teh podatkov močno povečuje.
Algoritem stiskanja podatkov, ki smo ga implementirali je zagotovo uspešen, saj je v
najboljšem primeru datoteko stisnil na manj kot 10 % izhodiščne velikosti. Dobro se je
odrezal tudi v preostalih primerih.
V diplomski nalogi smo razloţili formate datotek LAS ter implementirali njihovo
nalaganje in stiskanje v formatih 1.0, 1.1 in 1.2. Za osrednji algoritem smo implementirali
in opisali aritmetični kodirnik. Kot vemo, se v aritmetičnem kodirniku generira statistika
vhodnih podatkov, ki smo jo poskušali čimbolj učinkovito napovedati in s tem zmanjšati
število različnih simbolov, ki jih moramo zakodirati. Za napovedovanje smo izkoristili
različna dejstva kot npr., da se leča laserja giblje po določenih tirnicah, s tem pa lahko, če
poznamo predhodne vrednosti, dokaj natančno napovemo naslednjo vrednost. Za
napovedovanje smo uporabili tudi določeno število predhodnih točk, s katerimi napovemo
naslednjo. Moţne so tudi izboljšave implementiranega algoritma, kot so izboljšanje
napovedovanja koordinat x, y in z, napovedovanje drugih komponent v točkah, ki pa ni
moţno z metodami, ki smo jih opisali v okviru te diplomske naloge. Predvsem bi bilo
potrebno izboljšati napovedovanje koordinate x, saj vsebuje isti vzorec kot koordinata y.
49
Za koordinato x pa bi lahko poskušali uporabiti tudi napovedovanje s polinomsko funkcijo,
katero bi pridobili iz predhodnih točk s pomočjo aproksimacije.
50
VIRI IN LITERATURA
[1] Wikipedia – LIDAR, (Zadnji dostop: 26.8.2009)
Dostopno na naslovu:
http://en.wikipedia.org/wiki/LIDAR
[2] Airborne Altimetric LIDAR, (Zadnji dostop: 26.8.2009)
Dostopno na naslovu:
http://home.iitk.ac.in/~blohani/LiDAR_Tutorial/Airborne_AltimetricLidar_Tutorial.htm
[3] Coastal Change Hazards: Hurricanes and Extreme Storms (Zadnji dostop
31.8.2009)
Dostopno na naslovu:
http://coastal.er.usgs.gov/hurricanes/lidar.html
[4] INCITS L1 ASPRS LAS standard DRAFT Version 2.0, American Society
Photogrammetry and Remote Sensing (ASPRS), 2007.
[5] LAS Specification Version 1.2, American Society Photogrammetry and Remote
Sensing (ASPRS), 2008.
[6] LAS Specification Version 1.1, American Society Photogrammetry and Remote
Sensing (ASPRS), 2005.
[7] D. Salomon: Data Compression - The Complete Reference, Springer-Verlag, New
York , 2004.
[8] Dynamic Markov compression, (Zadnji dostop:26.8.2009)
Dostopno na naslovu:
http://en.wikipedia.org/wiki/Dynamic_Markov_Compression
[9] L. Pillai, Huffman Coding, Xilinx Application Note XAPP 616, 2003.
[10] Wikipedia – Arithmetic coding, (Zadnji dostop: 26.8.2009)
Dostopno na naslovu:
http://en.wikipedia.org/wiki/Arithmetic_coding
51
[11] I.H. Witten, R.M. Neal, J.G. Cleary, Arithmetic coding for data compression,
Communications of the ACM, letnik 30, št. 6, str. 520 – 540, 1987.
[12] Wikipedia - IEEE 754-1985 (Zadnji dostop 31.8.2009)
Dostopno na naslovu:
http://en.wikipedia.org/wiki/IEEE_754-1985
[13] P. Ratanaworabhan, J. Ke, M. Burtscher, Fast lossless compression of scientific
floating-point data, Proceedings of the Data Compression Conference , str. 133-142,
2006.
[14] M. Isenburg, P. Lindstrom, J. Snoeyink, Lossless compression of predicted
floating-point geometry, Computer-Aided Design, letnik 37, št. 8, str. 869-877, 2005.
[15] P. Lindstrom, M. Isenburg. Fast and Efficient Compression of Floating-Point
Data, IEEE Transactions on visualization and computer grafics, letnik 12, št. 5, str.
1245-1250, 2006.
[16] V. Engelson, D. Fritzson, P. Fritzson, Lossless compression of High-volume
Numerical Data from Simulations, Proceedings of the Data Compression Conference,
letnik 5, št. 11, str. 574-586, 2000.
[17] Wikipedia – Open GL, (Zadnji dostop : 26.8.2009)
Dostopno na naslovu:
http://en.wikipedia.org/wiki/OpenGL
[18] Homepage of Martin Isenburg – LAStools, (Zadnji dostop: 26.8.2009)
Dostopno na naslovu:
http://www.cs.unc.edu/~isenburg/