Ponovno zdravo! Našel sem ta članek, napisan maja 2019. To je nadaljevanje serije člankov o WAVE in JPEG, tukaj . Ta objava bo vsebovala informacije o algoritmu kodiranja slik in o formatu na splošno.
Ščepec zgodovine
Žlico članka iz Wikipedije:
JPEG (Joint Photographic Experts Group) je priljubljen format rastrskih slik, ki se uporablja za shranjevanje fotografij in podobnih slik.
Ta standard je bil razvit s strani Združene ekspertne skupine za fotografijo že leta 1991 za učinkovito stiskanje slik.
Kakšno pot slike prehajajo od surove oblike do JPEG
Nekateri menijo, da so JPEG slike stisnjeni podatki v formatu Huffman, vendar to ni res. Pred končnim stiskanjem podatki preidejo dolgo pot.
Najprej se barvni model spremeni iz RGB v YCbCr. Za to obstaja poseben algoritem — . Y ostane nespremenjen, saj odgovarja za svetlost in bi bila kaka sprememba opazna.
Prvo, kar naredijo s sliko, je »vzorcevanje« (subsampling). To je enostavno razumeti: vzame se 2x2 matrika pikslov, nato pa se vzamejo Cb in Cr – povprečne vrednosti vsake od komponent YCbCr teh 4 pikslov. Tako smo pridobili 6 bajtov, namesto 4 Y, 4 Cb, 4 Cr smo dobili 4 Y in enake Cb in Cr za vsak od njih (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). V primeru celo 2×2 stiskanje s kompresijskim razmerjem 2:1 zveni precej dobro. To se uporablja za celo sliko. Tako smo zmanjšali velikost na polovico. Takšne trike lahko uporabimo zahvaljujoč našem barvnem zaznavanju. Človek zlahka opazi razliko v svetlosti, a ne v barvi, če je povprečena v majhnem bloku pikslov. Prav tako se vzorcevanje lahko izvede v vrstici, 4 piksli po horizontali in vertikali. Prva možnost se pogosteje uporablja. Če je kakovost slike pomembna, vzorcevanje sploh ni izvedeno.
Jasna ilustracija vzorcevanja (Habr ni dovoli vstaviti gif) —
Osrednji del priprave
DCT
Sedaj je najtežji in najpomembnejši del. Vsaka slika se razdeli na bloke 8×8 (uporabljajo se polnjenja, če resolucija ni večkratnik dolžine bloka).
Sedaj se vsakemu bloku uporabi DCT (Diskretna Kosinusna Transformacija). V tejto časti obrázka sa odstraňujú všetky nadbytočné prvky. Použitím DCT treba zistiť, či tento blok (8×8) opisuje nejakú monotónnu časť obrázka: oblohu, stenu; alebo obsahuje zložitú štruktúru (vlasy, symboly atď.). Je logické, že 64 podobných pixelov farbou možno opísať jediným, keďže veľkosť bloku je už známa. A takto dochádza k zmršteniu: 64 na 1.
DCT prevádza blok na spektrum a tam, kde sa hodnoty rýchlo menia, stáva sa koeficient kladným, a čím ostrejší je prechod, tým vyšší bude výstup. Tam, kde je koeficient vyšší, na obrázku sú znázornené jasné prechody v farbe a jasnosti, zatiaľ čo tam, kde je nižší — slabé (hladké) zmeny hodnôt komponentov YCbCr v bloku.
Kvantomovanie
Tu sa už aplikujú nastavenia kompresie. Každý z koeficientov v každej z matic 8×8 sa delí na určité číslo. Ak po všetkých modifikáciách viac nechcete znižovať kvalitu obrázka, musí byť deliteľ rovný jednotke. Ak je dôležitejšia pamäť zaberajúca tento obrázok, deliteľ bude väčší ako 1 a podiel sa zaokrúhľuje. Takto sa často stáva, že po zaokrúhlení vychádza veľa nul.
Kvantomovanie sa vykonáva za účelom ďalšieho zmrštenia. Takto to vyzerá na príklade kvantomovania grafu y = sin(x):

Komprimiranje
Najprv prechádzame maticou zigg-zaggom:

Získavame jednorozmerné pole s číslami. Vidíme, že v ňom je veľa núl, ktoré môžeme odstrániť. Namiesto sekvencie mnohých núl zapisujeme 1 nulu a za ňou číslo, ktoré označuje ich počet v sekvencii. Takto sa môže zmenšiť na 1/3 veľkosti celého poľa. A potom sa jednoducho toto pole komprimuje Huffmanovou metódou a zapisuje do samotného súboru.
Uporaba
Všade. Tak ako PNG, JPEG sa používa v fotoaparátových systémoch, operačných systémoch (ako logá spoločností, ikony aplikácií, náhľady) a vo všetkých možných oblastiach, kde je potrebné efektívne uchovávať obrázky.
Izlaz
Momentálne sú poznatky o JPEG cenné iba na vzdelávacie účely, pretože je už všade zabudovaný a optimalizovaný veľkými skupinami ľudí, ale granit vedy je predsa len chutný.
Izvori
Izvor: habr.com
