JPEG. Kompresje algoritme

Nochris goeie! Ik fûn dit artikel werom yn maaie 2019. Dit is in fuortsetting fan in searje artikels oer WAVE en JPEG, hjir earst. Dizze publikaasje sil ynformaasje befetsje oer it byldkodearringsalgoritme en it formaat sels as gehiel.

In stikje skiednis

In eetlepel fan Wikipedia-artikel:

JPEG (Joint Photographic Experts Group) is ien fan 'e populêre rastergrafykformaten dy't brûkt wurde foar it bewarjen fan foto's en ferlykbere ôfbyldings.

Dizze standert waard ûntwikkele troch de Joint Photographic Experts Group werom yn 1991 foar effisjinte ôfbyldingskompresje.

Hoe geane ôfbyldings fan rau nei JPEG?

Guon minsken tinke dat JPEG-ôfbyldings rauwe gegevens binne komprimearre mei de Huffman-metoade, mar dit is net wier. Foardat kontrôle kompresje, gegevens reizgje in lange wei.

Earst wurdt it kleurmodel feroare fan RGB nei YCbCr. D'r is sels in spesjaal algoritme foar dit - hjir. Y wurdt net oanrekke, om't it ferantwurdlik is foar helderheid, en syn feroaring sil merkber wêze.

It earste ding om te dwaan mei it byld is "útdunning" (subsampling). Dit is maklik te begripen: in 2x2-array fan piksels wurdt nommen, dan wurde Cb en Cr nommen - de gemiddelde wearden fan elk fan 'e YCbCr-komponinten fan dizze 4 piksels. Sa, wy wûn 6 bytes, ynstee fan 4 Y, 4 Cb, 4 Cr krigen wy 4 Y en deselde Cb en Cr foar elk fan harren (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Op sels skaal fan 2x2 klinkt lossy kompresje mei in 2:1 kompresjeferhâlding solide. Dit jildt foar it hiele byld. En sa - se sakke in heale maat. En wy kinne dizze technyk brûke troch ús kleurpersepsje. In persoan sil maklik in ferskil yn helderheid fernimme, mar net yn kleur, as it gemiddelde wurdt oer in lyts blok piksels. Thinning kin ek dien wurde yn in line, 4 piksels horizontaal en fertikaal. De earste opsje wurdt faker brûkt. As ôfbyldingskwaliteit wichtich is, dan wurdt desimaasje hielendal net útfierd.
In fisuele yllustraasje fan tinner (Habr liet my net in gif ynfoegje) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

It wichtichste part fan 'e tarieding

PrEP

No komt it dreechste en meast needsaaklike diel. De hiele ôfbylding is ferdield yn 8x8 blokken (folling wurdt brûkt as de resolúsje net in mearfâld fan 'e blokkant is).

No jilde foar elk blok DCT (Discrete Cosine Transform). Yn dit diel wurdt alles wat net nedich is út 'e foto helle. Mei help fan DCT moatte jo begripe oft in opjûne blok (8 × 8) beskriuwt in monotoane diel fan it byld: de himel, de muorre; of it befettet komplekse struktuer (hier, symboalen, ensfh). It is logysk dat 64 piksels fan ferlykbere kleur kin wurde beskreaun troch mar 1, omdat de blokgrutte is al bekend. Safolle foar de kompresje: 64 oant 1.

DCT feroaret it blok yn in spektrum, en wêr't de lêzingen skerp feroarje, wurdt de koeffizient posityf, en de skerper de oergong, hoe heger de útfier sil wêze. Wêr't de koeffizient heger is, toant de ôfbylding dúdlike transysjes yn kleur en helderheid, wêr't it leger is - swakke (glêde) feroaringen yn 'e wearden fan' e YCbCr-komponinten yn it blok.

Quantization

Kompresje-ynstellings wurde hjir al tapast. Elk fan 'e koeffizienten yn elk fan' e 8x8-matriksen wurdt dield troch in bepaald getal. As jo ​​de ôfbyldingskwaliteit net sille ferminderje nei al syn oanpassingen, dan moat de divisor ien wêze. As it ûnthâld dat dizze foto beset is wichtiger foar jo, dan sil de divisor grutter wêze as 1, en it kwotient wurdt rûn. It docht bliken dat jo nei ôfrûning faaks op in protte nullen komme.

Kwantisaasje wurdt dien om de mooglikheid te meitsjen fan noch gruttere kompresje. Hjir is hoe't it liket mei it foarbyld fan it kwantisearjen fan de grafyk y = sin (x):

JPEG. Kompresje algoritme

Kompresje

Earst geane wy ​​troch de matrix yn in zig-zag patroan:

JPEG. Kompresje algoritme

Wy krije in iendiminsjonale array mei nûmers. Wy sjogge dat der in protte nullen yn sitte, dy kinne fuorthelle wurde. Om dit te dwaan, yn stee fan in folchoarder fan in protte nullen, ynfiere wy 1 nul en dêrnei in nûmer dat har nûmer yn 'e folchoarder oanjout. Op dizze manier kinne jo weromsette nei 1/3 fan 'e grutte fan' e heule array. En dan komprimearje wy dizze array gewoan mei de Huffman-metoade en skriuwe it yn it bestân sels.

Wêr wurdt brûkt

Oeral. Lykas PNG wurdt JPEG brûkt yn kamera's, OS's (as bedriuwslogo's, applikaasje-ikoanen, thumbnails) en yn alle mooglike gebieten wêr't ôfbyldings effisjint opslein wurde moatte.

konklúzje

Op it stuit is kennis oer JPEG no allinich weardefol foar edukative doelen, om't it al oeral ynboud is en troch grutte groepen minsken optimalisearre is, mar it granyt fan 'e wittenskip is noch altyd lekker.

Boarnen

Artikel oer YCbCr op Wikipedia
Wikipedia-artikel oer JPEG
In bytsje oer PrEP fan 'e Pikabu-post
Wikipedia-artikel oer PrEP

Boarne: www.habr.com

Add a comment