Nenustebinsiu parašęs, jog kiekvienas rastinis vaizdas susideda iš mažų taškų – pikselių. RGB spalvų modelyje kiekvienas pikselis išreiškiamas raudonos, žalios, mėlynos spalvos intensyvumu. Kai visos RGB reikšmės 0 – gauname juodą spalvą, kai maksimalios – baltą.
Kiekvieną spalva išreiškiama 0-255 ribose, t.y. 8 bitais. Kadangi turime 3 spalvas, tad 1 pikselis aprašomas 24 bitais. Jeigu turime 6 megapikselių nuotrauką tai ji turėtų užimti 24 * 6 mln. = 144 milijonus bitų, 18 milijonų baitų, arba 17 Megabaitų. Išsaugant nuotrauką BMP formatu be kompresijos ji tiek ir užima. Naudojant JPEG formatą priklausomai nuo pačios nuotraukos turinio ši gali užimti diske tik 2 MB arba net mažiau.
Pavyzdžiui 300×300 vaizdas nesuspaustas užima 263 KB. Jei tai vienos spalvos jis JPEG formate užima 2.1 KB esant 95 % kokybei.
Jei vaizdas atsitiktinis JPEG formate užims 103 KB.
Tiesa reiktų nepamiršti, jog saugant JPEG formatu, negrįžtamai dingsta dalis informacijos, nors ir neįgudusi akis gali ir nepastebėti skirtumo.
JPEG algoritmas
Pasak wiki dažniausiai kompresijai taikomas toks algoritmas:
- spalvų modelio pakeitimas į Y′CBCR
- spalvų komponenčių raiškos sumažinimas
- atliekama diskreti kosinuso transformacija
- kvantavimas
- informacijos suspaudimas neprarandant kokybės
Spalvų modelio pakeitimas į Y′CBCR
Tokiame spalvų modelyje yra viena skaisčio komponentė(luma) – Y ir dvi spalvos komponentės(chroma) – Cb Cr.
Iš vieno modelio į kitą pereinama taip:
Modelio privalumas, jog yra išskirta skaisčio komponentė, o žmogaus akis kaip tik labiau reaguoja į šviesos stiprumą, nei į spalvą. Taip pat žmogaus akis yra jautriausia žaliai spalvai, tad ir atstatant RGB modelį žalios spalvos reikšmė atkuriama iš visų trijų Y′CBCR komponenčių.
Spalvų komponenčių raiškos sumažinimas
Dėl žmogaus akies savybių stengiamasi sumažinti spalvinės informacijos kiekį.
jpeg dažniausiai naudojamas 4:2:0 standartas, kur spalvinė informacija sumažinama 4 kartus, o bendrai informacija sumažėja 2/3.
Diskreti kosinuso transformacija (DCT)
Vaizdinė informacijos kiekviena komponentė (Y, Cb, Cr) dalinama į 8×8 blokus, arba 16×16 blokus jei naudojamas (4:2:0) standartas. Atliekant diskretinę kosinuso transformaciją signalas perkeliamas į dažnio sritį.
Atliekant DCT transformaciją gaunama DCT koeficientų matrica(koeficientai pavyzdyje suapvalinti). Joje jau amplitudės atidėtos ne pagal X Y koordinates, o pagal dažnį. Kiekvienas matricos elementas atspindi vieną iš 64 funkcijų.
Taigi 8×8 aprašomas 64 iš anksto žinomomis funkcijomis(vaizdais). Norint atstatyti pirminį vaizdą užtenka sukloti tuos 64 vaizdus vieną ant kito prieš tai jų intensyvumą nustačius pagal DFT koeficientų matricą.
(A raidės vaizdo atstatymas, kairėje progresas, per vidurį funkcija su reikalinga amplitude, dešinėje bazinė funkcija )
Kvantavimas
Po DFT informacijos ne tik, kad sumažėja, bet ir išauga, kadangi 8×8 matricoje amplitudėms aprašyti reikia didesnio nei 8 bitų skaičiaus, kadangi rezultate gaunama matrica su nesveikais skaičiais.
Kaip matote didesnės amplitudės yra kairiajame viršutiniame kampe, kur yra mažesnis dažnis, o žmogaus akis jautriau reaguoja į tolydžius tarkime šviesumo pasikeitimus, nei staigius, tad stengiamasi taupant duomenis atsikratyti aukštųjų dažnių.
DFT koeficientai yra padalinami iš tokios kvantavimo matricos:
Gautos reikšmės apvalinamos į mažesnę pusę.
Nuo kvantavimo matricos elemento dydžio priklauso JPEG suspaudimo laipsnis. Kuo dydžiai didesni, tuo mažiau duomenų lieka vaizdo informacijos atstatymui.
Informacijos suspaudimas neprarandant kokybės
Kadangi po kvantavimo DFT koeficientai lieka kampe jiems surinkti naudojamas zigzaginis skenavimas.
Likę nuliai atmetami ir atliekamas Huffman kodo algoritmas.
Trumpai apie PNG
PNG tai formatas kuriame kokybė nėra prarandama. Suspaudimui naudojami du būdai.
Pirmiausiai atliekama taip vadinama filtracija, kas išties yra prognozavimas. Pikselio reikšmė prognozuojama pagal kaimyninius pikselius. Skirtumas tarp prognozės ir realios reikšmės yra filtravimo rezultatas. Tokiu būdu pikseliui koduoti reikia mažiau duomenų, kadangi skirtumas gali būti 0 arba artimas jam.
Apdorojus duomenis atliekamas DEFLATE algoritmas.