Obsah přednášky Komprese dat doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-7 / 597 324 23 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Motivace Podstata a typy komprese Základní metody kódování Huffmanovo kódování Aritmetické kódování Slovníkové metody Prediktivní metody Komprese obrazu, zvuku a videa Komprese dat v prostředí Java Komprese dat 2 Motivace Ukládání dat Umístění rozsáhlých dat na média s omezenou kapacitou Přenos dat Snížení nároků na objem přenášených dat (doba přenosu, cena) Archivace Omezení prostoru, který zabírají méně často používaná dat Motivace 2 min. hudby na CD 44 vzorků/sec, 6 bitů vzorek Bez komprese > 84 mil. bitů sec. videa Rámec 72x48 vzorků, 3 fps, 6 bitů/vzorek Bez komprese > 6 mil. bitů Komprese dat 3 Komprese dat 4 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava
Podstata komprese Informační hodnota roste s klesající pravděpodobností zprávy Informace přenášená symbolem X s pravděpodobností výskytu P(X) -log 2 P(X) Odpovídá počtu bitů, které bychom potřebovali v ideálním případě na její reprezentaci Při kódování informace se snažíme dosáhnout co nejlepšího poměru mezi délkou zprávy a její informační hodnotou Typy komprese Bezztrátová komprese Při kompresi nedochází ke ztrátě informačního obsahu Po obnově dostáváme původní data Ztrátová komprese Část informačního obsahu se kompresí ztrácí Používá se hlavně při kompresi obrazu a zvuku Využití fyziologických omezení lidských smyslů Účinnost komprese x Velikost ztrát Komprese dat 5 Komprese dat 6 Kódování Přidělení binárních posloupností symbolům nějaké abecedy Huffmanovo kódování Přidělení kódu tak, aby symbol s největší pravděpodobností výskytu měl nejkratší kód A...- B.. - C.. -.-. ABBAC......-/- /- /.-/-.-. Komprese dat 7 A.4 B.2 C.2 D. E..6..2.4 A= B= C= D= E= Komprese dat 8 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 2
Huffmanovo kódování Problém Vyžaduje znalost pravděpodobností symbolů Nutnost předzpracování komprimovaných dat Tabulka pravděpodobností musí být dostupná při dekompresi Adaptivní kódování Tabulka se vytváří v průběhu kódování Nemusí se uchovávat při dekompresi se obnoví Komprese dat 9 Aritmetické kódování Kódování posloupnosti symbolů na reálné číslo z intervalu (,]..4.56 A A A.4.48.568 B B B.6.52.572 C C C.8.56.576 D D D.9.58.578 E E E..6.58 B=(.4,.6] BD=(.56,.58] BDB=(.568,.572] Komprese dat Aritmetické kódování Vyžaduje aritmetiku s vysokou přesností Výsledné číslo lze reprezentovat libovolným prvkem z intervalu BDB.57 I přes zdánlivou složitost lze jednoduše implementovat Slovníkové metody Zejména při kompresi textů se často opakují některé posloupnosti znaků nebo slov např. zdrojové texty programů Můžeme vytvořit slovník opakujících se slov a do výstupu kódovat jen reference do slovníku Statický slovník připravíme předem Adaptivní slovník vytváří se průběžně Komprese dat Komprese dat 2 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 3
Algoritmus LZ77 (Jacob Ziv Abraham Lempel) Slovník je součástí již dříve zakódované sekvence Ukládá se posloupnost trojic <offset,délka,znak> Použito s úpravami v PKZip, Zip, PNG, gzip, ARJ, vyhledávací paměť o = 6 dopředu nahlížená paměť a b a b a b b a a c a b b b a c b Algoritmy LZ78 a LZW Vytváří se samostatný slovník Ukládá se posloupnost dvojic <index do slovníku, znak> Varianta LZW ukládá jen posloupnost indexů do slovníku Velikost slovníku lze omezit max. délkou kódu pro reprezentaci indexu l = 3 <6, 3, b> Aplikace: UNIX compress, gif, V.42 bis Komprese dat 3 Komprese dat 4 Příklad algoritmus LZW Prediktivní metody a b a b b a a b a b a a b 2 3 4 3 7 2 3 4 5 a b ab ba abb Předchozí metody vycházejí z posloupnosti nezávislých symbolů Často jsou symboly závislé v určitém kontextu se vyskytují více nebo méně často V Á N O C E 6 baa? mezera 7 8 aba abaa Ve faxové zprávě -po černém nebo bílém bodu lze očekávat opět bod stejné barvy Komprese dat 5 Komprese dat 6 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 4
Metoda RLE (Run Length Encoding) Snaha redukovat posloupnosti opakujících se znaků xyzzzzyyyyyxwwww => xy#z4#y5x#w4 Co když se opakuje jen 2x? Co když je více než 255 opakování? Co když je v textu znak #? xyzzzyyy2xwww Použití v PCX, BMP, faxové protokoly Komprese obrazu GIF (Graphics Interchange Format) Bezztrátová komprese pro grafiku, ikony, Implementace LZW algoritmu s omezenou délkou slovníku (po naplnění je statický) JPEG (Joint Photographic Experts Group) Ztrátová komprese pro fotografické snímky Založen na diskretní kosinové transformaci (DCT), případně na waveletech Progressive JPEG postupné zobrazování Komprese dat 7 Komprese dat 8 Komprese obrazu TIFF (Tagged Image File Format) Pro přenos rastrových dat Velmi flexibilní obtížný na zpracování PNG (Portable Network Graphics) Důraz na přenositelnost Vylepšuje vlastnosti GIF (průhlednost, prokládání, lepší komprese) Komprese dat 9 Komprese zvuku Komprese řeči menší nároky na přesnost Telefon, GSM Komprese hudby Perceptual encoding využívá znalostí z psychoakustiky (nedokonalosti lidského ucha) maskování frekvencí nelinearita citlivosti časové maskování - setrvačnost Audiosystémy, přenosné přehrávače, video Komprese dat 2 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 5
Komprese zvuku MPEG- Layer 3 (MP3) 987, univerzita Erlangen Veřejně dostupný formát, mnoho implementací Rychlé dekódování, nízké nároky Dolby Laboratories AC-3 Vícekanálová komprese (mono 5.) Možnost doplnění o metadata, jazykové verze, Komprese videa Video = posloupnost obrázků + zvuk Vysoký tok dat MPEG (Moving Picture Experts Group) MPEG- (do.5 Mbit/sec VideoCD, Internet) MPEG-2 (.5-5 MBit/sec DVD, digit. TV) MPEG-4 (komprese založená na objektech) Komprese dat 2 Komprese dat 22 Komprese videa Posloupnost rámců (snímků) Využití prediktivní komprese Na základě jednoho rámce odhadujeme další Typy rámců I-frame: obsahuje celý obrázek (JPEG) P-frame: obsahuje rozdíly od odhadnutého rámce Komprese v prostředí Java java.util.jar JarInputStream, JarOutputStream java.util.zip ZIPInputStream, ZIPOuputStream GZIPInputStream, GZIPOutputStream Komprese dat 23 Komprese dat 24 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 6
Příklad String[] filenames = new String[]{"filename", "filename2"}; byte[] buf = new byte[24]; try { String outfilename = "outfile.zip"; ZipOutputStream out = new ZipOutputStream( new FileOutputStream(outFilename)); for (int i=; i<filenames.length; i++) { FileInputStream in = new FileInputStream(filenames[i]); // <komprese souboru> in.close(); } out.close(); } catch (IOException e) {} Příklad // <komprese souboru> // Vytvoření nové výstupní položky out.putnextentry(new ZipEntry(filenames[i])); // Přenos obsahu souboru int len; while ((len = in.read(buf)) > ) { out.write(buf,, len); } // Uzavření výstupní položky out.closeentry(); Komprese dat 25 Komprese dat 26 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 7