====== Komprese obrazu ====== Motivace: snaha o zmenšení velikosti souborů např. pro přenos po síti, archivaci apod. ===== Základní přístupy ke kompresi ===== Nejprve je potřeba zvolit v jaké oblasti chceme komprimovat: * Prostorová – statické obrázky (RGB, YCbCr) * Frekvenční – statické obrázky (FFT, DCT, DWT) * Časová – video * Ztrátová – využívají se znalosti o lidském oku, které nejvíce vnímá jasu než barvu. * Bezstrátová – algoritmy pro kódovaní běžných dat (RLE, Huffman, deflate, LZ77). ===== Základní kompresní algoritmy ===== ==== JPEG ==== {{ http://upload.wikimedia.org/wikipedia/commons/e/e9/Felis_silvestris_silvestris_small_gradual_decrease_of_quality.png?300}} [[wp>JPEG]] - Obrázek je převeden do barevného modelu [[wp>YCbCr]] (kódování RGB, kde Y je komponenta luminace a Cb s Cr jsou modrý a červený chrominanční komponent - Jelikož oko vnímá více jas než barvy, Cb a Cr můžeme podvzorkovat = snížit přesnost informací o barvě (Chroma Subsampling) - Celý obrázek je rozdělen do bloků o velikosti 8 × 8 pixelů. A pro každou ze složek (Y, Cb a Cr) se provede Diskrétní cosinová transformace (DCT). DCT je dvourozměrnou obdobou Fourierovy transformace. Blok 8 × 8 se tak vyjádří jako složení signálů o různé frekvenci. - Nad bloky se provede kvantizace. Lidský zrak je citlivý k relativně malé změně v jasu nebo v barvě na poměrně velké ploše (nízké frekvence). V rozlišování konkrétní síly rychle se měnícího jasu (vysokofrekvenční změny) je však mnohem horší. To nám umožňuje informace o takovýchto změnách vynechat. Výsledek DCT se vydělí kvantizační maticí (tabulkou) a zaokrouhlí. Hodnoty v kvantizační tabulce, kterými se budou násobit hodnoty vysokofrekvenčních změn, jsou takové, aby po vydělení původní hodnoty hodnotou z tabulky a zaokrouhlení vyšla nula nebo malé číslo. - Data bloků se dále v zig-zag pořadí komprimují bezeztrátově nejprve pomocí [[wp>Run-length encoding]] (RLE) a pak [[wp>Huffman coding|Huffmanovým kódováním]] nebo pomocí [[wp>Arithmetic coding|Aritmetického kódování]]. Dekódování probíhá inverzně (problém kostičkování). JPEG komprese dosahuje kompresních poměrů od 10:1–20:1 (high) až po 60:1 – 100:1 (low). ==== GIF ==== [[wp>Graphics Interchange Format]] Používá [[wp>Lempel–Ziv–Welch]] algoritmus: - Inicializuj slovník na všechny řetězce dlouhé jeden znak. - Najdi nejdelší možný řetězec ve slovníku, který odpovídá aktuálnímu vstupu. - Zakóduj řetězec indexem ze slovníku. - Přidej řetězec + následující znak ze vstupu do slovníku. - Běž na krok 2. Typický kompresní poměr je 4:1–10:1. ==== PNG ==== [[wp>Portable Network Graphics]] PNG používá dvoustupňovou bezeztrátovou kompresi: - Před samotnou kompresí se snaží objevit běžné vzory (např. barevné pruhy, gradienty). Tento krok se nazývá filtering. - Komprese – PNG ke kompresi používá metodu [[wp>DEFLATE]], což je kombinace algoritmu [[wp>LZ77 and LZ78|LZ77]] a Huffmanova kódování. Kompresní poměr typicky o 10–30 % lepší než GIF.