60
UNIVERZA V MARIBORU FAKULTETA ZA ELEKTROTEHNIKO, RAČUNALNIŠTVO IN INFORMATIKO MARKO KOCMUT DIPLOMSKA NALOGA MARIBOR, SEPTEMBER 2009

Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

UNIVERZA V MARIBORU

FAKULTETA ZA ELEKTROTEHNIKO,

RAČUNALNIŠTVO IN INFORMATIKO

MARKO KOCMUT

DIPLOMSKA NALOGA

MARIBOR, SEPTEMBER 2009

Page 2: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

UNIVERZA V MARIBORU

FAKULTETA ZA ELEKTROTEHNIKO,

RAČUNALNIŠTVO IN INFORMATIKO

Marko Kocmut

Stiskanje podatkov LIDAR

Diplomska naloga

Maribor, september 2009

Page 3: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja
Page 4: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 5: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 6: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 7: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 8: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 9: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 10: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 11: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 12: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 13: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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:

Page 14: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 15: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 16: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 17: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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 *

Page 18: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 19: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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 *

Page 20: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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 *

Page 21: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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 *

Page 22: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 23: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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>

Page 24: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 25: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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")

Page 26: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 27: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 28: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 29: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 30: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 31: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 32: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 33: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 34: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

&current_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.

};

Page 35: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 36: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 37: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 38: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 39: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

30

rezultat pa dobimo pribliţno napoved razlike koordinate y. Zakodira se razlika, kot je

prikazano na sliki 13.

Slika 12: Napovedovanje koordinate y

Page 40: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 41: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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);

Page 42: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 43: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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)

{

Page 44: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 45: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 46: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 47: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 48: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 49: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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:

Page 50: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 51: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 52: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 53: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 54: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 55: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 56: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 57: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 58: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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.

Page 59: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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

Page 60: Stiskanje podatkov LIDAR - COnnecting REpositories · Huffmanovo kodiranje UDK: 004.627.021(043.2) Povzetek Namen diplomske naloge sta razvoj in implementacija algoritma stiskanja

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/