Föreläsning 11 - Komprimering
KomprimeringKomprimering innebär att man använder någon metod för att minska storleken på en fil. Vi skiljer mellan förlustfri komprimering (non-lossy compression) där det går att dekomprimera för att få tillbaka filen i ursprungligt skick och förstörande komprimering (lossy compression) där man tar bort data. Att det går att komprimera utan att förstöra en fil beror på att filer oftast har redundans, dvs innehåller mer än nödvändigt.Följdlängdskodning - RLEI följdlängdskodning, förkortat RLE (Run-Length-Encoding), utnyttjar man att en följd av likadana tecken kan lagras med antal istället för att skrivas ut.ÅÅÅÅH! JAAAAAAA! AAAAAAAAAAAAH. Vi ersätter följderna av Å och A med antalet följt av det upprepade tecknet:
Men om grundtexten innehåller siffror blir det svårtolkat.
Därför väljer vi ett bryttecken, t ex § , som vi är
säkra på inte kommer att förekomma i texten.
Algoritmen blir enkel, men tyvärr inte så användbar för textkomprimering eftersom de flesta texter inte innehåller längre följder av samma tecken. HuffmankodningOm vi vet hur vanliga olika tecken är i texten kan vi ställa upp en tabell där vi för varje tecken kan ange sannolikheten för att ett visst tecken ska dyka upp. I David A. Huffmans metod kodar man varje tecken med ett binärt tal, där vanligare tecken får kortare koder. Algoritmen som beräknar vilket tecken som ska få vilken binär kod går ut på att man ritar upp ett binärt träd, där varje tecken ses som ett löv. Sedan numrerar man trädets grenar med 0 och 1 och följer trädet från roten ut till varje löv för att se koderna.
Texten HAHA!IIIIIIH!AHRG... skulle alltså kodas som
Huffmankodning är en statistisk metod.
Lempel-ZivAlla texter följer inte statistiken. Här följer ett utdrag ur romanen Gadsby av Ernest Vincent Wright (1872-1939).IF YOUTH, THROUGHOUT all history, had had a champion to stand up for it; to show a doubting world that a child can think; and, possibly, do it practically; you wouldn't constantly run across folks today who claim that ''a child don't know anything.'' A child's brain starts functioning at birth; and has, amongst its many infant convolutions, thousands of dormant atoms, into which God has put a mystic possibility for noticing an adult's act, and figuring out its purport. Jacob Ziv och Abraham Lempel uppfann en förutsättningslös metod som anpassar sig till indata. Principen är att man går igenom filen och bygger en ordlista som används för kodningen. Lempel-Ziv finns i ett otal olika varianter: LZ77, LZSS, LZFG, LZW, LZMW, LZAP, LZY, LZP, osv. Så här fungerar LZW (en variant gjord av T. Welch): Under komprimeringen skapas en ordlista med koder för de delsträngar som hittills förekommit i texten. Samtidigt skrivs den komprimerade texten ut.
def lzw(text): table = Table() q=Queue() for c in text: # spara texten tecken för tecken i en kö q.put(c) s="" kodtext="" # här sparas det kodade meddelandet while not q.isempty(): c=q.get() if table.exists(s+c): s=s+c else: kodtext+=str(table.code(s))+c table.add(s+c) s="" if not s=="": kodtext+=str(table.code(s)) return kodtextKlassen Table (som används för ordlistan)
är tänkt att vara en datastruktur där man
kan stoppa in strängar med add() , kolla om en sträng finns
med exists() , och få ut en kod för en given sträng
med code() .
LZ-komprimering används i många komprimeringsprogram, t ex compress ,
Zip , WinZip och GZip
(här i kombination med Huffmankodning). LZW patenterades för ca 20 år sedan och patentet gick ut
härom året.
Exempel: Använd LZW-algoritmen ovan för att komprimera NÄSSNUVSNORSNOK Om vi använder en vektor som tabell och för enkelhets skull kodar strängarna med vektorindex får vi tabellen:
och det komprimerade ordet blir: NÄS2NUV3OR6K EntropiHur mycket kan man komprimera utan att förlora information?Om det var möjligt att komprimera hur mycket som helst skulle vi kunna få ner varje fil till en bit, men det kan vi uppenbarligen inte. Det finns alltså en undre gräns för hur kompakt man kan få en fil med förlustfri komprimering. Om man känner till sannolikheten för varje tecken som ska kodas (som i skräckexemplet ovan) kan man beräkna entropin som ger en undre gräns för medellängden hos en kod.
Anta att vi har en teckenmängd
Komprimering av bilderBilder tar plats. Det är vanligt att varje bildpunkt (pixel) i en färgbild representeras med ett 24-bitars binärt tal (vilket ger oss åtta bitar för vardera rött, grönt resp blått). Då tar en färgbild 100x100 pixlar 24000 bitar, dvs 24 kB och en bild som täcker en 600x800-skärm tar 11.5 MB.
GIF (Graphics Interchange Format) är ett filformat för bilder där färgkodningen görs med 8 bitar, dvs man får 28=256 färger. Sen används en variant av LZW för att komprimera. Den komprimeringen är förlustfri och storleken minskas med ungefär faktorn 4. JPEG (Joint Photographic Experts Group) är bättre för foton och andra bilder där närliggande pixlar har liknande färger. Färgbilder delas upp i en belysningsdel och en färgdel, där färgdelen komprimeras med förstörande komprimering eftersom ögat är mindre känsligt för färgförändringar. Sen används en kombination av RLE och Huffmankodning för att koda grupper av pixlar. Komprimeringsgraden är parameter till algoritmen, så man kan bestämma själv hur hårt man vill komprimera. Färgkodningen görs med 24 bitar, dvs 224 (nästan 17 miljoner) färger. Komprimering av rörliga bilderEn videofil innehåller massor av bilder och dessutom ljud så det är extra viktigt att kunna komprimera såna. Dekomprimeringen måste gå snabbt om man direkt ska kunna se filmen i realtid. Det mest kända formatet för rörliga bilder är MPEG (Moving Picture Experts Group). MPEG är egentligen en samling standarder för kombinationer av ljud och video.Komprimeringen av video-delen kan delas upp i bildkomprimering av varje enskild bildruta och tidskomprimering där man utnyttjar likhet mellan på varandra följande bilder. För bildkomprimeringen används i regel JPEG. För tidskomprimeringen finns ett antal olika metoder:
Komprimering av ljudDigital lagring av ljud innebär automatiskt en komprimering eftersom vi samplar en analog ljudkurva i ett ändligt antal punkter. Vidare komprimering av digitala ljudfiler kan göras med RLE eller Huffmankodning. Däremot fungerar inte LZ-metoderna särskilt bra, eftersom de bygger på att man hittar upprepningar. Och även om t ex ett musikstycke upprepar sig är det osannolikt att samma upprepningar skulle återfinnas i ljudfilen efter samplingen.När det gäller ljud kan man också använda förstörande metoder Två exempel på sådana är tystnadskomprimering där man ersätter mycket svaga ljud med tystnad och companding där man minskar ordlängden för varje ljudpunkt (t ex från 16 till 12 bitar). MP-3 (MPEG Audio Layer-3 encoding) använder en kombination av tekniker där man utnyttjar en modell av den mänskliga hörseln samt Huffmankodning. FelkorrektionVill man gardera sig mot fel kan man lägga till redundans (motsatsen till komprimering). Det finns många olika sätt att göra det på, här följer några exempel:
|