Jak komprimuje JPG?
Ahoj znovu! Našel jsem tento článek napsaný v květnu 2019. Toto je pokračování série článků o WAVE a JPEG Zde je první. Tato publikace bude obsahovat informace o algoritmu kódování obrazu a formátu samotném jako celku.
Špetka historie
Lžíce článku na Wikipedii:
JPEG (Joint Photographic Experts Group) je jeden z populárních formátů rastrové grafiky používaný pro ukládání fotografií a podobných obrázků.
Tento standard byl vyvinut společností Joint Photographic Experts Group již v roce 1991 pro účinnou kompresi obrazu.
Jak přecházejí obrázky z raw do JPEG?
Někteří lidé si myslí, že obrázky JPEG jsou nezpracovaná data komprimovaná pomocí Huffmanovy metody, ale to není pravda. Před kontrolní kompresí urazí data dlouhou cestu.
Nejprve se změní barevný model z RGB na YCbCr. Existuje na to dokonce speciální algoritmus – zde. Y se nedotkne, protože je zodpovědné za jas a jeho změna bude patrná.
První věc, kterou je třeba udělat s obrázkem, je “řídnutí” (podvzorkování). Je to snadné pochopit: vezme se pole 2×2 pixelů, pak se vezmou Cb a Cr – průměrné hodnoty každé ze složek YCbCr těchto 4 pixelů. Tak, vyhráli jsme 6 bajtů, místo 4 Y, 4 Cb, 4 Cr jsme dostali 4 Y a pro každý z nich stejné Cb a Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 – 6 = 6). I v měřítku 2×2 zní ztrátová komprese s kompresním poměrem 2:1 solidně. To platí pro celý obrázek. A tak – klesli o polovinu velikosti. A tuto techniku můžeme používat díky našemu vnímání barev. Člověk snadno zaznamená rozdíl v jasu, ale ne v barvě, pokud je zprůměrován přes malý blok pixelů. Ztenčení lze také provést v řádku, 4 pixely vodorovně a svisle. První možnost se používá častěji. Pokud je důležitá kvalita obrazu, pak se decimace vůbec neprovádí.
Vizuální ilustrace ztenčování (Habr mi nedovolil vložit gif) – https://i.ibb.co/Rg5Th9H/150953010617579181.gif
Hlavní část přípravy
Dkp
Nyní přichází ta nejtěžší a nejnutnější část. Celý obrázek je rozdělen do 8×8 bloků (výplň se používá, pokud rozlišení není násobkem strany bloku).
Nyní aplikujte na každý blok DCT (Discrete Cosine Transform). V této části je z obrazu vyjmuto vše nepotřebné. Pomocí DCT musíte pochopit, zda daný blok (8×8) popisuje nějakou monotónní část obrazu: oblohu, zeď; nebo obsahuje složitou strukturu (vlasy, symboly atd.). Je logické, že 64 pixelů podobné barvy lze popsat pouhým 1, protože velikost bloku je již známa. Tolik ke kompresi: 64 ku 1.
DCT změní blok na spektrum a tam, kde se hodnoty prudce změní, koeficient se stane kladným a čím ostřejší je přechod, tím vyšší bude výstup. Kde je koeficient vyšší, na obrázku jsou zřetelné přechody v barvě a jasu, kde je nižší – slabé (hladké) změny hodnot složek YCbCr v bloku.
Kvantování
Zde jsou již použita nastavení komprese. Každý z koeficientů v každé z matic 8×8 je vydělen určitým číslem. Pokud po všech jeho úpravách nesnížíte kvalitu obrazu, pak by měl být dělitel jedna. Pokud je pro vás důležitější paměť obsazená touto fotografií, pak bude dělitel větší než 1 a podíl bude zaokrouhlen. Ukazuje se, že po zaokrouhlení často skončíte se spoustou nul.
Kvantování se provádí za účelem vytvoření možnosti ještě větší komprese. Zde je návod, jak to vypadá na příkladu kvantování grafu y = sin(x):
Komprese
Nejprve projdeme maticí klikatým způsobem:
Dostaneme jednorozměrné pole s čísly. Vidíme, že je v něm hodně nul, dají se odstranit. K tomu místo posloupnosti mnoha nul zadáme 1 nulu a za ní číslo udávající jejich počet v posloupnosti. Tímto způsobem můžete resetovat na 1/3 velikosti celého pole. A pak toto pole jednoduše zkomprimujeme pomocí Huffmanovy metody a zapíšeme do samotného souboru.
Kde se používá
Všude. Stejně jako PNG se i JPEG používá ve fotoaparátech, operačních systémech (jako firemní loga, ikony aplikací, miniatury) a ve všech možných oblastech, kde je potřeba efektivně ukládat obrázky.
Výkon
V tuto chvíli jsou znalosti o JPEGu nyní cenné pouze pro vzdělávací účely, protože je již všude zabudován a optimalizován velkými skupinami lidí, ale žula vědy je stále lahodná.