Ahoj znovu! Našel jsem tento článek, napsaný ještě v květnu 2019. Toto je pokračování série článků o WAVE a JPEG. Tento příspěvek bude zahrnovat informace o algoritmu kódování obrazů a o formátu jako takovém.
Špetka historie
Lžíce z článku z Wikipedie:
JPEG (Joint Photographic Experts Group) je jeden z populárních rastrových grafických formátů, používaných pro uchovávání fotografií a podobných obrazů.
Tento standard byl vyvinut Společnou skupinou expertů na fotografii již v roce 1991 pro efektivní kompresi obrazů.
Jaký je postup, jímž procházejí obrazy od surového stavu k JPEG?
Někteří se domnívají, že JPEG obrázky jsou komprimované metodou Huffmanova kódování, ale to není pravda. Před kontrolním stlačením procházejí data dlouhou cestou.
Nejprve se mění barevný model z RGB na YCbCr. K tomu existuje speciální algoritmus — . Y se nemění, protože odpovídá za jas, a jeho změna bude patrná.
První, co se s obrazem dělá, je "zkracování" (subsampling). Je to jednoduché: vezme se 2x2 matice pixelů, dále se z Cb a Cr berou průměrné hodnoty každé složky YCbCr těchto 4 pixelů. A tak, získali jsme 6 bajtů, místo 4 Y, 4 Cb, 4 Cr jsme dostali 4 Y a stejné pro každé z nich Cb a Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). V měřítku dokonce i 2×2 komprese s ztrátou s koeficientem komprese 2:1 zní solidně. To se aplikuje na celý obraz. A tak — snížili jsme polovinu velikosti. A takový postup můžeme použít díky našemu barevnému vnímání. Člověk snadno zaznamená rozdíl v jasu, ale ne v barvě, pokud je průměrná v malém bloku pixelů. Zkracování může být také prováděno v linii, 4 pixely horizontálně a vertikálně. První varianta se používá častěji. Pokud je důležitá kvalita obrazu, pak se zkracování vůbec neprovádí.
Ilustrativní příklad zkracování (Habr nedovolil vložit gif) —
Hlavní část přípravy
DCT
Teď ta nejkomplexnější a nejpotřebnější část. Celý obrázek se rozděluje na bloky 8x8 (používá se vyplnění, pokud není rozlišení násobkem strany bloku).
Nyní se na každý blok aplikuje DCT (diskrétní kosinová transformace). V této části se z obrázku odstraňují všechny nadbytečné prvky. Pomocí DCT je třeba pochopit, zda tento blok (8×8) popisuje nějakou monotónní část obrazu: oblohu, zeď; nebo zda obsahuje složitou strukturu (vlasy, symboly atd.). Je logické, že 64 podobných barevných pixelů lze popsat pouze jedním, protože velikost bloku je již známa. Tímto způsobem dochází ke kompresi: 64 k 1.
DCT převádí blok na spektrum, a tam, kde se hodnoty prudce mění, se koeficient stává kladným, a čím prudší přechod, tím vyšší bude výstup. Kde je koeficient vyšší, na obrázku jsou jasné přechody v barvě a jasnosti, kde je nižší — slabé (plynulé) změny hodnot komponentů YCbCr v bloku.
Kvantilizace
Zde se již aplikují nastavení komprese. Každý z koeficientů v každé z matric 8×8 se dělí na určité číslo. Pokud po všech úpravách kvalitu obrazu již více snižovat nebudete, musí být dělitel jednotkový. Pokud je pro vás důležitější paměť, kterou tato fotografie zabírá, bude dělitel větší než 1 a podíl se zaokrouhluje. Tak se stává, že po zaokrouhlení se často vyskytuje mnoho nul.
Kvantilizace se provádí za účelem vytvoření možnosti ještě větší komprese. Takto to vypadá na příkladu kvantilizace grafu y = sin(x):

Kompresce
Nejprve procházíme maticí zig-zag:

Získáme jednorozměrné pole s čísly. Vidíme, že v něm je mnoho nul, které lze odstranit. K tomu místo sekvence mnoha nul vpisujeme 1 nulu a za ní číslo, které označuje jejich počet v sekvenci. Tímto způsobem lze zmenšit celkové pole na 1/3 původní velikosti. A poté se toto pole prostě zkomprimuje metodou Huffman a vpisuje se již do samotného souboru.
Kde se používá
Všude. Stejně jako PNG je JPEG používán ve fotoaparátech, operačních systémech (jako loga společností, ikony aplikací, miniatury) a ve všech možných oblastech, kde je třeba efektivně ukládat obrázky.
Výstup
V současné době jsou znalosti o JPEG cenné pouze pro vzdělávací účely, protože je již všude zabudován a optimalizován velkými skupinami lidí, ale pravda vědy je stále lákavá.
Zdroje
Zdroj: habr.com
