Kompression av ljud och bild

Relevanta dokument
Kurslitteratur. Kompression av ljud och bild. Föreläsningar, preliminärt program. Laborationer. Khalid Sayood, Introduction to Data Compression

Skurlängdskodning. aaaabbbbbbbccbbbbaaaa. Man beskriver alltså sekvensen med ett annat alfabet än det ursprungliga.

Kurslitteratur. Kompression av ljud och bild. Föreläsningar, preliminärt program. Laborationer

Ordbokskodning. Enkel variant av kodning med variabelt antal insymboler och fixlängds kodord. (Jfr tunstallkodning)

Exempel, minnesfri binär källa. Ordbokskodning. Lempel-Zivkodning. Lempel-Zivkodning, forts.

Shannon-Fano-Elias-kodning

Datakompression. Harald Nautsch ISY Bildkodning, Linköpings universitet.

Kursinnehåll. Datakompression. Föreläsningar, preliminärt program. Examination

Aritmetisk kodning. F (0) = 0 Exempel: A = {1, 2, 3} k=1. Källkodning fö 5 p.1/12

Källkodning. Egenskaper hos koder. Några exempel

FLAC (Free Lossless Audio Coding)

Optimala koder. Det existerar förstås flera koder som har samma kodordsmedellängd. Enklaste fallet är att bara byta 0:or mot 1:or.

Optimala koder. Övre gräns för optimala koder. Gränser. Övre gräns för optimala koder, forts.

Krafts olikhet. En momentant avkodbar kod (prefixkod) med kodordslängderna l 1,...,l N existerar om och endast om. 2 l i. 1 i=1

TSBK04 Datakompression. Övningsuppgifter

TSBK04 Datakompression Övningsuppgifter

Adaptiv aritmetisk kodning

Föreläsning 1: Bild- och ljudkodning

En generell prediktiv kodare utnyttjar signalens utseende N steg tillbaka i tiden för kodningen, dvs vi kodar efter den betingade fördelningen

Linjär prediktion. Prediktiv kodning. Linjär prediktion. Prediktiv kodare och avkodare

TSBK35 Kompression av ljud och bild

Föreläsning 7: Bild- och videokodning

Burrows-Wheelers transform

4/27/12. Fönstring i MDCT. Föreläsning 10: Ljudkodning ( Audio Coding ) 1. Inledning PCM, standardmetoder, MDCT, psykoakustik, ljudtryck

Kodning med distorsion

Föreläsning 10: Ljudkodning ( Audio Coding )

SMS047 Mediakodning. Introduktion. Frank Sjöberg. Introduktion. Introduktion

Transformkodning Idé: 1. Tag datasekvensen och dela in den i block av storlek N (eller N N om signalen är tvνadimensionell). Transformera dessa block

Analys/syntes-kodning

Föreläsninsanteckningar till föreläsning 3: Entropi

Lab 3 Kodningsmetoder

Föreläsning 17 - Komprimering

Psykoakustik. Ljudtrycksnivå. Hörselns omfång. Hörnivå(loudness) Människans hörsel är ganska väl studerad och det finns bra modeller för den.

Träd och koder. Anders Björner KTH

Övning 6 - Tillämpad datalogi 2012

Signaler och system, IT3

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

Föreläsning 7. Felrättande koder

Innehåll. Föreläsning 11. Organisation av Trie. Trie Ytterligare en variant av träd. Vi har tidigare sett: Informell specifikation

Lösningsförslag till övningsuppgifter, del V

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Bilder... Dagens föreläsning. Objektgrafik. Objektgrafik. TNMK30, 2010 Föreläsning

Detta ger oss att kanalkapaciteten för den ursprungliga kanalen är C = q 1 C 1 + q 2 C C =1 h ( ) 0.30.

Informationsteori. Repetition Kanalkapaciteten C. Repetition Källkodhastigheten R 2. Repetition Kanalkodhastigheten R 1. Huffmans algoritm: D-när kod

Datastrukturer och algoritmer. Innehåll. Trie. Informell specifikation. Organisation av Trie. Föreläsning 13 Trie och Sökträd.

Videosignalen består av en sekvens av bilder, typiskt 24, 25 eller 30 bilder i sekunden.

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

4.1 Grundläggande sannolikhetslära

LARS ULVELAND HOPFIELDNÄTVERK FÖR IGENKÄNNING AV DEGRADERADE BILDER OCH HANDSKRIVNA TECKEN

Föreläsning i webbdesign. Bilder och färger. Rune Körnefors. Medieteknik Rune Körnefors rune.kornefors@lnu.se

Algoritmer, datastrukturer och komplexitet

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013)

Psykoakustik. Ljudtrycksnivå. Hörselns omfång. Hörnivå (loudness) Människans hörsel är ganska väl studerad och det finns bra modeller för den.

Föreläsning 2. Transmissionslänk. Repetition: Internetprotokollens skikt. Mål

Digital- och datorteknik

Laboration 4: Digitala bilder

SF1905 Sannolikhetsteori och statistik: Lab 2 ht 2011

Grundläggande matematisk statistik

Algoritmer, datastrukturer och komplexitet

DIGITAL KOMMUNIKATION

Tentamen i. TDDC67 Funktionell programmering och Lisp

För logitmodellen ges G (=F) av den logistiska funktionen: (= exp(z)/(1+ exp(z))

Laboration 4: Stora talens lag, Centrala gränsvärdessatsen och enkla punktskattningar

x 23 + y 160 = 1, 2 23 = ,

Digital- och datorteknik

Ansiktsigenkänning med MATLAB

F3 Datarepresentation teckenkodning och datakompression EDAA05 Datorer i system! Roger Henriksson!

F3 Datarepresentation teckenkodning och datakompression

Finansiell Statistik (GN, 7,5 hp,, VT 2009) Föreläsning 2. Diskreta Sannolikhetsfördelningar. (LLL Kap 6) Stokastisk Variabel

SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2

Människans hörsel är ganska väl studerad och det finns bra modeller för den.

Föreläsning 5: Grafer Del 1

Data och Information. Dr. Johan Hagelbäck.

Föreläsning 1. Repetition av sannolikhetsteori. Patrik Zetterberg. 6 december 2012

Bildförbättring i spatial domänen (kap. 3) Bildförbättring (enhancement) Spatial domän. Operatorer. Tröskling (threshold) Gråskale-transformationer

Uppgift 1 ( Betyg 3 uppgift )

DIGITALA TAL OCH BOOLESK ALGEBRA

Tentamen, Programmeringsteknik för BME, F och N

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Stokastiska processer

Struktur: Elektroteknik A. Digitalteknik 3p, vt 01. F1: Introduktion. Motivation och målsättning för kurserna i digital elektronik

Datorsystemteknik DVG A03 Föreläsning 3

Förlustfri datakompression

Moment 2 - Digital elektronik. Föreläsning 1 Binära tal och logiska grindar

Material till kursen SF1679, Diskret matematik: Lite om kedjebråk. 0. Inledning

Tillämpad Programmering (ID1218) :00-13:00

Laboration 5: Regressionsanalys. 1 Förberedelseuppgifter. 2 Enkel linjär regression DATORLABORATION 5 MATEMATISK STATISTIK FÖR I, FMS 012, HT-08

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Digital Aritmetik Unsigned Integers Signed Integers"

Kontinuitet och gränsvärden

TAIU07 Matematiska beräkningar med MATLAB för MI. Fredrik Berntsson, Linköpings Universitet. 15 januari 2016 Sida 1 / 26

Bildlagring och - komprimering

Tentamen MVE301 Sannolikhet, statistik och risk

International Olympiad in Informatics July 2011, Pattaya City, Thailand Tävlingsuppgifter Dag 2 Svenska 1.3. Papegojor

TAMS79: Föreläsning 10 Markovkedjor

Grafer och grannmatriser

Monte Carlo-metoder. Bild från Monte Carlo

-med fokus på robusthet

7 MÖNSTERDETEKTERING

Transkript:

Kompression av ljud och bild Harald Nautsch harna@isy.liu.se ISY Informationskodning, Linköpings universitet http://www.icg.isy.liu.se/courses/tsbk35/

Kurslitteratur Rekommenderad bok: Khalid Sayood, Introduction to Data Compression. Finns tillgänglig i elektronisk form. Övningshäfte och formelsamling. Finns på hemsidan. Elektroniska böcker, se kurssidorna. Labkompendium, föreläsningsslides, lösningsförslag till Sayood, gamla tentor, et c. finns på kurssidorna.

Föreläsningar, preliminärt program 1. Inledning. Källmodeller, källkodning, huffmankodning. 2. Entropi, golombkoder, skurlängdskodning. 3. Aritmetisk kodning 4. Lempel-Ziv-kodning, distorsionsfri ljud- och bildkodning. GIF, PNG, lossless JPEG, JPEG-LS 5. Amplitudkontinuerliga stokastiska processer. Kvantisering 6. Vektorkvantisering 7. Linjär prediktiv kodning 8. Transformkodning. JPEG 9. Delbandskodning. JPEG-2000 10. Ljudkodning. Psykoakustik. mp3, AAC, Dolby Digital, Ogg Vorbis 11. Videokodning. H.26x, MPEG 12. Videokodning forts. Talkodning. CELP, GSM

Laborationer 1. Distorsionsfri komprimering av stillbilder och musik. Görs i grupper om 1-2 personer. Redovisas med en liten rapport. 2. Kodning av musik. Görs i grupper om 1-2 personer. Redovisas med en liten rapport. 3. Transformkodning av stillbilder (4h) Görs på schemalagd tid i grupper om 1-2. Det finns schemalagda jourlabtider även för de två första laborationerna, då assistent kommer att vara närvarande.

Lämpliga förkunskaper Sannolikhetslära Linjär algebra (matriser, vektorer) Analys Grundläggande transformteori Signalbehandling (linjära system) Matlab

Vad är datakompression? X Y X komprimering rekonstr. Y tar mindre plats att lagra än X. Distorsionsfri komprimering (lossless): X = X Komprimering med distorsion (lossy): X X

Exempel: JPEG-kodning Förenklat blockschema över en JPEG-kodare: Bild Blockbaserad transform Storlek, färgrymd, metadata, etc Kvantisering Källkodning Parametrar MUX JPG-fil Avkodaren gör förstås allt i omvänd ordning.

Förekommande metoder Exempel på distorsionsfri komprimering: Textkomprimering: zip, gzip, bzip, compress Stillbilder: GIF, PNG, lossless JPEG, JPEG-LS, faxkodning Musik: FLAC Exempel på komprimering med distorsion: Stillbilder: JPEG, JPEG 2000 Video: H.261, H.263, H.264, H.265, MPEG-1 (VideoCD), MPEG-2 (DVD, DVB), MPEG-4 (DivX, XviD), DV Ljud: MPEG-1 layer 3 (mp3), AC-3 (Dolby Digital), ATRAC (MiniDisc), Ogg Vorbis, AAC Tal: CELP, GSM

Godhetsmått Hur stor kompression ger vår metod? Kompressionsgrad (compression ratio) Ex. Signal att komprimera gråskalebild 256 256 bildpunkter, 1 byte (8 bitar) per bildpunkt. Antag att den komprimerade signalen tar 16384 bytes att lagra. Kompressionsgraden är då 256 256 1 16384 = 4 ggr. Vanligt att mäta medeldatatakten (rate) i bitar/sampel (bitar/bildpunkt, bitar/tecken) Ex. Vår bild ovan: 16384 8 256 256 = 2 bitar/bildpunkt För video- och ljudsignaler anger man ofta medeldatatakten i bitar/s.

Godhetsmått, forts Hur stor distorsion ger vår metod? Mänsklig bedömning Matematiska mått Kvadratiskt medelfel (mean square error) SNR SNR viktat för att ta hänsyn till människans syn eller hörsel.

Vad är originalet? För ljud och bilder är originalsignalerna samplade och fint kvantiserade amplitudsignaler. Signalen kan vara skalär (monoljud, gråskalebilder) eller vektorvärd (exempelvis RGB, CMYK, multispektrala bilder, stereoljud, surroundljud). Trots att originalsignalen i princip alltid är kvantiserad kan man ändå ofta använda amplitudkontinuerliga modeller för den (föreläsning 5 och senare.)

Egenskaper att utnyttja Vad är det för egenskaper hos signalen som gör att vi (oftast) kan komprimera den? Alla symboler är inte lika vanliga. T.ex. i en musiksignal är det vanligare med små amplitudvärden än med stora. Beroende mellan närliggande symboler. T.ex. i en bild så har bildpunkter bredvid varandra oftast ungefär samma värde. Egenskaper hos människans syn- eller hörselsinne. Man kan ta bort information som ändå inte kommer synas eller höras.

Diskreta källor En källa är något som producerar en en sekvens av symboler. Symbolerna är element i ett diskret alfabet A = {a 1, a 2,..., a N } av storlek N. För det mesta kommer vi att behandla ändliga alfabet, men även oändliga alfabet är tillåtna. I många fall har man bara tillgång till själva symbolsekvensen och får därför modellera källan från den.

Stokastiska källmodeller De källmodeller vi kommer att koncentrera oss på är stokastiska modeller, där vi antar att symbolerna produceras från stokastiska variabler eller stokastiska processer. Den enklaste stokastiska modellen för en källa är en diskret stokastisk variabel X. Fördelning Pr(X = a i ) = P X (a i ) = P(a i ) = p i P(a i ) 0, a i N P(a i ) = 1 i=1

Stokastiska källmodeller, forts. En bättre källmodell är diskreta stationära stokastiska processer. En stokastisk process X t kan ses som en följd av stokastiska variabler, där man får ett utfall i varje tidpunkt t. Betingade sannolikheter: Källans utsignal i två tidpunkter t och s P(x t, x s ) = Pr(X t = x t, X s = x s ) P(x s x t ) = P(x t, x s ) P(x t ) P(x t, x s ) = P(x t ) P(x s x t )

Minneskällor Beroende mellan utsignalens värde i olika tidpunkter brukar kallas för minne. Om X t och X t+k är oberoende för alla k 0 så kallas källan minnesfri. För en minnesfri källa gäller: P(x t, x t+k ) = P(x t ) P(x t+k ) P(x t+k x t ) = P(x t+k )

Markovkällor Markovkälla av ordning k P(x t x t 1 x t 2...) = P(x t x t 1... x t k ) En markovkälla är en minneskälla med begränsat minne k steg tillbaka i sekvensen En markovkälla kan beskrivas med en tillståndsgraf med M = N k tillstånd s i. Se extramaterial om markovkällor.

Verklig källa som stokastisk process. Exempel: Alfabet {a, b}. Givna data: bbbbaabbbaaaaabbbbbabaaabbbb. För att skatta symbolsannolikheter räknar vi hur ofta varje symbol uppträder: a finns 11 gånger, b 17 gånger. De skattade sannolikheterna P(x t ) blir då: P(a) = 11 17, P(b) = 28 28 För parsannolikheter och betingade sannolikheter får vi istället räkna hur ofta de olika symbolparen uppträder. aa finns 7 gånger, ab 4 gånger, ba 4 gånger och bb 12 gånger. De skattade sannolikheterna P(x t, x t+1 ) och P(x t+1 x t ) blir då: P(aa) = 7 27, P(ab) = 4 27, P(ba) = 4 12, P(bb) = 27 27 P(a a) = 7 11, P(b a) = 4 11, P(a b) = 4 12, P(b b) = 16 16

1917 års bibel som markovkälla Markov, ordning 1: Ban n pr tusopå bensoch jakaränguräkerärudera. sochör son deng, aranoch o brsade ftyggörmed. ochartiljupppt odenuskvigdekadens, t deskarör vå hoch s ber föve, en boma vtärtit ha, Markov, ordning 2: Med går, tashet. Fares, var som jung När må lagar och vinrödet De dig för mott bröder dardin Jest, prett konom forslöver: 2 för icklara säkt. 5 Akblom i Jort at Markov, ordning 3: Mina arbort Likas rätt milja derna, 60. Då när mina vand böner kommitt de ifrån nu Heles skapade: på Herren. Han införlåter. På David beskänning, ty 1 Mosebok (Lev Markov, ordning 4: Jag sågen pust att hjärtan för mig, jag lämna icke vid namn av havet, godelaktning. Till se mig, vagnens och mark ut bliva månade skola och sitt talats ting,

Källkodning Källkodning innebär att vi tilldelar binära sekvenser (kallade kodord) till symboler i ett alfabet. Mängden av alla kodord kalls för kod. En kod där antalet bitar i varje kodord är fixt kallas för en fixlängdskod. En kod där kodorden har olika antal bitar kallas för en variabellängdskod. Exempel: A = {a, b, c, d} Symbol Kod 1 Kod 2 Kod 3 Kod 4 Kod 5 a 00 0 0 0 0 b 01 0 1 10 01 c 10 1 00 110 011 d 11 10 11 111 111

Källkodning Koda sekvensen abbacddcd med våra koder Symbol Kod 1 Kod 2 Kod 3 Kod 4 Kod 5 a 00 0 0 0 0 b 01 0 1 10 01 c 10 1 00 110 011 d 11 10 11 111 111 Kod 1: 000101001011111011 Kod 2: 000011010110 Kod 3: 01100011110011 Kod 4: 010100110111111110111 Kod 5: 001010011111111011111

Egenskaper hos koder Om man från en sekvens av kodord kan återskapa den ursprungliga källsekvensen kallas koden för unikt avkodbar. Om man kan känna igen kodorden direkt vid avkodning, kallas koden momentant avkodbar (instantaneous). Om inget kodord är prefix till något annat kodord kallas koden för en prefixkod. Dessa koder är trädkoder, dvs kodorden är löv i ett binärt träd. Alla prefixkoder är momentant avkodbara.

Exempel på koder Symbol Kod 1 Kod 2 Kod 3 Kod 4 Kod 5 a 00 0 0 0 0 b 01 0 1 10 01 c 10 1 00 110 011 d 11 10 11 111 111 Kod 1: Unikt avkodbar, momentant avkodbar Kod 2: Ej unikt avkodbar Kod 3: Ej unikt avkodbar Kod 4: Unikt avkodbar, momentant avkodbar Kod 5: Unikt avkodbar, ej momentant avkodbar

Är en given kod unikt avkodbar eller ej? Gör en lista av alla kodord. Undersök alla par av element i listan för att se om något element är prefix till ett annat element. I sådana fall lägg till suffixet till listan, om det inte redan finns där. Repetera tills en av två saker händer: 1. Man hittar ett suffix som är ett kodord. 2. Man hittar inga nya suffix att lägga till listan. I fall 1 är koden inte unikt avkodbar, i fall 2 är koden unikt avkodbar.

Prestanda för koder Hur bra en kod är ges av dess (medel)datatakt R (eng. rate) och anges i bitar/symbol. R = antal bitar per kodord i medel antal symboler per kodord i medel Eftersom det är komprimering vi sysslar med vill vi förstås att R ska vara så liten som möjligt. Det existerar en teoretisk lägre gräns för hur mycket vi kan komprimera signalen. Observera att R är ett mått på hur bra koden är i medel över alla möjliga sekvenser från källan. Den säger ingenting om hur bra koden är för en enskild källsekvens.

Krafts olikhet, kodordsmedellängd Krafts olikhet: En momentant avkodbar kod (trädkod) med kodordslängderna l 1,..., l N existerar omm N 2 l i 1 i=1 Olikheten gäller även för alla unikt avkodbara koder. Den brukar då kallas Kraft-McMillans olikhet. Kodordsmedellängd: N l = p i l i i=1 [bitar/kodord] Om vi kodar en symbol per kodord så har vi att R = l

Entropin som nedre gräns Det finns en lägre gräns för hur bra en unikt avkodbar kod kan bli: N l p i log 2 p i = H(X t ) i=1 H(X t ) kallas för källans entropi (mer om det på följande föreläsningar).

Entropin som nedre gräns, forts. Bevis för l H(X t ) H(X t ) l = = N i=1 N p i log 2 p i i=1 1 ln 2 N p i l i = i=1 p i (log 2 1 p i log 2 2 l i ) = i=1 N i=1 p i (log 2 1 p i l i ) N 2 l i p i log 2 i=1 N p i ( 2 l i 1) = 1 N p i ln 2 ( 2 l i 1 (1 1) = 0 ln 2 där vi utnyttjat ln x x 1 samt Kraft-McMillans olikhet i=1 p i N p i ) i=1

Optimala koder En optimal kod för en källa är en kod sådan att det inte existerar andra koder med lägre l. En optimal kod är oftast inte unik, d.v.s. det existerar flera olika koder med samma prestanda. Det enklaste exemplet på detta är att bara byta nollor mot ettor och ettor mot nollor i kodorden. Ofta kan man även konstruera koder där uppsättningen av kodordslängder skiljer sig åt, men som har samma medelkodordslängd.

Övre gräns för optimala koder Det existerar en unikt avkodbar kod med l < H(X t ) + 1 Bevis: Låt l i = log 2 p i = log 2 p i + s i där 0 s i < 1 N 2 l i = i=1 = N i=1 2 log 2 p i s i N p i 2 s i i=1 N p i = 1 i=1 Kraft-McMillans olikhet är uppfylld, alltså existerar en unikt avkodbar kod med de givna kodordslängderna

Övre gräns, forts. Vad är kodordsmedellängden? N l = p i l i = i=1 = < N p i ( log 2 p i + s i ) i=1 N p i log 2 p i + i=1 N p i log 2 p i + i=1 N p i s i i=1 N p i = H(X t ) + 1 Den optimala koden kan ju inte vara sämre än denna kod, då vore det ingen optimal kod. Alltså gäller även för en optimal kod att l < H(X t ) + 1. OBS: Om p i = 2 k i, i för heltal k i, så kan vi konstruera en kod med l = H(X t ). i=1

Huffmankodning Enkel metod för att konstruera optimala koder. Börja med enskilda symboler som löv. Slå i varje steg ihop de två minst sannolika noderna till en inre nod. Sannolikheten för den nya noden är summan av de två ursprungliga noderna. Om det finns fler noder med samma sannolikhet att välja mellan spelar det ingen roll vilken vi väljer. När vi konstruerat hela kodträdet, skapar vi kodorden genom att sätta 0 resp. 1 på de utgående grenarna i varje nod. Vilken gren som sätts till 0 resp. 1 spelar ingen roll.

Utvidgning För små alfabet med skeva fördelningar, eller för källor med minne, kan en huffmankod vara ganska långt från optimal. Detta kan ofta förbättras om man utvidgar källan, dvs man kodar fler symboler i taget med varje kodord. Om man kodar n symboler med varje kodord, och koden har kodordsmedellängden l så blir datatakten R = l n Den maximala redundansen (skillnanden mellan datatakten och entropin) minskar som 1 n när vi kodar n symboler i taget.

Sidoinformation Hittills har vi bara tittat på kodens datatakt R för att bedöma hur bra eller dålig den är. I en praktisk tillämpning måste man även tänka på att man kan behöva överföra sidoinformation för att mottagaren ska kunna avkoda signalen. Till exempel kan man behöva tala om för mottagaren vilket alfabet som används och hur kodträdet ser ut. I de flesta fall känner dock mottagaren till alfabetet. Ett rättframt sätt att beskriva ett kodträd är att för varje symbol först tala om hur långt dess kodord är och sen skicka kodordet. Om alfabetsstorleken är N så kan kodorden maximalt vara N 1 bitar långa, under förutsättningen att koden är optimal. Om kodordslängderna är l 1,..., l N så går det alltså åt N log(n 1) + bitar för att beskriva trädet på detta sätt. N i=1 l i

Sidoinformation, forts. Givet kodordslängderna spelar det i de flesta fall ingen roll exakt hur kodorden ser ut. Om både kodaren och avkodaren använder samma algoritm för att konstruera en kod utgående från kodordslängder, så räcker det med att skicka dessa längder som sidoinformation. I praktiken kan det gå till så att kodaren använder huffmanalgoritmen för att konstruera en kod, noterar kodordslängderna och sen slängder bort koden. Kodordslängderna används för att konstruera en ny kod, som har samma datatakt som den ursprungliga. Avkodaren kan konstruera samma kod givet längderna. I detta fall räcker det alltså att skicka N log(n 1) bitar som sidoinformation. Om mängden data som ska skickas är stor så inverkar inte sidoinformationen särskilt mycket på den totala datatakten, men om datamängden är liten eller om man har stora och/eller många koder kan det vara en signifikant andel.

Skurlängdskodning Ibland har man källor som producerar långa delsekvenser av samma symbol. Det kan då vara praktiskt att istället för att beskriva sekvensen som en följd av enstaka symboler, se sekvensen som en följd av skurar. En skur är en tupel som talar om dels vilken symbol som skuren består av och dels hur lång skuren är. Till exempel så kan man beskriva sekvensen som aaaabbbbbbbccbbbbaaaa (a, 4)(b, 7)(c, 2)(b, 4)(a, 4) Man beskriver alltså sekvensen med ett annat alfabet än det ursprungliga. Vinsten är att det kan vara enklare att hitta en effektiv kod för det nya alfabetet, samt att man lättare kan utnyttja källans minne.

Faxkodning Faxkodning är ett typiskt exempel på när man använder skurlängdskodning. Det finns två digitala faxstandarder: Grupp 3 (T.4) och grupp 4 (T.6). En faxmaskin läser av en sida en rad i taget (1728 punkter per linje på en A4). Varje punkt är antingen vit eller svart. Typiskt får man skurar av vita respektive svarta bildpunkter. En rad kan antingen kodas separat eller med hjälp av föregående rad.

Faxkodning, forts. När man kodar en rad separat, används skurlängdskodning. Eftersom det möjliga antalet skurlängder är så stort skulle det vara opraktiskt att ha en huffmankod över alla skurlängder. Istället beskriver man en skurlängd r som r = 64 m + t, t = 0,..., 63 och m = 1,..., 27 Man inför även en extra symbol som talar om att raden är slut (EOL), dvs att resten av raden har samma färg. Den första skuren på en rad antas vara vit. Alfabetet med olika m, t och EOL kodas med fixa trädkoder, en vardera för vita respektive svarta skurar. Denna typ av kodning kallas MH (modified huffman).

Faxkodning, forts. Två rader efter varandra är förmodligen ganska lika varandra. Detta kan utnyttjas vid kodningen. Några definitioner: a 0 a 1 a 2 b 1 b 2 Den sista bildpunkten på en rad som är känd för både sändare och mottagare, dvs aktuell position på raden. När man börjar är det en tänkt vit bildpunkt till vänster om radens första punkt. Första bildpunkt till höger om a 0 med motsatt färg. Känd endast av sändaren. Första bildpunkt till höger om a 1 med motsatt färg. Känd endast av sändaren. Första bildpunkt till höger om a 0 på raden ovanför som har motsatt färg. Känd av både sändare och mottagare. Första bildpunkt till höger om b 1 som har motsatt färg. Känd av både sändare och mottagare.

Faxkodning, forts. Vid kodningen får man tre fall 1. Om både b 1 och b 2 ligger mellan a 0 och a 1 så skickas kodordet 0001. Alla bildpunkter fram till punkten under b 2 har samma färg. Denna punkt blir vår nya a 0. Nya b 1 och b 2 tas fram. 2. a 1 ligger före b 2 och avståndet mellan b 1 och a 1 är högst 3. Avståndet { 3, 2, 1, 0, 1, 2, 3} kodas med {0000011, 000011, 011, 1, 010, 000010, 00000010}. a 1 blir ny a 0. 3. I övriga fall skickas 001 och skurlängderna från a 0 till a 1 och från a 1 till a 2 kodas med den endimensionella koden.

Faxkodning, forts. I grupp 3 använder man båda metoderna och kodar med jämna mellanrum en rad rent endimensionellt, för att eventuella överföringsfel inte ska fortplanta sig till hela bilden. Denna kodningsmetod kallas MR (modified READ). I grupp 4 använder man bara den tvådimensionella metoden. Detta kallas MMR (modified MR).

Golombkoder Koder för att koda heltal med monotont avtagande sannolikheter. A = {0, 1, 2,...} Välj parameter m Representera heltalet n med q = n m och r = n qm. Koda q som q stycken 1:or följt av en 0:a. Om m är en jämn tvåpotens, koda r binärt med log m bitar. Om m inte är en jämn tvåpotens 0 r < 2 log m m Koda r med log m bitar 2 log m m r m 1 Koda r + 2 log m m med log m bitar

Golombkoder, forts. Golombkoder är optimala för fördelningar av typen om man väljer m = 1 log p P(n) = p n (1 p) ; n = 0, 1, 2,... I praktiken begränsar man sig ofta till jämna tvåpotenser: m = 2 k Fördelen med golombkoder, jämfört med huffmankoder, är att sidoinformationen är mycket mindre. För en huffmankod måste man skicka hela kodträdet, men för en golombkod räcker det med att skicka parametern m. Man behöver inte heller hålla hela kodträdet i minnet, varken på kodar- eller avkodarsidan. Golombkoder används bl.a. i bildkodningsstandarden JPEG-LS.

Exempel, bildkodning Originalbild, 768 512 bildpunkter, 8 bitar per bildpunkt

Huffmankodning Vi använder histogrammet som skattning av fördelningen av pixelvärden. 6000 5000 4000 3000 2000 1000 0 0 50 100 150 200 250 En huffmankod som optimeras till denna fördelning kodar bilden med 2954782 bitar, plus 1280 bitar sidoinformation. Detta ger oss en datatakt på ungefär 7.51 bitar/bildpunkt.

Huffmankodning av skillnader För att utnyttja minnet tar vi skillnaden mellan en pixel och pixeln ovanför. 8 x 104 7 6 5 4 3 2 1 0 250 200 150 100 50 0 50 100 150 200 250 En huffmankod som optimeras till denna fördelning kodar bilden med 1622787 bitar, plus 2075 bitar sidoinformation. Detta ger oss en datatakt på ungefär 4.13 bitar/bildpunkt.

Golombkodning av skillnader I För att kunna göra golombkodning av skillnadsvärdena måste vi ha ett alfabet med ickenegativa värden. Till exempel kan man koda absolutvärdet med en golombkod och sen skicka en teckenbit för varje nollskilt värde. 10 x 104 9 8 7 6 5 4 3 2 1 0 50 0 50 100 150 200 250 Den bästa golombkoden för denna fördelning är m = 3. Detta ger oss 1438806 bitar, 317104 teckenbitar och 8 bitar sidoinformation. Datatakten blir ungefär 4.47 bitar/bildpunkt.

Golombkodning II En annan variant är att representera positiva värden med jämna tal och negativa värden med udda tal. 8 x 104 7 6 5 4 3 2 1 0 50 0 50 100 150 200 250 300 350 400 450 Den bästa golombkoden för denna fördelning är m = 6. Detta ger oss 1760618 bitar och 8 bitar sidoinformation. Datatakten blir ungefär 4.48 bitar/bildpunkt.

Information och entropi X diskret stokastisk variabel Fördelning Självinformation för utfallen p i = P(a i ) = Pr(X = a i ) i(a i ) = log p i Logaritmen kan tas i godtycklig bas, av praktiska skäl så använder man nästan alltid basen 2. Enheten för informationen kallas då bitar. Ju lägre sannolikheten för ett utfall är, desto större är informationen i det utfallet. p i = 1 = i(a i ) = 0

Entropi Medelvärdet av informationen kallas entropi H(X ) = N N p i i(a i ) = p i log p i i=1 Entropin kan ses som ett mått på medelinformationen i X, eller osäkerheten om X. i=1 0 H(X ) log N Entropin är maximal då alla utfall är lika sannolika. Om något av utfallen har sannolikheten 1 (och de andra utfallen alltså har sannolikheten 0) så är entropin 0, dvs det finns ingen osäkerhet.

Entropi, forts. Två stokastiska variabler X och Y med alfabeten A respektive B. P XY (a i, b j ) = P X (a i ) P Y X (b j a i ) = P Y (b j ) P X Y (a i b j ) Betingad entropi H(Y X ) = i,j P XY (a i, b j ) log P Y X (b j a i ) H(Y X ) H(Y ) med likhet om X och Y är oberoende Blockentropi H(X, Y ) = i,j P XY (a i, b j ) log P XY (a i, b j ) H(X, Y ) = H(X ) + H(Y X ) = H(Y ) + H(X Y )

Entropi för källor Källa X t (stationär stokastisk process) Första ordningens entropi för källan Betingad entropi H(X t ) = N N p i i(a i ) = p i log p i i=1 med likhet om X t är minnesfri. Andra ordningens entropi i=1 H(X t X t 1 ) H(X t ) H(X t 1, X t ) = H(X t 1 ) + H(X t X t 1 ) 2 H(X t ) n-te ordningens entropi H(X 1,..., X n ) = H(X 1 )+H(X 2 X 1 )+...+H(X n X 1... X n 1 ) n H(X t )

Entropi för källor, forts. Källans entropi (kallas även entropitakt) lim n 1 n H(X 1... X n ) = lim n H(X n X 1... X n 1 ) För en minnesfri källa är entropin lika med första ordningens entropi. För en markovkälla av ordning k är entropin lika med H(X t X t 1... X t k ) Entropin ger en teoretisk lägsta gräns för hur bra man kan koda källan.

Problem med huffmankodning Huffmankodning är teoretiskt optimalt, men kan vara opraktiskt för skeva fördelningar och/eller när man utvidgar källan. Ex: A = {a, b, c}, P(a) = 0.95, P(b) = 0.02, P(c) = 0.03 Entropin för källan är 0.3349. Kodordsmedellängden för en huffmankod är 1.05 bitar/symbol, dvs mer än 3 gånger så stor som entropin. Om vi vill att kodordsmedellängden inte ska ligga mer än 5% från entropin måste vi utvidga källen och koda 8 symboler i taget. Detta ger en huffmankod med 3 8 = 6561 kodord. Vi skulle vilja ha en kodningsmetod där vi direkt kan ta fram kodorden för en given sekvens utan att behöva räkna fram kodorden för alla möjliga sekvenser. Ett sätt att göra detta är aritmetisk kodning.

Aritmetisk kodning Vi identifierar varje sekvens av källsymboler med ett tal i intervallet [0, 1). Vi gör det med hjälp av fördelningsfunktionen (cumulative distribution function) F X (i). För att få en enklare beskrivning så antar vi, utan att förlora i generalitet, att alfabetet består av heltal. A = {1, 2,..., N} Pr(X = i) = P(i) F (i) = i P(k) k=1 F (0) = 0 Exempel: A = {1, 2, 3} P(1) = 0.5, P(2) = 0.3, P(3) = 0.2 F (0) = 0, F (1) = 0.5, F (2) = 0.8, F (3) = 1

Aritmetisk kodning, forts. Antag att vi vill koda en sekvens x = x 1, x 2,..., x n. Man börjar med hela sannolikhetsintervallet [0, 1). I varje steg delar man in sitt intervall proportionellt enligt fördelningsfunktionen F (i) och väljer just det delintervall som motsvarar den symbol som kodas. Varje symbolsekvens av längd n ger ett unikt delintervall. Kodordet för sekvensen är ett tal i intervallet. Antal bitar i kodordet beror av intervallets storlek, så ett stort intervall (dvs en sekvens med hög sannolikhet) får ett kort kodord, medan ett litet intervall ger ett längre kodord.

Iterativ intervalluppdelning Antag att vi vill koda en sekvens x = x 1, x 2,..., x n. Vi betecknar den undre gränsen i motsvarande intervall med l (n) och den övre gränsen med u (n). Man kan då enkelt visa att l (n) = l (n 1) + (u (n 1) l (n 1) )F (x n 1) u (n) = l (n 1) + (u (n 1) l (n 1) )F (x n ) Startvärden är hela intervallet Mittpunkten i intervallet ges av l (0) = 0 u (0) = 1 T X (x) = l (n) + u (n) 2

Kodord Hur tar vi fram ett kodord b 1 b 2... b m för vårt intervall? Vi önskar förstås att koden är en prefixkod, dvs att kodordet entydigt pekar ut vårt intervall. Några alternativ: 1. Hitta det kortaste binära tal (0.b 1 b 2... b m ) 2 sådant att och (0.b 1 b 2... b m ) 2 l (n) (0.b 1 b 2... b m 1111...) 2 = (0.b 1 b 2... b m ) 2 + 2 m < u (n) För att detta ska vara möjligt krävs att m = log P(x), eller m = log P(x) + 1, beroende på intervallet. 2. Tag den binära representationen av T X (x) och trunkera den till m = log P(x) + 1 bitar.

Minneskällor Vid aritmetisk kodning av minneskällor låter man intervalluppdelningen bero av tidigare symboler, dvs man använder olika F i varje steg beroende på vad tidigare symboler varit. Exempelvis, om vi har en binär markovkälla X t av ordning 1 med alfabetet {1, 2} och övergångssannolikheterna P(x t+1 x t ) P(1 1) = 0.8, P(2 1) = 0.2, P(1 2) = 0.1, P(2 2) = 0.9 så kommer vi att använda två olika fördelningsfunktioner F 1 (0) = 0, F 1 (1) = 0.8, F 1 (2) = 1 F 2 (0) = 0, F 2 (1) = 0.1, F 2 (2) = 1 För den första symbolen i sekvensen kan man antingen välja någon av de två fördelningarna, eller så använder man en tredje fördelningsfunktion baserad på de stationära sannolikheterna.

Datatakt för aritmetisk kodning Datatakten blir generellt och för en minnesfri källa 1 n H(X 1... X n ) R 1 n H(X 1... X n ) + 2 n H(X ) R H(X ) + 2 n Teoretiskt sett lite sämre än huffmankodning. Eftersom komplexiteten för kodaren inte beror på antalet symboler n vi kodar i taget, är det mycket enklare att komma nära entropigränsen än med en huffmankod.

Praktiska problem Vi har begränsad precision och kan inte lagra intervallgränser och sannolikheter med godtycklig noggrannhet. Vi vill kunna börja skicka bitar utan att vänta på att hela sekvensen med n symboler kodats. En lösning är att skicka bitar så snart vi är säkra på dem och att när detta görs skala om intervallet, så att vi maximalt utnyttjar den tillgängliga precisionen. Om den första biten i både den lägre och den övre gränsen är den samma måste även den biten i kodordet vara densamma. Då kan man skicka den biten och därefter skifta gränserna en bit, dvs skala om intervallstorleken med en faktor 2.

Fixpunktsaritmetik Aritmetisk kodning implementeras oftast med fixpunktsaritmetik. Antag att intervallgränserna l (n) och u (n) lagras som heltal med m bitars noggrannhet och att fördelningsfunktionen F (i) lagras som heltal med k bitars noggrannhet. Algoritmen kan då modifieras till l (n) = l (n 1) + (u(n 1) l (n 1) + 1)F (x n 1) 2 k u (n) = l (n 1) + (u(n 1) l (n 1) + 1)F (x n ) 2 k 1 Startvärden blir l (0) = 0 och u (0) = 2 m 1.

Intervallskalning Fallen när vi ska göra intervallskalning blir: 1. Intervallet ligger helt inom [0, 2 m 1 1], dvs den mest signifikanta biten i både l (n) och u (n) är 0. Skifta ut mest signifikant bit ur l (n) och u (n) och skicka den. Skifta in 0 i l (n) och 1 i u (n). 2. Intervallet ligger helt inom [2 m 1, 2 m 1], dvs den mest signifikanta biten i både l (n) och u (n) är 1. Samma operationer som i fall 1. När vi har kodat våra n symboler avslutas kodordet genom att vi skickar alla m bitar i l (n). Koden kan visserligen bli en prefixkod även med färre bitar, men implementationen av avkodaren blir enklare om hela l skickas. För stora n blir de extra bitarna försumbara, dessutom måste man förmodligen ändå lagra bitarna i ett helt antal bytes.

Mer problem Tyvärr kan vi i vår algoritm hamna i problem, om den första biten i l hela tiden är 0 och den första biten i u är 1. I värsta fall hamnar vi i situationen att l = 011... 11 och u = 100... 00. Då kommer vår algoritm inte att fungera. Lyckligtvis kan vi komma runt detta problem. Om de två första bitarna i l blir 01 och de två första i u blir 10, kan vi göra ett bitskift, utan att skicka några bitar i kodordet. När sen de första bitarna i l och u blir detsamma kan vi förutom den biten även skicka en extra, inverterad bit, dvs vi är då säkra på om kodordet ska ha 01 eller 10.

Intervallskalning Vi får nu tre fall 1. Intervallet ligger helt inom [0, 2 m 1 1], dvs den mest signifikanta biten i både l (n) och u (n) är 0. Skifta ut mest signifikant bit ur l (n) och u (n) och skicka den. Skifta in 0 i l (n) och 1 i u (n). 2. Intervallet ligger helt inom [2 m 1, 2 m 1], dvs den mest signifikanta biten i både l (n) och u (n) är 1. Samma operationer som i fall 1. 3. Vi har inte fall 1 eller 2, men intervallet ligger helt inom [2 m 2, 2 m 1 + 2 m 2 1], dvs de två mest signifikanta bitarna är 01 i l (n) och 10 i u (n). Skifta ut mest signifikant bit ur l (n) och u (n). Skifta in 0 i l (n) och 1 i u (n). Invertera de nya mest signifikanta bitarna i l (n) och u (n). Skicka inga bitar, men håll reda på hur många gånger vi gör omskalningar av den här typen. Nästa gång vi gör en omskalning av typen 1, skicka lika många 1:or extra som antalet omskalningar av typ 3. På samma sätt, nästa gång vi gör en omskalning av typ 2 så skickas lika många extra 0:or som antalet omskalningar av typ 3.

Krav på precisionen Vi måste använda en datatyp med minst m + k bitar för att få plats med delresultaten i beräkningarna. Vi ser också att det minsta intervall vi kan ha utan att någon omskalning görs har storleken 2 m 2 + 1, vilket till exempel händer när l (n) = 2 m 2 1 och u (n) = 2 m 1. För att algoritmen ska fungera får aldrig u (n) bli mindre än l (n) (samma värde är tillåtet, när man skiftar ut bitar skiftas ju nollor in i l och ettor in i u). För att detta ska gälla måste alltså alla intervall i fördelningsfunktionen uppfylla (med en lätt överskattning) F (i) F (i 1) 2 k m+2 ; i = 1,..., L Till exempel så måste m k + 2 om vi har något intervall av storlek 1.

Avkodning Starta avkodaren i samma tillstånd (dvs l = 0 och u = 2 m 1) som kodaren. Inför t som de m första bitarna i bitströmmen (kodordet). I varje steg räknar vi ut talet (t l + 1) 2k 1 u l + 1 Jämför detta tal med F för att se vilket intervall detta motsvarar. Detta ger en avkodad symbol. Uppdatera l och u på samma sätt som i kodaren. Vi gör eventuellt ett antal skift (omskalningar). Varje gång vi skalar om l och u ska vi även uppdatera t på samma sätt (skifta ut den mest signifikanta biten, skifta in en ny bit från kodströmmen som minst signifikant bit samt, om det är en om skalning av typ 3, invertera den nya mest signifikanta biten.) Repetera tills hela sekvensen är avkodad. Observera att kodaren kan behöva skicka antalet symboler som sidoinformation, så att avkodaren vet när den ska sluta avkoda. Alternativt kan man införa en extra symbol i sitt alfabet, med lägsta möjliga sannolikhet, som används för att markera när sekvensen tar slut.

Lempel-Zivkodning Koda symbolsekvenser genom referenser till vad som hänt tidigare i sekvensen. Två huvudtyper: Använd en historiebuffert, koda en delsekvens som en pekare till när sekvensen uppträdde senast (LZ77). Bygg upp en ordbok av alla unika delsekvenser som uppträder, koda referenser till tidigare ord (LZ78). Lempel-Zivkodning är mycket använd för filkomprimering, t.ex. zip, gzip, ARJ och compress. Lempel-Ziv används även i bildkomprimeringsstandarderna GIF och PNG, samt i modemstandarden V.42bis. Kodaren och avkodaren behöver inte känna till källans statistik. Prestanda kommer ändå asymptotiskt att gå mot entropigränsen. En sådan kodningsmetod kallas universell.

LZ77 Lempel och Ziv, 1977. Betrakta sekvensen som ska kodas genom ett glidande fönster. Fönstret delas i två delar, en del som innehåller redan kodade symboler (search buffer) och en del som innehåller symboler som ska kodas härnäst (look-ahead buffer). Hitta den längsta sekvens i search buffer som matchar den sekvens som börjar i look-ahead buffer. Skicka en trippel < o, l, c > där o är en pekare till hur långt in i search buffer sekvensen börjar, l är längden av sekvensen, och c är nästa symbol som inte matchade. Denna trippel kodas enklast med ett fixlängds kodord. Antalet bitar som krävs är log S + log W + log N där S är storleken på search buffer, W storleken på look-ahead buffer och N är alfabetets storlek.

Förbättringar av LZ77 Det är onödigt att skicka en pekare och en längd om vi inte hittade en matchande sekvens. Dessutom behöver vi bara skicka en ny symbol då vi inte hittade någon matchande sekvens. Inför istället en extra flaggbit som talar om om vi hittade en match eller inte. Antingen skickar vi alltså < 0, o, l > eller < 1, c >. Denna variant brukar kallas LZSS (Storer och Szymanski, 1982). Beroende på buffertstorlekarna kan det löna sig att koda korta matchningar som enstaka symboler istället. I början av kodningen, innan historiebufferten blivit fylld, kan man använda kortare kodord för o och l. Alla o, l och c är inte lika sannolika, så man kan få ytterligare kompression genom att koda dem med variabellängdskoder.

LZ78 Lempel och Ziv, 1978. En ordbok av unika sekvenser byggs upp. Storleken på ordboken S. I början är ordboken tom, sånär som på index 0 som betyder ingen match. Varje ny sekvens som kodas skickas som tupeln < i, c > där i är index i ordboken för den längsta matchande sekvens vi hittar och c är nästa tecken i indata som inte matchade. Antalet bitar som krävs är log S + log N Vid avkodningen kan avkodaren bygga en identisk ordbok, så man behöver inte skicka någon sidoinformation.

Vad gör man när ordboken blir full? Några olika alternativ finns: Släng bort ordboken och börja om. Fortsätt koda med ordboken, men skicka bara index och lägg inte till några nya ord. Som ovan, men bara så länge som kompressionen är bra. Om den blir för dålig, släng ordboken och börja om. I det tredje fallet brukar man lägga till en extra symbol i alfabetet som talar om för avkodaren att den ska slänga ordboken och börja om.

LZW Variant av LZ78 (Welch, 1984) Istället för att skicka en tupel < i, c > skickar man bara index i till ordboken. För att det ska fungera måste startordboken innehålla alla enstaka symboler i alfabetet. Hitta den längsta matchande sekvensen i ordboken och skicka indexet som ett kodord. Den matchande sekvensen plus nästa symbol läggs som ett nytt ord i ordboken.

Andra universella kodningsmetoder Adaptiv huffmankodning och adaptiv aritmetisk kodning. Vid adaptiv kodning startar man med en känd sannolikhetsmodell. Varje gång man kodar en symbol uppdaterar man sin sannolikhetsmodell. Avkodaren börjar med samma kända modell, och efter varje avkodad symbol uppdateras modellen. Man behöver inte skicka sidoinformation om sannolikheter eller kodträd, eftersom avkodaren kan återskapa samma information som kodaren har.

Lossless JPEG JPEG är normalt en kodningsmetod för bilder som ger distorsion, men det finns även distorsionsfri mod i standarden. Bildpunkterna kodas radvis uppifrån och ner. Bildpunkten värde I ij på position (i, j) predikteras från närliggande bildpunkters värde. Det finns 7 prediktorer att välja bland: 1. Îij = I i 1,j 2. Î ij = I i,j 1 3. Îij = I i 1,j 1 4. Îij = I i,j 1 + I i 1,j I i 1,j 1 5. Î ij = I i,j 1 + (I i 1,j I i 1,j 1 )/2 6. Îij = I i 1,j + (I i,j 1 I i 1,j 1 )/2 7. Î ij = (I i,j 1 + I i 1,j )/2

Lossless JPEG, forts. Skillnaden d ij = I ij Îij kodas antingen med en adaptiv aritmetisk kodare, eller med en huffmankod. Huffmankodning sker inte direkt på skillnadsvärdena. Istället bildar man k ij = log( d ij + 1) Man beräknar statistik och bygger ett huffmanträd för signalen k ij. Kodordet för en skillnad d ij består av huffmankodordet för k ij plus k ij stycken extra bitar för att exakt specificera d ij. k ij d ij extra bitar 0 0 1 1, 1 0, 1 2 3, 2, 2, 3 00, 01, 10, 11 3 7,..., 4, 4,..., 7 000,..., 011, 100,..., 111.....

Testbild, gråskala Originalbild, 768 512 bildpunkter, 8 bitar per bildpunkt

Testbild, färg Originalbild, 768 512 bildpunkter, 24 bitar per bildpunkt

Kodning med lossless JPEG Antal bitar per bildpunkt vid kodning av de två testbilderna med de olika prediktorerna gråskala färg Prediktor 1 4.35 13.15 Prediktor 2 4.17 12.58 Prediktor 3 4.55 13.79 Prediktor 4 4.26 12.83 Prediktor 5 4.15 12.51 Prediktor 6 4.09 12.33 Prediktor 7 4.00 12.07

JPEG-LS Standard från 1997 för att koda bilder distorsionsfritt och nästan distorsionsfritt (near lossless). Nästan distorsionsfritt innebär att man tillåter att bildpunktsvärdena i den avkodade bilden avviker lite från originalbilden. Bildpunkterna kodas radvis uppifrån och ner. När bildpunkten (i, j) ska kodas tittar man först på de omgivande bildpunkterna i position (i, j 1), (i 1, j 1), (i 1, j) och (i 1, j + 1). Man bildar en kontext genom att först beräkna gradienterna D 1 = I i 1,j+1 I i 1,j D 2 = I i 1,j I i 1,j 1 D 3 = I i 1,j 1 I i,j 1

JPEG-LS, forts. Gradienterna D k kvantiseras sen till tre heltal Q k så att 4 Q k 4. Kvantiseringsgränserna kan väljas av användaren. De tre talen Q k används för att räkna fram ett tal q som ligger mellan 0 och 364. Detta tal är vår kontext. Prediktionen av I ij görs enligt: Om I i 1,j 1 max(i i,j 1, I i 1,j ) Î ij = max(i i,j 1, I i 1,j ) Om I i 1,j 1 min(i i,j 1, I i 1,j ) Îij = min(i i,j 1, I i 1,j ) Annars: Îij = I i,j 1 + I i 1,j I i 1,j 1 För varje kontext q håller vi reda på om vår prediktion har ett systematiskt fel, om så är fallet justeras prediktionen lite i rätt riktning.

JPEG-LS, forts. Skillnaden mellan det riktiga pixelvärdet och det predikterade värdet d ij = I ij Î ij kodas med en golombkod med parameter m = 2 kq. För varje kontext q håller man reda på vilken golombkod som är optimal, och k q justeras hela tiden adaptivt under kodningsprocessen. Kodaren detekterar även om det uppträder långa skurar med samma värde i rad, i sådana fall går den över till att koda skurlängder istället. Kodar vi våra testbilder med JPEG-LS får vi en medeldatatakt på 3.54 bitar/bildpunkt för gråskalebilden och 10.61 bitar/bildpunkt för färgbilden.

GIF (Graphics Interchange Format) Två standarder: GIF87a och GIF89a. Man specificerar en virtuell skärm. På denna skärm läggs mindre bilder in. För varje liten bild skickas position (i den virtuella skärmen) och storlek. I det enklaste fallet har man bara en bild som är lika stor som den virtuella skärmen. Man använder färgtabeller om maximalt 256 färger. Varje delbild kan ha sin egen färgtabell, men kan även använda en global färgtabell. Färgtabellsindex för pixlarna kodas med LZW. Två extra symboler används i alfabetet: ClearCode, som markerar att vi ska kasta ordboken och börja om, och EndOfInformation, som markerar att kodströmmen är slut. Interlace: Först skickar man linje 0, 8, 16,... sen linje 4, 12, 20,... sen linje 2, 6, 10,... och sist linje 1, 3, 5,... I GIF89a har man lagt till saker som animering och transparens.

GIF, ingen interlace En fjärdedel av informationen mottagen.

GIF, interlace En fjärdedel av informationen mottagen. För linjer som inte mottagits än kopierar man bildpunkter från linjen ovanför.

GIF, forts. För vår gråskaletestbild får vi en medeldatatakt om 7.07 bitar/bildpunkt (inte särskilt hög kompression). GIF passar bättre för syntetiska bilder med stora områden med samma färg. Vi kan inte göra en jämförelse med andra kodningsmetoder för färgbilden, eftersom vi måste reducera antalet färger till 256.

PNG (Portable Network Graphics) Togs fram som en ersättare till GIF, bland annat p.g.a. problem med patent. Använder en variant av LZ77 som kallas Deflate för att koda bilden. Det är samma metod som används i zip och gzip. Historiebufferten har storlek 32768. Matchlängderna kan vara mellan 3 och 258. Längder och enstaka symboler kodas med ett gemensamt alfabet, antingen med en fix huffmankod eller en dynamisk huffmankod. Även offset kodas med variabellängds kodord, med kortare kodord för lägre värden. Klarar färgupplösning upp till 48 bitar (16 bitar per färgkomponent). Alfakanal (generell transparens). Se även: ftp://ftp.uu.net/graphics/png/ http://www.ietf.org/rfc/rfc1950.txt http://www.ietf.org/rfc/rfc1951.txt http://www.ietf.org/rfc/rfc2083.txt

PNG, forts. Stödjer 5 olika prediktorer (kallade filter): 0 Ingen prediktion 1 Îij = I i,j 1 2 Î ij = I i 1,j 3 Îij = (I i 1,j + I i,j 1 )/2 4 Paeth (välj den av I i 1,j, I i,j 1 och I i 1,j 1 som ligger närmast I i 1,j + I i,j 1 I i 1,j 1 ) Vilket filter som används kan väljas separat för varje linje i bilden. Kodar vi våra testbilder med PNG får vi en medeldatatakt på 3.97 bitar/bildpunkt för gråskalebilden och 11.36 bitar/bildpunkt för färgbilden.

Sammanfattning Metod gråskala färg Huffman 7.51 Huffman, differensdata 4.13 Golomb, differensdata, var. I 4.47 Golomb, differensdata, var. II 4.48 Lossless JPEG 4.00 12.07 JPEG-LS 3.54 10.60 GIF 7.07 PNG 3.97 11.36 OBS! Detta var bara två testbilder, för mer ingående jämförelser bör man pröva metoderna på ett stort antal bilder.