DIPLOMOVÁ PRÁCE. Jan Ondruš Bezztrátová komprese JPEG grafiky

Podobné dokumenty
Kosinová transformace 36ACS

Kompresní algoritmy grafiky. Jan Janoušek F11125

KOMPRESE OBRAZŮ. Václav Hlaváč, Jan Kybic. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání.

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Komprese dat Obsah. Komprese videa. Radim Farana. Podklady pro výuku. Komprese videa a zvuku. Komprese MPEG. Komprese MP3.

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

IB112 Základy matematiky

KOMPRESE OBRAZŮ. Václav Hlaváč. Fakulta elektrotechnická ČVUT v Praze katedra kybernetiky, Centrum strojového vnímání. hlavac@fel.cvut.

Vyhodnocení 2D rychlostního pole metodou PIV programem Matlab (zpracoval Jan Kolínský, dle programu ing. Jana Novotného)

0.1 Úvod do lineární algebry

0.1 Úvod do lineární algebry

Úloha - rozpoznávání číslic

Informační systémy ve zdravotnictví

Determinanty. Obsah. Aplikovaná matematika I. Pierre Simon de Laplace. Definice determinantu. Laplaceův rozvoj Vlastnosti determinantu.

11MAMY LS 2017/2018. Úvod do Matlabu. 21. února Skupina 01. reseni2.m a tak dále + M souborem zadané funkce z příkladu 3 + souborem skupina.

ZÁPADOČESKÁ UNIVERZITA V PLZNI

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

III/ 2 Inovace a zkvalitnění výuky prostřednictvím ICT

ANTAGONISTICKE HRY 172

II. Úlohy na vložené cykly a podprogramy

Aplikovaná numerická matematika - ANM

13 Barvy a úpravy rastrového

1 Vektorové prostory.

Operace s maticemi. 19. února 2018

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

7. Funkce jedné reálné proměnné, základní pojmy

3. ANTAGONISTICKÉ HRY

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

(Cramerovo pravidlo, determinanty, inverzní matice)

7. Rozdělení pravděpodobnosti ve statistice

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

1 Řešení soustav lineárních rovnic

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

[1] samoopravné kódy: terminologie, princip

1 Linearní prostory nad komplexními čísly

8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice

Lineární algebra - I. část (vektory, matice a jejich využití)

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n


Komprese obrazu. Verze: 1.5, ze dne: 1. června Václav Hlaváč a Tomáš Svoboda

BPC2E_C09 Model komunikačního systému v Matlabu

Matice. a m1 a m2... a mn

12 Metody snižování barevného prostoru

1 Projekce a projektory

FP - SEMINÁŘ Z NUMERICKÉ MATEMATIKY. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

Grafika na počítači. Bc. Veronika Tomsová

1 0 0 u 22 u 23 l 31. l u11

KOMPRIMACE. aneb Aby to zabralo méně místa

MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]

Matematika B101MA1, B101MA2

10. Soustavy lineárních rovnic, determinanty, Cramerovo pravidlo

transformace je posunutí plus lineární transformace má svou matici vzhledem k homogenním souřadnicím [1]

KTE/TEVS - Rychlá Fourierova transformace. Pavel Karban. Katedra teoretické elektrotechniky Fakulta elektrotechnická Západočeská univerzita v Plzni

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

Dobývání znalostí. Doc. RNDr. Iveta Mrázová, CSc. Katedra teoretické informatiky Matematicko-fyzikální fakulta Univerzity Karlovy v Praze

Uspořádanou n-tici reálných čísel nazveme aritmetický vektor (vektor), ā = (a 1, a 2,..., a n ). Čísla a 1, a 2,..., a n se nazývají složky vektoru

Afinita je stručný název pro afinní transformaci prostoru, tj.vzájemně jednoznačné afinní zobrazení bodového prostoru A n na sebe.

Komprese dat (Komprimace dat)

Soustavy lineárních rovnic a determinanty

Komprese obrazu. Úvod. Rozdělení metod komprese obrazů. Verze: 1.5, ze dne: 1. června Václav Hlaváč a Tomáš Svoboda

Neuronové časové řady (ANN-TS)

Kompresní techniky. David Bařina. 15. února David Bařina Kompresní techniky 15. února / 37

Stavový model a Kalmanův filtr

Symetrické a kvadratické formy

Operace s maticemi

5. Náhodná veličina. 2. Házíme hrací kostkou dokud nepadne šestka. Náhodná veličina nabývá hodnot z posloupnosti {1, 2, 3,...}.

Kompresní metody první generace

z = a bi. z + v = (a + bi) + (c + di) = (a + c) + (b + d)i. z v = (a + bi) (c + di) = (a c) + (b d)i. z v = (a + bi) (c + di) = (ac bd) + (bc + ad)i.

Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru

ANALYTICKÁ GEOMETRIE LINEÁRNÍCH ÚTVARŮ V ROVINĚ

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Vodoznačení video obsahu

PQ-stromy a rozpoznávání intervalových grafů v lineárním čase

Soustavy. Terminologie. Dva pohledy na soustavu lin. rovnic. Definice: Necht A = (a i,j ) R m,n je matice, b R m,1 je jednosloupcová.

5.3. Implicitní funkce a její derivace

1 Determinanty a inverzní matice

Digitalizace dat metodika

Matematika 1 MA1. 2 Determinant. 3 Adjungovaná matice. 4 Cramerovo pravidlo. 11. přednáška ( ) Matematika 1 1 / 29

Cvičení 5 - Inverzní matice

Soustavy linea rnı ch rovnic

4EK213 LINEÁRNÍ MODELY

Kapitola 1. Signály a systémy. 1.1 Klasifikace signálů

Základy maticového počtu Matice, determinant, definitnost

Výběr báze. u n. a 1 u 1

Matice přechodu. Pozorování 2. Základní úkol: Určete matici přechodu od báze M k bázi N. Každou bázi napíšeme do sloupců matice, např.

Derivace funkcí více proměnných

Křivky a plochy technické praxe

Algoritmy I. Číselné soustavy přečíst!!! ALGI 2018/19

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

SIGNÁLY A LINEÁRNÍ SYSTÉMY

8 Střední hodnota a rozptyl

Číselné vektory, matice, determinanty

Jana Vránová, 3. lékařská fakulta UK

U Úvod do modelování a simulace systémů

Učební texty k státní bakalářské zkoušce Matematika Základy lineárního programování. študenti MFF 15. augusta 2008

Úvod do lineární algebry

Testy dobré shody Máme dvě veličiny, u kterých bychom chtěli prokázat závislost, TESTY DOBRÉ SHODY (angl. goodness-of-fit tests)

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Transkript:

Univerzita Karlova v Praze Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE Jan Ondruš Bezztrátová komprese JPEG grafiky Katedra softwarového inženýrství Vedoucí diplomové práce: Mgr. Jan Lánský Studijní program: Informatika, obor Teoretická informatika 2009

Prohlašuji, že jsem svou diplomovou práci napsal samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce a jejím zveřejňováním. V Praze dne 30.4.2009 Jan Ondruš 2

Obsah 1 Jak funguje JPEG komprese 5 1.1 Historie, všeobecný popis...................... 5 1.2 Průběh komprese a dekomprese................... 6 1.3 DCT a inverzní DCT transformace................. 8 1.4 Kvantizace a dekvantizace...................... 9 1.5 VLI a Huffmanovo kódování v JPEG................ 10 1.6 JFIF formát souborů......................... 11 2 Možnosti dodatečné bezztrátové komprese 13 2.1 Aritmetické kódování......................... 13 2.2 Kódování po bitech (bit-plane coding)............... 14 2.3 Další metody a možnosti....................... 16 3 Predikce DCT koeficientů 18 3.1 Transformace a přeuspořádání dat................. 18 3.2 Možnosti inter a intra predikce................... 19 3.3 Vylepšená predikce - základní verze................ 20 3.4 Vylepšená predikce - rychlá verze................. 21 3.5 Renormalizace a delta komprese.................. 24 3.6 Experimentální výsledky....................... 25 4 Původní PAQ8 JPEG model 26 4.1 Context mixing (CM) algoritmus.................. 26 4.2 Implementace v PAQ8........................ 27 4.3 Modelování a predikce v JPEG souboru.............. 27 5 Vylepšený model 30 5.1 Základní verze............................ 30 5.2 Možnosti zlepšení a pokročilá verze................. 31 5.3 Implementace............................ 32 5.4 Experimentální výsledky....................... 33 6 Shrnutí a závěr 38 3

Název práce: Bezztrátová komprese JPEG grafiky Autor: Jan Ondruš Katedra (ústav): Katedra softwarového inženýrství Vedoucí diplomové práce: Mgr. Jan Lánský e-mail vedoucího: Jan.Lansky@mff.cuni.cz Abstrakt: JPEG je široce rozšířená metoda komprese grafiky určená především pro ukládání fotografií. Skládá se ze ztrátové a bezztrátové části. Poslední fází je statické Huffmanovo kódování, které lze nahradit pokročilejšími adaptivními technikami ve spojení s aritmetickým kódováním. V této práci je představena metoda použitá pro kompresi souborů JPEG (soubory formátu JFIF) uložených v sekvenčním (baseline) režimu. Obecným postupem je v tomto případě částečná dekomprese, při které invertujeme pouze poslední bezztrátové fáze kompresního algoritmu. Tím převedeme komprimovaný soubor dat na pole kvantovaných DCT koeficientů. Zde je navržen algoritmus pro predikci těchto DCT koeficientů. Ten funguje tak, že vrací jako výsledek pro každý z 64 koeficientů vhodnou lineární kombinaci už zakódovaných koeficientů z aktuálního bloku a okolních bloků. Také se seznámíme s tím, jak je možné využít této predikce k vylepšení výkonu komprese JPEG souboru pomocí Context Mixing algoritmu v programu PAQ8 od Matta Mahoneyho. Dále je uvedena konkrétní implementace a otestován její výkon ve srovnání s existujícími metodami nebo algoritmy na kompresi JPEG grafiky. Klíčová slova: komprese dat, komprese obrazu, JPEG komprese Title: Lossless compression of JPEG images Author: Jan Ondruš Department: Department of Software Engineering Supervisor: Mgr. Jan Lánský Supervisor s e-mail address: Jan.Lansky@mff.cuni.cz Abstract: JPEG is a commonly used method of compression for photographic images. It consists of lossy and lossless part. Static Huffman coding is a last step. We can replace this step using advanced techniques and arithmetic coding. In this work we introduce method used for additional compression JPEG files (files in JFIF format) saved in baseline mode. Partial decompression is a general way we can use in this case. We invert only last lossless steps of JPEG compression algorithm. Compressed file is transformed into array of quantized DCT coefficients. We designed algorithm for prediction of the DCT coefficients. It returns particular linear combination of previous coded coefficients in current and neighbouring blocks for each from 64 coefficients in block matrix. We show how this prediction can improve efficiency of compression of JPEG files using Context Mixing algorithm implemented in PAQ8 by Matt Mahoney. Specific implementation is described and its compression ratio is compared with existing methods and applications for further lossless JPEG images compression. Keywords: data compression, image compression, JPEG further lossless compression 4

Kapitola 1 Jak funguje JPEG komprese 1.1 Historie, všeobecný popis Existuje mnoho standardů a formátů pro ukládání digitální grafiky. Tím nejrozšířenějším je bezesporu JFIF formát souborů (soubory s koncovkou jpg), který používá JPEG komprese. Tento formát byl navržen skupinou Joint Photographic Experts Group v roce 1992. Schválen jako standard ISO 10918-1 byl v roce 1994. Tento formát se používá pro ukládání přirozených obrázků. To jsou obrázky, které zobrazují reálný svět a vznikají většinou jako fotografie z digitálního fotoaparátu nebo jiným způsobem digitalizace obrazu. Za svůj úspěch vděčí JPEG komprese především dvěma vlastnostem. Za prvé umožňuje dosáhnout velkých kompresních poměrů za cenu minimální ztráty vizuální kvality. Na druhé straně má nízkou výpočtovou náročnost, která umožnila jeho rozšíření v minulosti. Později se objevily nové formáty jako je JPEG2000 a další založené na podobných principech snažící se zlepšit poměr kvality a míry komprese. Ten se však nelišil a neliší dostatečně na to, aby se vyplatilo měnit formát uložení obrázků. Navíc s sebou přináší dodatečnou výpočtovou složitost algoritmu komprese a dekomprese. Proto se nikdy významně nerozšířili a ukládání fotografií pomocí JPEG komprese zůstává de facto standardem. Ve všech digitálních fotoaparátech se tato komprese používá jako základní formát. Parametry, které si při ukládání obrázků pomocí JPEG komprese lze zvolit jsou mód komprese, kvalita a způsob uložení barev. Nejpoužívanějším módem komprese je sekvenční neboli základní. Dalším je progresivní mód. Při tomto způsobu se obrázek ukládá tak, že je ho možno rekonstruovat celý už z počátečního úseku souboru, ale se sníženou kvalitou. S prodlužováním už načteného úseku se kvalita postupně zvyšuje. Tento mód má pomoci uživatelům s pomalým připojením k internetu, aby viděli obrázek brzy, zatímco těm s rychlým připojením ho umožní stáhnout ve vysoké kvalitě. Další možností JPEG standardu je bezztrátová komprese (JPEG Lossless, JPEG-LS). V režimu bezztrátové kom- 5

prese se obrázek ukládá bez jakékoliv ztráty kvality za cenu většího objemu dat. Tento mód není příliš používaný, protože v tomto případě se většinou preferuje uložení obrázku bez jakékoli komprese nebo v jiném formátu. Nastavení kvality a barev se projeví v kvalitě a velikosti souboru. Zde si uživatel zvolí, jak velkou ztrátu kvality si přeje. Při volbě příliš nízké kvality vznikají na obrázku chyby, které jsou typické pro JPEG kompresi. Tyto chyby se nazývají artefakty. Na obrázku se objeví malé čtverečky. To je dáno způsobem, jak komprese funguje - obrázek je rozdělen na bloky velikosti 8x8 obrazových bodů, které jsou dále zpracovávány nezávisle. Při příliš nízké kvalitě je pak snadné tyto bloky rozlišit. Protože lidské oko je méně citlivé na barevné odstíny než na rozdíly v jasu, lze si v nastavení ukládání barev také zvolit, že barvy budou ukládány v nižší kvalitě než jas obrázku. 1.2 Průběh komprese a dekomprese Komprese probíhá tak, jak je naznačeno na obrázku 1.1, ve čtyřech fázích. Prvním krokem je převod z barevného prostoru RGB do YCbCr. Získané tři složky interpretujeme jako tři nezávislé černobílé obrázky, které jsou dále zpracovávány z velké části odděleně. Tento krok umožňuje odstranit část redundance obsažené v obrázku. Konkrétně je snížena korelace mezi různými složkami. V dalším zpracování má význam odlišovat jasovou složku (Y) a barevné složky (Cb a Cr). Jasová složka má totiž obvykle větší rozptyl a nese jiný druh informace, který je pro lidské oko důležitější. Obrázek 1.1: 4 základní fáze průběhu komprese JPEG Druhým krokem je diskrétní kosinová transformace (dále jen DCT). Před jejím provedením je obrázek rozdělen na bloky velikosti 8x8 pixelů. Pro každý blok v každé z barevných složek je provedena transformace, která převede 64 původních hodnot, které označují hodnoty jasu resp. barevné odchylky, na jiných 64 hodnot - DCT koeficientů. Použije se následující vzorec: y u,v = α(u) α(v) α(k) = 7 7 m=0 n=0 1 8 pro k = 0 2 8 pro k > 0 [ ( π x m,n cos m + 1 ) ] [ ( π u cos n + 1 ) ] v 8 2 8 2 Báze této 2D transformace je naznačena na obrázku 1.2. Platí, že koeficienty 6

"vlevo nahoře" obsahují informaci o nižších frekvencích v obrázku a jsou důležitější pro vizuální vjem. Naopak koeficienty "vpravo dole" nejsou tak důležité a není je nutno ukládat tak přesně. Právě přesnost uložení koeficientů je určující pro kvalitu uložení obrázku. Obrázek 1.2: báze 2D DCT 8x8 Ve třetím kroku se provádí kvantizace těchto koeficientů a to následujícím způsobem. Původní hodnota je vydělena určitou konstantou. Tato konstanta závisí na poloze koeficientu v bloku a pro nižší koeficienty je nižší (v obvyklém případě). Dále se liší v závislosti na barevné složce obrázku (menší ztráta pro jasovou složku než pro barevné složky). Hodnoty těchto konstant jsou uloženy v kvantizační tabulce v ukládaném souboru a mohou se tedy pro každý obrázek lišit. Nakonec je třeba zakódovat všechny tyto kvantované koeficienty do výsledného souboru. K tomu se v JPEG kompresi používá RLE, Variable Length Integer (VLI) kódování a Huffmanovo kódování. RLE umožňuje efektivněji uložit posloupnosti nulových koeficientů. Pomocí VLI jsou převedeny hodnoty na dvojice (Kat, Bity). Kat určuje kategorii danou jako číslo rozsahu, ve kterém se číslo nacházelo. Bity pak obsahují dodatečnou informaci o pozici, kde se v daném rozsahu číslo nachází. V tabulce 1.2 je popsána tato transformace přesně. Pomocí statického Huffmanova kódování jsou pak kódována čísla Kat. Druhá složka (Bity) je kódována přímo, je přímo zapsána do výstupního souboru hned za Huffmanův kód symbolu odpovídajícímu kategorii Kat. Počet bitů, který se použije na její zakódování, je určen jednoznačně hodnotou Kat. Použije se vždy jedna Huffmanova tabulka pro jednu z barevných složek. Dekomprese probíhá inverzně ke kompresi. Všechny fáze kromě kvantizace je možné invertovat bezztrátově. V prvním kroku se dekóduje Huffmanovo kó- 7

dování a načte se příslušný počet bitů. Dvojice se převede na hodnotu kvantovaného koeficientu. Tu je třeba vynásobit odpovídající konstantou, abychom dostali přibližnou hodnotu původního koeficientu. Protože při kvantizaci došlo ke ztrátě informace, je při dekvantizaci získána jiná hodnota než ta původní. Dále se na celý blok koeficientů 8x8 provede Inverzní diskrétní kosinová transformace (IDCT), která je přesně inverzí k DCT. Tím dostaneme blok hodnot pixelů v jedné z barevných složek. Poskládáním barevných složek a převodem do RGB dostaneme zpět blok pixelů velikosti 8x8 resp. celý původní obrázek. 1.3 DCT a inverzní DCT transformace Báze kosinové transformace je složena z kosinových funkcí. Pro jednorozměrný případ je to naznačeno na obrázku 1.3. Nechť je délka intervalu, na kterém jsou hodnoty definovány, n. První funkce je konstanta a hodnota prvního koeficientu tedy určuje posun funkčních hodnot. Další funkce jsou kosinové funkce s periodami 2n, n, n/2, n/4, atd. V diskrétním případě potom pracujeme s určitým počtem vzorků. Přitom celkový počet potřebných koeficientů pro opětovnou bezztrátovou rekonstrukci originálu je roven počtu vzorků z původních dat. Dvourozměrný případ je možné chápat jako provedení transformace postupně nejprve v jednom z rozměrů a potom v tom druhém. Výsledek nezávisí na pořadí, které zvolíme. Báze této transformace analogicky odpovídá jednorozměrnému případu, jak je naznačeno na obrázku 1.2. V případě DCT transformace bloku velikosti 8x8 tedy dostáváme 64 koeficientů, které si můžeme označit souřadnicemi (u, v) pro u, v = 0..7. Přitom koeficient (0, 0) je označován jako stejnosměrná složka, protože určuje průměrnou hodnotu v původním bloku. Ostatní koeficienty chápeme jako číslo určující kolik informace s danou frekvencí se v obrázku v daném směru (horizontálním nebo vertikálním) vyskytuje. Z faktu, že běžné obrázky se spojitým rozložením hodnot obsahují málo vysokofrekvenční informace plyne, že vyšší koeficienty (tj. pro vyšší u, v) budou nabývat menších hodnot. V případě JPEG komprese se před provedením DCT převádí hodnoty pixelů z intervalu [0, 2 p 1] na interval [ 2 p 1, 2 p 1 1], kde p = 8. Bloky velikosti 8x8 se pak transformují pomocí 2D diskrétní kosinové transformace. Inverzní diskrétní kosinová transformace provádí inverzi. Matici koeficientů 8x8 převádí zpět na původní hodnoty pixelů (v dané barevné složce). V případě, že máme k dispozici přesně matici vypočtených koeficientů, dokáže spočítat původní hodnoty přesně. Tato fáze komprese je tedy bezztrátová. My ovšem v dalším postupu komprese neukládáme hodnoty přesně, ale pouze přibližně. Při dekompresi tedy rekonstruujeme jiné hodnoty. Ty přesně odpovídají matici koeficientů, kterou máme k dispozici. 8

Obrázek 1.3: kosinové funkce báze jednorozměrné DCT DCT : IDCT : y k = α(k) N 1 n=0 x n cos [ ( ) ] π N n + 1 2 k 1 α(k) = 8 pro k = 0 2 8 pro k > 0 y k = 1 2 { 2 2 x 0 + N 1 n=1 x n cos [ π N ( ) ] } k + 1 2 n 1.4 Kvantizace a dekvantizace Kvantování koeficientů se provádí prostým vydělením příslušných koeficientů určitou hodnotou. Tato hodnota by měla vystihovat to, jak přesně chceme informaci uložit. Proto se tyto hodnoty liší pro různě koeficienty a pro různé barevné složky obrázku. Máme několik kvantovacích tabulek s 64 hodnotami. Nejčastěji se používají dvě - jedna tabulka pro barevné složky a jedna pro jasovou složku obrázku. Hodnoty v kvantovacích tabulkách určují, v jaké kvalitě bude obrázek uložen. Čím větší číslo je v tabulce uvedeno, tím méně přesně bude ten daný koeficient zaznamenán. Vstupem procesu kvantizace jsou tedy bloky koeficientů. Jednotlivé položky se vydělí odpovídajícími hodnotami v kvantizační tabulce. Jako výstup dostáváme blok kvantovaných koeficientů. Získaný blok je možno v dalším postupu uložit pomocí méně bitů a dosáhneme tím ve výsledku určitého kompresního poměru (v závislosti na zvolené kvalitě). Protože hodnoty koeficientů s vyššími indexy (tj. odpovídajících vyšším frekvencím) jsou obvykle malé, po vydělení dostáváme jako výsledek velmi často nulu. To způsobuje, že blok poté obsahuje menší hodnoty a na vyšších pozicích samé nuly a je možné ho efektivněji zakódovat. 9

1 1 1 2 3 6 8 10 1 1 2 3 4 8 9 8 2 2 2 3 6 8 10 8 2 2 3 4 7 12 11 9 3 3 8 11 10 16 15 11 3 5 8 10 12 15 16 13 7 10 11 12 15 17 17 14 14 13 13 15 15 14 14 14 Tabulka 1.1: příklad kvantizační tabulky jasové složky běžného obrázku JPEG zíkaného z digitálního fotoaparátu Inverzním postupem ke kvantizaci je dekvantizace. Ta se provádí vynásobením hodnotami z kvantizační tabulky. Zde dochází ke ztrátě informace. Tímto postupem totiž nedostáváme původní koeficienty. S klesající nastavenou kvalitou a tedy s rostoucími hodnotami v kvantizační tabulce se logicky snižuje přesnost uložení koeficientů a tím také po inverzní DCT také přesnost rekonstrukce původního obrázku. 1.5 VLI a Huffmanovo kódování v JPEG Posledním krokem JPEG komprese je bezztrátové zakódování kvantovaných koeficientů DCT báze všech jednotlivých bloků. Hodnoty v rámci jedné matice 8x8 jsou nejprve uspořádány do speciálního pořadí nazývaného zig-zag posloupnost. V této posloupnosti se na prvních pozicích objevují políčka s největším rozptylem a nakonec ty s nejmenším (viz obrázek 1.4). To znamená, že na začátku jsou největší absolutní hodnoty a na konci posloupnost nul. Obrázek 1.4: zig-zag posloupnost 10

První číslo v této posloupnosti je koeficient na pozici [0, 0]. Tento má jiné statistické vlastnosti než ostatní - střední hodnotu nemá rovnou nule. Proto se pro tento koeficient používá navíc delta kódování. Před kódováním se od něj odečte hodnota tohoto koeficientu z předchozího bloku v rámci jeho barevné složky (jde o blok vlevo, protože obrázek se prochází po řádcích). Ke kódování nulových hodnot je použito RLE kódování. Posloupnost několika nul se nahradí jejich počtem - získáme číslo R. Pro závěrečnou posloupnost nul, která zakončuje zig-zag posloupnost, se použije speciální kód EOB (end-of-block). Ke kódování nenulových hodnot se použije následující postup. Pro hodnoty v určitém rozsahu se určí jeho číslo (S). Rozsahy jsou ve tvaru prstencových okolí nuly, která se pro S o jednotku větší zvětší právě dvakrát (viz tabulka 1.2). Kategorie Obsažené hodnoty 0 0 1-1; 1 2-3; -2; 2; 3 3 [-7, -4]; [4, 7] 4 [-15, -8]; [8, 15] 5 [-31, -16]; [16, 31] 6 [-63, -32]; [32, 63] 7 [-127, -64]; [64, 127] 8 [-255, -128]; [128, 255] 9 [-511, -256]; [256, 511] 10 [-1023, -512]; [512, 1023] 11 [-2047, -1024]; [1024, 2047] Tabulka 1.2: VLI transformace Při průchodu zig-zag posloupností se vytvářejí dvojice nazývané RS-kódy, což jsou dvojice (R, S). R udává počet nulových hodnot od předchozí nenulové (včetně případu, že je počet nulový). S označuje rozsah, ve kterém tato nenulová hodnota leží. Tyto RS-kódy nebo kód označující konec bloku (EOB) jsou kódovány pomocí statického Huffmanova kódování. K Huffmanovu kódování se používají Huffmanovy tabulky, které se mohou lišit pro každou z barevnou složek obrázku. Za každým RS-kódem následují bity označující pozici upřesnění hodnoty v rámci rozsahu určené jeho složkou S. Tyto bity už nejsou dále entropicky kódovány. 1.6 JFIF formát souborů Celý proces ukládání prochází celý obrázek rozložený na jednotlivé bloky 8x8 pixelů. Pořadí v jakém jsou analyzovány, komprimovány a nakonec uloženy je následující. Prochází se nejprve po řádcích a poté po sloupcích ve směru zleva doprava a shora dolů. V rámci jedné pozice bloku se dále prochází po barevných složkách obrázku. Tím dostáváme určené pořadí bloků. Po DCT-transformaci 11

a kvantování hodnot pixelů pak koeficienty v rámci bloku procházíme v zig-zag pořadí. Nakonec je prováděno Huffmanovo kódování (viz předchozí oddíl). Tímto procesem dostáváme proud bitů, ke kterému je ještě přiložena hlavička obsahující informace o rozměrech obrázku, metodě komprese, kvantovací tabulky, Huffmanovy tabulky nebo další případné informace. Navíc mohou být do obrázku vloženy speciální kódy - to jsou restart-kódy (RST) a end-of-image (EOI) kód. EOI označuje konec obrázku. RST kódy určují, že od určitého místa se obrázek kóduje nezávisle na předchozích datech (umožňuje restartovat dekompresi). Další kódy jsou obsaženy v hlavičce souboru (například označení kvantovací tabulky, Huffmanovy tabulky, aplikačních dat, intervalu RST kódů nebo začátku obrázku). Tyto kódy jsou dvoubytové. První byte má vždy hodnotu 255 (samé jedničkové bity). Druhý byte určuje, o který kód jde. Všechny byte s hodnotou 255, které neoznačují speciální kód, je proto třeba odlišit. Za tyto hodnoty je vždy vložen ještě jeden byte s hodnotou 255. V předchozím popisu JPEG komprese byla popsán základní (sekvenční) mód komprese, který je zdaleka nejpoužívanější. Tímto se budeme i v dalších kapitolách nadále zabývat. Jiným také ještě používaným je progresivní mód. Při tomto způsobu se kódují nejprve koeficienty nejmenších frekvencí pro celý obrázek. Dále se prochází obrázek vždy znovu a kódují se koeficienty vždy s vyššími frekvencemi. 12

Kapitola 2 Možnosti dodatečné bezztrátové komprese 2.1 Aritmetické kódování Jednou z možností, jak provést dodatečnou kompresi obrázku uloženého v JFIF souboru, je nahradit Huffmanovo kódování v poslední fázi komprese aritmetickým kódováním. Huffmanovo kódování přiřazuje jednotlivým symbolům různě dlouhé řetězce bitů. Protože počet bitů je nutně celé kladné číslo, je nemožné kódovat symboly pomocí neceločíselného počtu bitů. Podle teorie informace je optimální počet bitů pro kódování symbolu, který se v datech vyskytuje s pravděpodobností p, roven log 2 (p) bitů. Tohoto počtu umožňuje dosáhnout aritmetické kódování. To oproti Huffmanovu kódování odstraňuje právě neefektivitu vzniklou nemožností přiřadit symbolům neceločíselné délky kódů. Máme úlohu komprese dat, které už byly zkomprimovány pomocí JPEG algoritmu. Pro využití možnosti aplikovat lepší kódování je třeba invertovat poslední fázi (Huffmanovo kódování) v posloupnosti operací komprese. To znamená totéž jako provést první krok při dekompresi. Na získaná data je pak možno aplikovat aritmetické kódování, abychom získali výsledná data. My se snažíme o to, aby výsledkem byl soubor co nejmenší velikosti. Tento postup je bezztrátový. Opačným postupem dostaneme zpět původní obrázek v JFIF formátu. Rekonstrukce dosáhneme dekódováním aritmetického kódování a opětovným provedením Huffmanova kódování. Přitom je samozřejmě třeba zachovat uloženou hlavičku původního souboru. Tam jsou obsaženy potřebné informace pro rekonstrukci Huffmanova kódování a také proudu dat včetně speciálních kódů. Přečtením Huffmanových tabulek získáme znalost o použitých kódech a také tam najdeme informaci o intervalech RST kódů, pokud byly použity. Schéma celého postupu je naznačeno na obrázku 2.1. Tento jednoduchý postup naznačuje, jaký je základní přístup v oblasti dodatečné komprese JPEGu. Výsledná komprese se v tomto případě pohybuje řádově pouze na několika jednotkách procent. V dalších kapitolách budou stručně před- 13

Obrázek 2.1: schéma nahrazení Huffmanova kódování aritmetickým kódováním staveny jiné existující metody dosahující o něco lepších výsledků. Nakonec se seznámíme s novým přístupem využívající Context Mixing (CM) algoritmus, který dokáže kombinovat postupy z různých metod. Ve výsledku se pomocí něj dá dosáhnout v průměru komprese až 20-30 procent. 2.2 Kódování po bitech (bit-plane coding) Další z možností je využít pokročilejší přístup nazývaný bit-plane coding - kódování bitových ploch. Základem je v první řadě rozdělení dat (tj. v našem případě kvantovaných koeficientů) po jednotlivých bitech. Dochází tak de facto ke vzniku několika jednobitových obrazů - bitových ploch. Pokud například všechny hodnoty mají v určitých vyšších bitech samé nuly - dostáváme v odpovídající bitové ploše jednobarevný obraz složený ze samých nul, který je možné dále snadno zkomprimovat. Jak navrhli N. Ponomarenko a další v [6] je k využití v případě kódování kvantovaných koeficientů efektivní použít vhodnou klasifikaci bitů na základě jejich okolí. Úlohu, kterou řešíme, je možné přeformulovat takto. Máme pole kvantovaných koeficientů, které je třeba bezztrátově uložit. Toto pole je 5-ti rozměrné. Jeho rozměry jsou číslo barevné složky nabývající nejčastěji hodnot z intervalu [0, 2], dvě souřadnice koeficientu v rámci DCT bloku z intervalu [0, 7] a dvě souřadnice DCT bloku v obrázku z intervalu [0, šířka / 8] resp. [0, výška / 8]. Pro pohled po jednotlivých bitech přidáme ještě jeden rozměr (číslo daného bitu v rámci hodnoty) a na celá data se budeme dívat jako na šestirozměrné pole 14

bitů. Protože koeficienty jsou 12-ti bitová čísla, nabývá tento rozměr hodnot 0 až 11. Obrázek 2.2: rozhodovací strom a rozdělení do tříd Nyní procházíme po jednotlivých bitech v nějakém daném pořadí a klasifikujeme pevným způsobem podle jejich okolí do několika skupin. Autoři v [6] dospěli k podmínkám, které dobře charakterizují jednotlivé bity. Nechť [c, u, v, x, y, b] je vektor určující polohu bitu v bitovém poli pro barevnou složku c, pozici v bloku (u, v), pozici bloku v obrázku (x, y) a pozici bitu b. X[c, u, v, x, y, b] označme hodnotu bitu na dané pozici (kódovanou jako 0 nebo 1). X pro pozice, které jsme ještě neprošli a neuložili, položíme rovnou 0 včetně aktuální pozice [c, u, v, x, y, b]: 15

C1 C2 C6 b : ( b < b ) & ( X [ c, u, v, x, y, b] = 1 ) b : ( b < b 1 ) & ( X [ c, u, v, x, y, b] = 1 ) b, i, j : ( b < b ) & ( 1 i, j 1) & ( X [ c, u + i, v + j, x, y, b] = 1 ) C7 i, j : ( 1 i, j 1) & (X [c, u + i, v + j, x, y, b] = 1) C8 b, i, j : ( b ) ( [ ) b & ( 2 i, j 2) & X c, u + i, v + j, x, y, b] = 1 C9 b, i, j : ( b ) ( [ ) b & ( 3 i, j 3) & X c, u + i, v + j, x, y, b] = 1 C10 b, i, j : ( b ) ( [ ) b & ( 1 i, j 1) & X c, u, v, x + i, y + j, b] = 1 C11 b, i, j : ( b ) ( [ ) < b 1 & ( 1 i, j 1) & X c, u + i, v + j, x, y, b] = 1 C13!i!j : ( 1 i, j 1) & (X [c, u + i, v + j, x, y, b] = 1) C14 (b = 10) Pořadí kódování se provádí v tomto pořadí rozměrů b c y x v u. Začíná se nejvýznamnějšími bity, poté se jde po řádcích v obrázku a v rámci bloku se prochází také po řádcích. Rozdělení do bitů do tříd pomocí těchto podmínek je provedeno pomocí rozhodovacího stromu (viz obrázek 2.2). Podle určené třídy se provádí výběr modelu, kterým se dané bity budou kódovat. Dalšími kritérii jsou také informace o tom, zda se jedná o stejnosměrný koeficient nebo zda je koeficient na prvním řádku v bloku. Při změně pozice bitu b, tedy při přechodu z jedné bitové plochy do nižší, se všechny modely reinicializují. V původní verzi se nekódují bity z modelu PM15. Tyto bity mají ve svém okolí samé nuly. To není pro použití pro bezztrátovou kompresi JPEGu možné. Znaménka se nekódují a uloží se zvlášť. Tuto metodu autoři totiž použili pro návrh alternativního algoritmu ztrátové komprese obrázků. Při použití pro kompresi JPEG obrázků je třeba tuto metodu modifikovat. Podařilo se mi dosáhnout úspory místa v průměru 10 až 20 procent. 2.3 Další metody a možnosti Z jiným přístupem přišel M. Stirner v [9]. Autoři zde popisují kompresní algoritmus použitý v jejich programu PackJPG pro kompresi JPG grafiky. Základním přístupem autorů je oddělit získané koeficienty podle jejich významu (tj. pozice v DCT bloku) a dále je kódovat vzájemně nezávisle. V prvním kroku jejich algoritmu se ke každému DCT bloku určí EOB pozice. To je pozice posledního nenulového koeficientu v zig-zag pořadí. Podle hodnoty této pozice se bloky rozdělí do několika kategorií. Optimální počet kategorií se liší pro různé konkrétní vstupní obrázky. Dále se obrázek logicky rozdělí na 64 podobrázků. Ty odpovídají složkám v doméně DCT transformace. Na každý z nich je nadále aplikována specializovaná metoda kódování. Protože stejnosměrné koeficienty (0, 0) tvoří zmenšenou verzi původního originálu, hodí se použít v tomto případě techniky pro kompresi černobílých obrázků. Konkrétně jde o Paeth predictor, který je přesně popsán například ve specifikaci PNG formátu (viz [11]). Oproti lineární predikci se dosahuje o něco lepších výsledků. 16

Pokračuje se kódováním koeficientů v rámci získaných 64 složek. Pořadí, ve kterém se procházejí, je různé v závislosti na čísle koeficientu. Pro prvky pod diagonálou se prochází horizontálně po řádcích, pro prvky nad diagonálou se prochází vertikálně po sloupcích a pro prvky na diagonále se prochází speciálním způsobem podobným zig-zag pořadí (ale dvě po sobě ukládané hodnoty vždy leží vedle sebe na řádku nebo ve sloupci). Klíčem k efektivitě tohoto způsobu je efektivní zakódování všech těchto informací. Je třeba uložit hlavičku JPEG, EOB list (seznam kategorií pro jednotlivé bloky), znaménka koeficientů a absolutní hodnoty koeficientů. Hlavička JPEG se komprimuje běžným 1-order kodérem. Na EOB list se používá dvoudimenzionální 1-order kódování. To znamená, že kontextem jsou hodnoty v EOB listu o jedno vlevo a o jedno nahoře. Znaménka koeficientů se nedají komprimovat mnoho pod 1 bit. Jsou kódovány ve stejném pořadí jako koeficienty samotné pomocí 1-order kodéru. Naproti tomu před uložením absolutních hodnot je rozsah jejich hodnot nejprve rozdělen na kategorie podobně jako ve vlastním kódování JPEG. Ale rozsahy jednotlivých kategorií nejsou pevné a mění se v závislosti na JPEG kvalitě. Jsou vybrány na základě analýzy mnoha JPEG souborů uložených ve 100% kvalitě a pomocí pevného výpočtu na základě kvality jsou pro komprimovaný obrázek jednoznačně dopočítány. Ve výsledku se autorům podařilo dosáhnout v průměru asi 15% komprese. 17

Kapitola 3 Predikce DCT koeficientů 3.1 Transformace a přeuspořádání dat Jedním z důležitých faktorů, které mohou ovlivnit výkonnost metod komprese, je způsob uspořádání vícerozměrných dat. Protože většina přístupů nedokáže pracovat přímo s více dimenzemi, je třeba data linearizovat tedy převést vícerozměrná data na jednorozměrná. To znamená, že jednotlivé dimenze procházíme v nějakém určeném pořadí a tím získáme jednolitý proud dat. Naše úloha bezztrátové komprese JPEG souboru lze převést jednoduše na úlohu komprese právě pětirozměrného pole kvantovaných koeficientů. Pro hlubší analýzu můžeme zkoumat právě vliv způsobu linearizace těchto dat na výslednou kompresi. Jako druhý krok položíme nějaký známý algoritmus komprese dat. Jednotlivé rozměry pole označme písmeny C - barevná složka, U - horizontální pozice koeficientu, V - vertikální pozice koeficientu, X - horizontální pozice bloku a Y - vertikální pozice bloku. Dále dvojici (U, V) můžeme nahradit jedinou souřadnicí Z udávající pozici v bloku v zig-zag pořadí. Pro transformaci dat je použit přímočarý algoritmus, který v určeném pořadí uloží nekomprimované koeficienty. Každý z koeficientů je uložen ve dvou bytech. Někdy může být výhodné uložit vyšší a nižší byte odděleně - tyto výsledky jsou označeny číslicí 2. Na takovýto soubor dat se použije jeden ze všeobecně použitelných komprimačních algoritmů. Konkrétně byly použity tyto programy BZIP2 (algoritmus BWT), PPMd v.j (algoritmus PPM), CCM (algoritmus CM), ZIP (algoritmus LZ77). Výsledky testování pro jeden obrázek jsou vidět v tabulce 3.1. Jako nejlepší se ukazují pořadí C Z Y X (2), V U C Y X (2) a Z C Y X (2). Kromě metody BWT dávají nejlepší výsledky. To znamená, že v tomto případě je výhodné sdružovat stejné koeficienty stejných barevných složek k sobě. Tento výsledek naznačuje, že by mohlo být účinné využít závislostí koeficientů mezi různými bloky nebo případně mezi různými barevnými složkami nějakým chytřejším způsobem. 18

uspořádání koeficientů LZ77 BWT PPM CM C V U Y X 398422 333587 297833 282514 C Z Y X 388670 333133 297495 281755 V U C Y X 395849 332646 297484 281930 Z C Y X 392088 330895 297380 281343 C V U Y X (2) 341492 334706 296622 274026 C Z Y X (2) 332860 334693 296987 273303 V U C Y X (2) 339713 334718 296815 273418 Z C Y X (2) 335378 334721 296751 272896 C Y X V U 456305 319416 313760 324148 C Y X Z 436510 312949 300224 297162 V U Y X C 417999 337754 308166 310773 Y X C V U 475522 326296 318068 331950 Y X C Z 454059 323255 304421 303636 Y X V U C 486870 334068 324055 338390 Y X Z C 473118 325179 302323 321121 Z Y X C 412446 335684 308170 310115 C Y X V U (2) 387581 327145 309915 302325 C Y X Z (2) 362803 316467 299566 284478 V U Y X C (2) 364659 345365 304753 285697 Y X C V U (2) 399046 331410 312985 310374 Y X C Z (2) 372588 317803 301902 292478 Y X V U C (2) 410049 339069 320199 309126 Y X Z C (2) 397983 327975 297943 290611 Z Y X C (2) 360600 345417 305066 285110 Tabulka 3.1: Výsledky vlivu přeuspořádání dat na kompresní poměr 3.2 Možnosti inter a intra predikce Takzvané predikční metody se snaží co nejlépe odhadnout pravděpodobnosti jednotlivých hodnot. Přesněji pro každé číslo, které chceme zakódovat, dává metoda rozdělení pravděpodobnosti. To přiřazuje každé možnosti z oboru hodnot, která může nastat, nějaké číslo p(i). Platí, že součet všech pravděpodobností p(i) je roven jedné. Takto získané rozdělení dokáže optimálně využít aritmetické kódování. To umožňuje uložit data pomocí teoreticky nejmenšího počtu bitů pro daný model. Hodnotu i tedy zakódujeme log 2 (p (i)) bity. Otázkou zůstává, jak co nejlépe určit pravděpodobnosti p(i). Dynamické metody komprese dat pracují tak, že postupně procházejí souborem a z počátečního, už zakódovaného, úseku dat postupně budují příslušný model. V našem případě nebudeme postupovat jinak. Úlohu, kterou řešíme, lze popsat takto. Ze zakódované části obrázku chceme určit co nejpřesněji rozdělení pravděpodobnosti pro následující kvantovaný DCT koeficient. Pro zjednodušení nejprve uvažujme, že podkladem algoritmu nejsou všechny už zakódované hod- 19

noty, ale pouze ty z právě kódovaného DCT bloku. Takovéto predikci pak říkáme intra-predikce. Pokud naopak bereme v úvahu i hodnoty z okolních bloků jedná se o inter-predikci. Snahou je kombinací obou dostat lepší model. Podívejme se zpětně na to, jakou informaci využívá původní JPEG komprese. Kromě kódování prvního koeficientu v zig-zag posloupnosti (koeficient (0,0)), kde se využije informace o jeho hodnotě v předchozím bloku stejné barevné složky, se jiná informace z jiných bloků nepoužívá. Tedy se jedná téměř výhradně o intra-predikci. Právě lepším využitím informace z okolních bloků můžeme efektivitu komprese zvýšit. V následujícím textu je uvedena jedna z možností - algoritmus, který získává odhad libovolného koeficientu jako lineární kombinaci některých předchozích koeficientů z aktuálního a okolních bloků. 3.3 Vylepšená predikce - základní verze Vycházejme z předpokladu, že významná část závislostí mezi různými DCT bloky vychází z faktu, že původní bloky 8x8 pixelů na sebe navazovaly jednou svou hranou. Tento fakt nás omezuje na testování pouze bezprostředně sousedících bloků. Otázkou je, jak takovou to vlastnost modelovat a využít pro zlepšení predikce jednotlivých koeficientů. Nyní se nacházíme v následující situaci. Máme dva sousedící komprimované bloky. Proto, abychom popsali závislosti koeficientů, provedeme jejich dekompresi do obrazové domény. Tento krok se skládá z jejich dekvantizace a následné inverzní DCT transformace. Poté můžeme popsat závislost zjednodušeně jako "první řádek spodního bloku je podobný poslednímu řádku horního bloku" resp. "první sloupec pravého bloku je podobný levého bloku". V následujícím budeme uvažovat případ použití levého bloku. Použití horního bloku se provede symetricky. Rozdíl těchto dvou vektorů budeme zanedbávat a považovat ho za nulový. Označíme-li koeficienty v levém bloku L u,v a ty v aktuálním bloku A u,v, můžeme tuto vlastnost popsat formálně pomocí rovnice: i {0,..., 7} : L 7,i = A 0,i Přímo z této úvahy dostáváme algoritmus na predikci celého DCT bloku jako celku (nikoliv jednotlivého koeficientu). Tento algoritmus by postupoval takto: 1. dekvantizace a IDCT sousedního bloku 2. kopírování posledního sloupce (řádku) přes celý blok 3. kvantizace a DCT transformace Tímto způsobem dostaneme dva bloky, protože celý postup provádíme dvakrát - jednou pro sousední blok vlevo a podruhé pro blok nahoře od aktuální pozice. Protože nemáme žádné další informace o tom, na kterém sousedním bloku závisí ten aktuální více nebo méně, provedeme kombinaci obou směrů jednoduchým průměrováním. V tomto případě stačí spočítat aritmetický průměr obou predikcí. To je také ekvivalentní průměrování v obrazové doméně. 20

Algorithm 3.1 základní verze (pro odhad zleva) 1. Dekvantizace a 2D-IDCT levého bloku blok A 2. Dekvantizace a 2D-IDCT už dekódovaných koeficientů aktuálního bloku (doplněných nulami) blok B 3. Spočítej rozdíl posledního sloupce A a prvního sloupce B vektor C 4. Proveď jednorozměrnou DCT na vektor C 5. Vyber i-tou složku C, kde i je číslo řádku aktuálního koeficientu 6. Kvantování získané hodnoty C[i] D 7. Vrať jako výsledek D My bychom ale chtěli predikovat jednotlivé koeficienty postupně a využít vhodně toho, že některé koeficienty už známe. Zde využijeme známé vlastnosti koeficientů - koeficienty odpovídající vyšším frekvencím bývají v absolutní hodnotě menší než ty, které odpovídají nižším. Když budeme procházet koeficienty v zig-zag pořadí budou v absolutní hodnotě větší čísla vždy na začátku posloupnosti a na konci posloupnosti budou nuly. Z toho plyne, že vyšší koeficienty ovlivňují obrazový obsah bloku méně než ty nižší. Algoritmus bude postupovat od nižších koeficientů po ty vyšší v zig-zag pořadí a v každém kroku bude mít v paměti stav bloku daný už zakódovanými koeficienty doplněný nulami. Podle předchozí úvahy se dá předpokládat určitá míra podobnosti takovéhoto částečného bloku s původním komprimovaným blokem. Tento odhad aktuálního komprimovaného bloku algoritmus dekomprimuje stejně jako sousední blok a dopočítá hodnotu právě kódovaného koeficientu. Snahou je, aby se opět shodoval první a poslední sloupec (řádek). Spočítá se rozdíl těchto vektorů, na který se provede jednorozměrná DCT transformace. Z výsledného vektoru se pak přečte na pozici dané aktuální pozicí v kódovaném bloku koeficient. Ten je pak ještě třeba kvantovat, abychom dostali skutečný odhad koeficientu (viz algoritmus 3.1) 3.4 Vylepšená predikce - rychlá verze Algoritmus z předchozí části je možné dále optimalizovat. Vezmeme-li v úvahu vzorce pro DCT transformaci a její inverzi můžeme s pomocí mezivýsledku dostat stejnou predikci mnohem rychleji. V předchozím algoritmu bylo pro každý koeficient třeba spočítat DCT a inverzní DCT celého bloku. To nebude ve vylepšené verzi třeba. Uvažme algoritmus 3.2. V něm nám stačí provádět blokovou transformaci jednou za celý blok koeficientů a pro každý koeficient stačí jen konstantní počet kroků. Nyní ukážeme, že algoritmus 3.2 počítá to samé jako algoritmus 3.1. Nejprve si označíme hodnoty pixelů a koeficienty: 21

Obrázek 3.1: rychlá verze a i,j hodnoty pixelů v levém bloku c i,j hodnoty DCT koeficientů v levém bloku d i,j koeficientypo provedení 1-D DCT na sloupce a i,j (definice (1)) = koeficienty po provedení 1-D IDCT na řádky c i,j (definice (2)) a i,j hodnoty pixelů v aktuálním bloku c i,j hodnoty DCT koeficientů v aktuálním bloku d i,j koeficienty po provedení 1-D DCT na sloupce a i,j (definice (1)) = koeficienty po provedení 1-D IDCT na řádky c i,j (definice (2)) Ekvivalence definic (1) a (2) d i,j resp. d i,j plyne přímo z vlastností DCT. Konkrétně z faktu, že dvourozměrnou DCT lze spočítat jako jednorozměrnou DCT provedenou na sloupce a poté na řádky. Také z faktu, že DCT a IDCT jsou navzájem inverzní funkce: IDCT (DCT ( x )) = x DCT (IDCT ( x )) = x V algoritmu 3.1 počítáme rozdíly (a 7,x a 0,x ) pro x {0,.., 7}. Poté provedeme jednorozměrnou DCT na tento vektor a vybereme v-tou složku. To je stejné, jako kdybychom provedli nejprve DCT a poté spočítali rozdíl (z vlastností DCT transformace). Tedy podle definice (1) d i,j dostáváme pro v {0,.., 7}: DCT (a 7,x a 0,x ) [v] = ( d 7,v d 0,v ) S použitím definice (2) d i,j to můžeme přepsat jako: DCT (a 7,x a 0,x ) [v] = IDCT (c x,v ) [7] IDCT ( c x,v ) [0] 22

Algorithm 3.2 rychlá verze (pro odhad zleva) 1. Nechť vektor w = (w 0,..., w 7 ) je parametrem algoritmu 2. Nechť c i,j jsou hodnoty dekvantovaných DCT koeficientů v levém bloku a c i,j jsou už dekódované a dekvantované koeficienty v aktuálním bloku doplňené nulami 3. Při vstupu do nového bloku spočítej hodnoty sum [j] := 7 i=0 ( c i,j w i ( 1) i) 4. Pro každý načtený koeficient c i,j aktualizuj hodnotu sum [j] takto sum [j] := sum [j] c i,j w i 5. Spočítej predikci pro příští koeficient c k,l : P := sum[l] w k 6. Kvantování získané hodnoty P P 7. Vrať jako výsledek P Hodnotu IDCT ( y ) [7] a IDCT ( y ) [0] lze spočítat jako lineární kombinaci složek vektoru y. Koeficienty odvodíme ze vzorce pro IDCT (viz strana 8): 2 IDCT ( y ) [0] = 2 2 y 0 + 7 n=1 [ π ] y n cos 16 n. = y {+0.71; +0.98; +0.92; +0.83; +0.71; +0.56; +0.38; +0.2} 2 IDCT ( y ) [7] = 2 2 y 0 + 7 n=1 [ ] 15π y n cos 16 n. = y {+0.71; 0.98; +0.92; 0.83; +0.71; 0.56; +0.38; 0.2} Podle kroků 3 a 4 v algoritmu 3.2 dostáváme (nekvantovanou) predikci tohoto algoritmu jako 7 ) ( c i,v w i ( 1) i c i,v w i i=0 To se rovná při použití vektoru 1 /2 v 1 výrazu IDCT (c x,v ) [7] IDCT ( c x,v ) [0] = DCT (a 7,x a 0,x ) [v] To je číslo, které je po kvantování výsledkem algoritmu 3.1. Při použití této lineární kombinace (vektor 1 /2 v 1 ) dostáváme algoritmus 3.2 ekvivalentní s algoritmem 3.1, ale můžeme použít i jinou lineární kombinaci jako parametr algoritmu 3.2, která dává lepší výsledky. K tomu dochází, protože předpoklad 23

rovnosti prvního a posledního sloupce je nedokonalý. Experimenty ukazují, že použití vektorů v 2 a v 3 vede na přesnější predikci. v1 = { 2 2 ; cos ( π 16 ) ; cos ( 2 π 16 v3 = { 2 ) ( ; cos 3 π { 16 2 v2 = ) ( ; cos 4 π 16 } 2 ; 1; 1; 1; 1; 1; 1; 1 ) ; cos ( 5 π 16 ) ; cos ( 6 π 16 2 ; 16+1 16 ; 16+2 16 ; 16+3 16 ; 16+4 16 ; 16+5 16 ; 16+6 16 ; 16+7 16 } ) ( ; cos 7 π ) } 16 Tyto vektory odpovídají lineární kombinaci pro výpočet první (resp. nulté) složky IDCT. Osmou a poslední (resp. sedmou) složku spočítáme z vektoru, který dostaneme změnou znaménka u složek na sudých pozicích příslušného vektoru. Tady jsme předpokládali výpočet predikce koeficientu pomocí levého bloku. Pro výpočet pomocí horního bloku je výpočet a tedy i důkaz symetrický pouze s prohozením horizontálních a vertikálních dimenzí. 3.5 Renormalizace a delta komprese Po provedení algoritmu 3.2 (případně 3.1) obdržíme nějaký odhad koeficientu. Položme si otázku, jak dobrý to bude odhad oproti triviálnímu odhadu. Triviálním odhadem je střední hodnota koeficientů, která je kromě prvního stejnosměrného koeficientu nulová. Protože nižší koeficienty mají vyšší rozptyl, je odhad získaný naším algoritmem pro tyto nižší koeficienty daleko užitečnější než pro ty vyšší. Jejich hodnoty jsou totiž téměř vždy nulové, případně mají hodnotu 1 nebo -1. Pro základní použití algoritmu provedeme transformaci dat následujícím způsobem. Průchodem souborem všemi bloky a všemi koeficienty budeme pomocí algoritmu 3.2 získávat predikci (označíme ji p 1 ). Další predikcí bude nulová hodnota (p 2 = 0). Jejich lineární kombinací chceme získat výsledný odhad (p 3 ). Koeficienty této lineární kombinace se budou lišit v závislosti na poloze DCT koeficientu v bloku a barevné složce. Pak bude platit pro danou barevnou složku p 3 = p 1 K [i] + p 2 (1 K [i]) = p 1 K [i], kde i je číslo z intervalu [0, 63] určující pozici DCT koeficientu a K obsahuje 64 koeficientů lineární kombinace z intervalu [0, 1]. Výsledek p 3 použijeme k delta transformaci. Budeme ukládat vždy rozdíl skutečné hodnoty kvantovaného koeficientu a vypočítané predikce p 3. Otázkou zůstává, jak určit pro jednotlivé barevné složky hodnotyk [0] až K [63]. Chceme tyto hodnoty určit optimálně pro daný obrázek. Využijeme znalosti skutečných hodnot koeficientů c [b, i] pro blok b a pozici v bloku i. Minimalizujeme kvadratickou odchylku přes všechny bloky, pro všechny i {0,..., 63} najdeme K [i]: { } arg min (c [b, i] p 1 [b, i] K [i]) 2 K[i] Řešení získáme je pomocí lineární regrese: b 24

K [i] = b (p 1 [b, i] c [b, i]) b (p 1 [b, i] p 1 [b, i]) 3.6 Experimentální výsledky Po provedení transformace je třeba hodnoty nějak zakódovat. Byly otestovány tyto způsoby kódování - stejně jako při kompresi JPEG (označeno C_JPEG), kódování nekomprimovaných koeficientů přeuspořádaných v pořadí jako v souboru JPEG - pořadí Y X C Z (označeno P1) a jiném pořadí (označeno P2). Zvolené pořadí bylo C Z Y X (viz různá uspořádání na straně 18). Dále byly použity vybrané rozšířené komprimační algoritmy. Konkrétně to byly tyto programy BZIP2 (algoritmus BWT), PPMd v.j (algoritmus PPM), CCM (algoritmus CM), ZIP (algoritmus LZ77). Zajímavostí je, že při uložení pomocí JPEG dostáváme opět korektní JPEG obrázek, který můžeme vizualizovat - efekt transformace je pak vidět na obrázku 3.2. V tabulce 3.2 můžete najít výsledek komprese pro několik JPEG obrázků. Obrázek 3.2: vizuální ukázka vlivu transformace obr1 obr2 obr3 obr4 celkem zlepšení JPEG 562043 741332 407465 842468 2553308 - C_JPEG 536261 702004 391719 802400 2432384 4,74% P1+LZ77 899955 1147996 625083 1136477 3809511-49,20% P1+BWT 619761 814556 447732 869499 2751548-7,76% P1+PPM 592304 762153 423902 788916 2567275-0,55% P1+CM 604654 776363 427364 793199 2601580-1,89% P2+LZ77 565964 745241 416953 831293 2559451-0,24% P2+BWT 554263 736139 411998 826083 2528483 0,97% P2+PPM 502079 667237 368556 750382 2288254 10,38% P2+CM 463474 620122 340815 700733 2125144 16,77% Tabulka 3.2: výsledky - velikosti souborů v bytech 25

Kapitola 4 Původní PAQ8 JPEG model 4.1 Context mixing (CM) algoritmus Nyní si představme Context mixing (CM) algoritmus tak, jak ho navrhl M. Mahoney v [7] (paq6). Dále ho vylepšil v posledních verzích programu (paq7, paq8) (viz [8]). Predikce se provádí kombinací velkého množství modelů speciálním adaptivním algoritmem. Modely jsou kontextové a statistické. To znamená, že funkce kontextu (několika posledních bytů) je mapována přímo nebo pomocí hašovací tabulky na stavy, které závisí na bitové historii (sekvenci 0 nebo 1 nalezených v tomto kontextu). Bitová historie se převádí pevnou nebo adaptivní funkcí na odhad pravděpodobnosti p. Postupuje se po jednotlivých bitech a významem výsledku je odhad pravděpodobnosti, že následující bit bude jednička. Tyto modely nám dávají několik pravděpodobností, které se kombinují pomocí několika modifikovaných jednoduchých neuronových sítí vybíraných podle kontextu zpracovávaného bitu. Rozdílem oproti běžným neuronovým sítím je způsob adaptace vah. Zde neminimalizujeme kvadratickou odchylku, ale váhy použité pro kombinaci pravděpodobností z jednotlivých modelů jsou adaptovány tak, aby minimalizovaly počet bitů potřebných na zakódování (tj. maximalizují kompresní poměr). Po kombinaci pravděpodobností se ještě výstup neuronové sítě transformuje pomocí série několika APM (adaptive probability map). APM je funkce jejíž vstupem je vstupní pravděpodobnost a kontext, výstupem je pak pravděpodobnost. Také APM jsou adaptivní a vedou na zlepšení kompresního poměru. Konečnou fází je aritmetické kódování. Více podrobností viz [7] nebo komentáře ve zdrojových kódech v paq8 (viz [8]). 26

4.2 Implementace v PAQ8 Konkrétní implementací CM algoritmu je program PAQ8 od M. Mahoneyho. Používají se zde následující typy modelů: Run Map Stationary Map Nonstationary Map Match model Pro Run Map(b, n) se predikuje podle hodnoty posledního bitu (0 nebo 1 - označena b) v bitové historii a počtu jeho bezprostředního opakování za sebou (označen n). Predikce modelu je p = (2 b 1) K 1 log (n + 1). Stationary Map predikuje podle podílu jedničkových a nulových bitů v bitové historii. Stav S se pro bit i obnovuje pomocí formule S := S + K 2 (i S), predikce je ( p = log S 1 S ). Nonstationary Map tvoří kompromis mezi oběma možnostmi. Obsahuje osmibitový stav, který reprezentuje různé predikce (dvojice udávající podíl nul a jedniček). Match Model má stav (c, b), kde c je nula, pokud nebyl kontext přítomen v minulých datech, jinak jedna a b je bit následující v tomto kontextu. Predikce je p = (2 b 1) K 3 c log (m + 1), pro m udávající délku kontextu. K 1, K 2 a K 3 jsou vhodně zvolené ad-hoc konstanty. Prvním krokem komprese je transformace dat. V tomto kroku se převádí (v případě komprese spustitelných souborů exe/dll) relativní adresy ve spustitelném kódu na absolutní (e8/e9 transformace). To výrazně zlepšuje kompresní poměr pro tento typ dat. V dalším kroku se soubor prochází po jednotlivých bitech. Před zpracováním každého bitu je nejprve provedena predikce - určení pravděpodobnosti, že je bit jednička. Následně se tento bit pomocí aritmetického kódování zakóduje. S použitím znalosti hodnoty bitu jsou poté adaptovány všechny součásti použité při predikci. Upraví se tak, aby se maximalizovala přesnost predikce a tím minimalizoval počet bitů potřebný pro uložení následných dat. Při predikci se využijí a při aktualizaci se adaptují tyto součásti: stavy jednotlivých modelů a jejich kontexty váhy použité neuronové sítě stavy APM 4.3 Modelování a predikce v JPEG souboru PAQ8 je kompresor, který má implementován model pro komprimované obrázky JPEG. Tento model pracuje přímo a jednoprůchodově, to znamená, že provádí predikci následujícího bitu přímo v komprimovaném souboru podle předchozích dat. K tomu je třeba proud bitů nejprve rozdělit na jednotlivé kódy (nadále je budeme označovat H-symboly). Následně se rozdělí na dvojice [Huffmanův kód, 27

dodatečné bity]. Huffmanův kód se dekóduje a převede se na příslušnou [R, S] dvojici pomocí Huffmanových tabulek. Při predikci následujícího bitu se v zásadě používají dva typy kontextu. Prvním z nich je už dekódovaná část aktuálního H-symbolu. Tady se využívá nedokonalosti Huffmanova kódování tak, jak je použito při JPEG kompresi. Různé H-symboly mají různé pravděpodobnosti výskytu v proudu bitů. Druhou součást kontextu tvoří 19 dalších informací nebo znalostí o aktuální pozici v rámci bloku či obrázku, okolních koeficientech, barevné složce a podobně. Podrobný seznam je uveden v tabulkách 4.1 a 4.2. HC dosud načtené bity z kódu pro aktuální koeficient s přidaným nejvyšším bitem ZZ, ZU, ZV pozice koeficientu v bloku COMP číslo dané barevné složky / komponenty COMP2 číslo daného bloku v rámci skupiny C_TOP, C_LEFT hodnota stejného koeficientu v bloku předchozí skupiny (vlevo) a o řádek dříve (nahoře) vyjádřená jedním bytem C_LAST hodnota předcházejícího koeficientu vyjádřená jedním bytem SSUM součet hodnot S v RS-kódech v bezprostředně předchozím bloku SSUM3 součet hodnot S v RS-kódech v předchozím bloku vzdáleným o tři pozice COLUMN pozice bloku v obrázku (číslo sloupce) RS1, RS2, RS3 RS-kódy předchozích koeficientů DC hodnota DC (0, 0) koeficientu v bloku HUFF1 hašovaná hodnota posledního Huffmanova kódu odpovídajícímu poslednímu dekódovanému koeficientu Tabulka 4.1: Popis součástí kontextů pro původní JPEG model Pro jednotlivé kontexty si model pamatuje stav odvozený od bitové historie, podle kterého určuje pravděpodobnost výskytu 0 či 1. Tímto získáme 19 pravděpodobností odvozených z různých kontextů. Ty jsou pak kombinovány pomocí neuronové sítě, která se snaží minimalizovat cenu pro uložení dat (viz předchozí podkapitoly). Výsledná pravděpodobnost je ještě opravována pomocí APM (mapuje pravděpodobnosti v závislosti na kontextu). Jako kontext pro APM mapování se vybírá posledních 10 bitů aktuálního H-symbolu. Výsledkem celého postupu je jedna pravděpodobnost, která se nadále použije jako vstup do hlavního Context Mixing algoritmu. Protože jiné modely nemohou poskytnout srovnatelně kvalitní odhad pravděpodobnosti, přiřazuje neuronová 28

hash(0, HC, COMP2, ZZ / 4, min(3, ZZ)) hash(1, HC, (COMP2 == 0), C_LEFT) hash(2, HC, (COMP2 == 0), C_TOP) hash(3, HC, round(log2(ssum3) * 16), COMP, ZZ) hash(4, HC, COMP, ZZ, COLUMN / 8) hash(5, HC, COMP, ZZ, COLUMN / 2) hash(6, HC, RS1, COMP2, ZZ / 16) hash(7, HC, RS1, RS2) hash(8, HC, RS1, RS2, RS3) hash(9, HC, SSUM / 16, COMP2, ZZ) hash(10, HC, COMP2, ZZ / 16, C_LAST) hash(11, HC, DC) hash(12, HC, RS1, COMP, ZZ) hash(13, HC, RS1, RS2, COMP, ZZ) hash(14, HC, COMP2, ZZ / 8, SSUM3 / 8) hash(15, HC, HUFF1) hash(16, HC, COMP, ZZ, HUFF1) hash(17, HC, ZU, COMP) hash(18, HC, ZV, COMP) Tabulka 4.2: Seznam kontextů pro původní JPEG model síť veškerou váhu právě našemu vstupu. Tento model navrhl pro svůj program paq8 M. Mahoney (viz [8]). Konkrétně tento model pochází z verze programu paq8f. Počínaje verzí paq8m obsahuje JPEG model paq8 vylepšení popsaná v následující kapitole. 29

Kapitola 5 Vylepšený model 5.1 Základní verze V základní verzi je provedena kombinace původního JPEG modelu s predikcí koeficientů z okolních bloků tak, jak je popsána v kapitole 3. K tomuto je potřeba počítat při průchodu souborem hodnotu predikce. Dále je nutno vhodně začlenit tyto hodnoty jako kontext nebo část kontextů pro konkrétní statistické modelování. Ve fázi počítání koeficientů je použit rychlý algoritmus (3.2). Pomocí něho získáme dvě hodnoty predikce - z bloku o jedno pole nahoře a z bloku o jedno pole vlevo. Protože v tomto případě čte kompresor původní JPEG soubor, je třeba predikovat jednotlivé kódy, které odpovídají jednotlivým hodnotám RSkódu (r, s). Získaná predikce pomocí algoritmu (3.2) nám dává smysluplný odhad jen pro případ r = 0 (tj. bez využití RLE). To znamená, že nekódujeme žádný počet nul, ale přímo velikost koeficientu. Abychom alespoň částečně umožnili odhad i pro případ nenulového r, zavedeme navíc odhad r a odhad znaménka koeficientu vzdáleného právě o r (tj. koeficient odpovídající příslušnému RS-kódu). Algoritmus pouze prochází predikce pro několik následujících koeficientů v zig-zag posloupnosti a počítá pro kolik bezprostředně následujících je odhad menší nebo přibližně stejný jako ten současný. To může fungovat, protože se zabýváme případem, kdy r je nenulové a současný odhad by měl odhadovat nulu. Výsledkem této fáze jsou pro každou pozici tři hodnoty. První a druhá odpovídají odhadům z levého (A[0]) a horního (A[2]) bloku, třetí jejich průměru (A[1]). Navíc jsou tyto hodnoty transformovány pomocí logaritmu, aby se zajistilo, že vysoké hodnoty budou dostatečně časté. K těmto třem hodnotám se ke každé přidají bity odpovídající odhadu r (vytvořený z koeficientů z odpovídajícího směru). Druhou částí základní verze je zakomponování těchto třech hodnot A[0], A[1] a A[2] mezi kontexty pro modelování bitových historií. Jednou z možností, která se při testech ukázala jako výhodná, je uvedena v tabulce (5.1). 30

hash(0, HC, COMP2, ZZ / 4, min(3, ZZ)) hash(1, HC, RS1, COMP, A[0]) hash(2, HC, RS1, COMP, A[1]) hash(3, HC, RS1, COMP, A[2]) hash(4, HC, COMP, ZZ, COLUMN / 8) hash(5, HC, COMP, ZZ, COLUMN / 2) hash(6, HC, RS1, COMP2, ZZ / 16) hash(7, HC, RS1, RS2) hash(8, HC, RS1, RS2, RS3) hash(9, HC, SSUM / 16, COMP2, ZZ) hash(10, HC, COMP2, ZZ / 16, C_LAST) hash(11, HC, DC) hash(12, HC, RS1, COMP, ZZ) hash(13, HC, RS1, RS2, COMP, ZZ) hash(14, HC, COMP2, ZZ / 8, SSUM3 / 8) hash(15, HC, (COMP2 == 0), C_TOP) hash(16, HC, COMP, ZZ, A[0]) hash(17, HC, COMP, ZZ, A[1]) hash(18, HC, COMP, ZZ, A[2]) Tabulka 5.1: Seznam kontextů pro vylepšený JPEG model (základní verze) 5.2 Možnosti zlepšení a pokročilá verze Pro další vylepšení účinnosti modelování JPEG souboru pomocí tohoto modelu existuje několik možností. První z nich je přidání kontextové informace o okolních DCT koeficientech v aktuálním bloku, která v původní verzi chybí. Přidáme doplňující hodnoty LCP[0]..LCP[3] do modelu. Ty budou podobně jako v případě predikce pomocí okolních bloků vyjadřovat predikci zleva a shora. LCP[0] a LCP[1] odpovídají buňkám o jednu pozici od aktuální a LCP[2] a LCP[3] o dvě pozice od aktuální. V tomto případě se vyjde přímo z konkrétního koeficientu, který se pouze dekvantuje v závislosti na jeho poloze a opět kvantuje v závislosti na aktuální poloze. Druhou možností zlepšení je přeskupení a úprava kontextů pro modelování bitové historie. V rámci této úpravy se zde začlení i hodnoty LCP z předchozího odstavce. V tabulkách 5.2 a 5.3 je uveden upravený seznam a popis položek. Počet použitých kombinovaných kontextů je zde zvýšen z 19 na 28. Třetím zlepšením je začlenění predikce pomocí okolních bloků (A[1]) do APM 31

MC MC := 4 * HC + 2 * (ZZ == 0) + (COMP == 0) HC dosud načtené bity z kódu pro aktuální koeficient s přidaným nejvyšším bitem ZZ, ZU, ZV pozice koeficientu v bloku COMP číslo dané barevné složky / komponenty COMP2 číslo daného bloku v rámci skupiny C_TOP, C_LEFT hodnota stejného koeficientu v bloku předchozí skupiny (vlevo) a o řádek dříve (nahoře) vyjádřená jedním bytem SSUM součet hodnot S v RS-kódech v bezprostředně předchozím bloku SSUM2 pro COMP2 = 0 SSUM pro poslední blok první komponenty / jinak celkový součet SSUM pro předcházející bloky první komponenty v rámci jedné skupiny COLUMN pozice bloku v obrázku (číslo sloupce) RS1 RS-kód předchozího koeficientu A[0]..A[6] predikce koeficientu spočítané na základě lineární kombinace koeficientů z tohoto a sousedního bloku (viz algoritmus 3.2) LCP[0]..LCP[2] upravené hodnoty sousedních koeficientů v tomto bloku (o jedno nebo dvě pole vlevo nebo nahoře) Tabulka 5.2: Popis součástí kontextů pro upravený JPEG model kontextu, který upravuje už získané pravděpodobnosti získané ze statistického modelu v předchozím kroku. Další doplňující změnou je také speciální ošetření prvního řádku a sloupce tak, aby v tomto případě, kdy nelze predikce provést, nebyly znehodnocovány statistiky pro kontextové modelování. To se provede tak, že v případě prvního řádku nahradíme hodnotu A[2] speciální hodnotou a A[1] nahradíme A[0]. Pro první sloupec analogicky nahradíme A[0] speciální hodnotou a A[1] nahradíme A[2]. 5.3 Implementace Vstupem tohoto algoritmu (5.1), který pro danou pozici v JPEG souboru aktualizuje kontexty pro CM algoritmus, jsou dva druhy dat. Prvním jsou kvantované DCT koeficienty ze současného a předcházejících sousedních bloků. Protože se koeficienty procházejí v zig-zag pořadí, známe v aktuálním bloku pouze ty, které se nacházejí před současnou pozicí. Tyto koeficienty využíváme pouze v kroku 32

(1). Přitom informace ze sousedních bloků se přečte pouze jedenkrát při vstupu do bloku. Dalším vstupem tohoto algoritmu je informace o pozici koeficientu, ZZ udává pozici v rámci bloku v zig-zag pořadí a COL a ROW udávají pozici bloku v obrázku (COL = číslo sloupce, ROW = číslo řádku). V kroku (1) se provádí aktualizace proměnných SU[0]..SU[7] a SV[0]..SV[7]. V nich jsou udržovány příslušné lineární kombinace dekvantovaných koeficientů. Odpovídají sumám počítaných v algoritmu 3.2. Tyto hodnoty se použijí pro konstrukci predikcí A[0]..A[6] v kroku (2). Ty odpovídají transformovaným predikcím algoritmu 3.2. Z hodnot uložených v SU[i] a SV[j] pro pozici (i, j) dostáváme predikci shora a zleva. Jejich různou vzájemnou kombinací a následnou transformací dostaneme hodnoty A[0]..A[6]. Třetí krok algoritmu dopočítává hodnoty sousedních koeficientů v bloku. Nakonec ošetříme speciálně první řádek a sloupec. Na výstupu tedy dostáváme 11 hodnot, které využijeme v Context Mixing algoritmu jako součásti kontextů (viz tabulka 5.3) 5.4 Experimentální výsledky Obrázek 5.1: Graf srovnávající úsporu místa při kompresi různými programy Pro otestování výkonnosti uvedené metody následné komprese JPEG souborů byly využity náhodně vybrané obrázky ze dvou digitálních fotoaparátů s rozlišením 2 a 3 megapixely. Vybíráno bylo pomocí pseudonáhodného generátoru z celkového počtu 8356 a 4512 Fotografií bylo celkem 40 (po dvaceti z každého fotoaparátu). Jejich celková velikost dosáhla 23,9MB. Testovanými programy byly: paq8p s původní verzí JPEG modelu (z verze programu paq8f) paq8p se základní verzí JPEG modelu paq8p s pokročilou verzí JPEG modelu (viz algoritmus 5.1) 33