Kaip vaizdinė informacija suspaudžiama JPEG formate

image

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ą.

image

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.

300g

Jei vaizdas atsitiktinis JPEG formate užims 103 KB.

300r

(sugeneruota su random.org)

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

Tokiame spalvų modelyje yra viena skaisčio komponentė(luma) – Y ir dvi spalvos komponentės(chroma) – Cb Cr.

Iš vieno modelio į kitą pereinama taip:

image

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į.

image

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į.

http://cnx.org/content/m13173/latest/take_DCT

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ų.

http://www.irisa.fr/temics/staff/martin/dico_dct_large.gif

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ą.

Idct-animation

(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.

image

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:

image

Gautos reikšmės apvalinamos į mažesnę pusę.

image

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.

File:JPEG ZigZag.svg

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.

css.php
Bear