JPEG. Compression algorithm

Hello ulit! Natagpuan ko ang artikulong ito na isinulat noong Mayo 2019. Ito ay isang pagpapatuloy ng isang serye ng mga artikulo tungkol sa WAVE at JPEG, dito muna. Ang publication na ito ay magsasama ng impormasyon tungkol sa image encoding algorithm at ang format mismo sa kabuuan.

Isang kurot ng kasaysayan

Isang kutsarang artikulo sa Wikipedia:

Ang JPEG (Joint Photographic Experts Group) ay isa sa mga sikat na format ng raster graphics na ginagamit para sa pag-iimbak ng mga litrato at mga katulad na larawan.

Ang pamantayang ito ay binuo ng Joint Photographic Experts Group noong 1991 para sa mahusay na compression ng imahe.

Paano napupunta ang mga larawan mula raw sa JPEG?

Iniisip ng ilang tao na ang mga JPEG na imahe ay hilaw na data na na-compress gamit ang Huffman method, ngunit hindi ito totoo. Bago makontrol ang compression, malayo ang paglalakbay ng data.

Una, ang modelo ng kulay ay binago mula RGB patungong YCbCr. Mayroong kahit isang espesyal na algorithm para dito - dito. Ang Y ay hindi ginagalaw, dahil responsable ito para sa liwanag, at ang pagbabago nito ay kapansin-pansin.

Ang unang bagay na gagawin sa imahe ay "pagnipis" (subsampling). Madaling maunawaan: ang isang 2x2 na hanay ng mga pixel ay kinuha, pagkatapos ay ang Cb at Cr ay kinuha - ang mga average na halaga ng bawat isa sa mga bahagi ng YCbCr ng 4 na mga pixel na ito. Kaya, nanalo kami ng 6 bytes, sa halip na 4 Y, 4 Cb, 4 Cr nakuha namin ang 4 Y at ang parehong Cb at Cr para sa bawat isa sa kanila (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Kahit na 2x2 scale, ang lossy compression na may 2:1 compression ratio ay mukhang solid. Nalalapat ito sa buong larawan. At kaya - bumaba sila ng kalahating sukat. At maaari naming gamitin ang diskarteng ito salamat sa aming pang-unawa sa kulay. Ang isang tao ay madaling mapansin ang isang pagkakaiba sa liwanag, ngunit hindi sa kulay, kung ito ay na-average sa isang maliit na bloke ng mga pixel. Ang pagnipis ay maaari ding gawin sa isang linya, 4 na pixel nang pahalang at patayo. Ang unang pagpipilian ay ginagamit nang mas madalas. Kung ang kalidad ng imahe ay mahalaga, kung gayon ang decimation ay hindi gumanap sa lahat.
Isang visual na paglalarawan ng pagnipis (hindi ako pinayagan ni Habr na magsingit ng gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Ang pangunahing bahagi ng paghahanda

PrEP

Dumating na ngayon ang pinakamahirap at pinakakailangan na bahagi. Ang buong imahe ay nahahati sa 8x8 na mga bloke (ginagamit ang pagpuno kung ang resolution ay hindi isang multiple ng block side).

Ngayon mag-apply sa bawat bloke DCT (Discrete Cosine Transform). Sa bahaging ito, lahat ng hindi kailangan ay inalis sa larawan. Gamit ang DCT, kailangan mong maunawaan kung ang isang ibinigay na bloke (8Γ—8) ay naglalarawan ng anumang monotonous na bahagi ng imahe: ang langit, ang dingding; o naglalaman ito ng kumplikadong istraktura (buhok, mga simbolo, atbp.). Ito ay lohikal na ang 64 na mga pixel ng magkatulad na kulay ay maaaring ilarawan sa pamamagitan lamang ng 1, dahil alam na ang laki ng bloke. Napakarami para sa compression: 64 hanggang 1.

Ginagawa ng DCT ang block sa isang spectrum, at kung saan ang mga pagbabasa ay nagbabago nang husto, ang koepisyent ay nagiging positibo, at ang mas matalas na paglipat, mas mataas ang magiging output. Kung saan mas mataas ang koepisyent, ang larawan ay nagpapakita ng malinaw na mga paglipat sa kulay at ningning, kung saan ito ay mas mababa - mahina (makinis) na mga pagbabago sa mga halaga ng mga bahagi ng YCbCr sa bloke.

Quantization

Nailapat na dito ang mga setting ng compression. Ang bawat isa sa mga coefficient sa bawat isa sa 8x8 matrice ay hinati sa isang tiyak na numero. Kung hindi mo babawasan ang kalidad ng imahe pagkatapos ng lahat ng mga pagbabago nito, kung gayon ang divisor ay dapat na isa. Kung ang memorya na inookupahan ng larawang ito ay mas mahalaga sa iyo, kung gayon ang divisor ay magiging mas malaki sa 1, at ang quotient ay bilugan. Ito ay lumiliko na pagkatapos ng pag-ikot ay madalas kang napupunta sa maraming mga zero.

Ginagawa ang quantization upang lumikha ng posibilidad ng mas malaking compression. Narito kung ano ang hitsura nito gamit ang halimbawa ng pag-quantize ng graph y = sin(x):

JPEG. Compression algorithm

Compression

Una, dumaan tayo sa matrix sa isang zig-zag pattern:

JPEG. Compression algorithm

Makakakuha kami ng one-dimensional na array na may mga numero. Nakikita namin na mayroong maraming mga zero sa loob nito, maaari silang alisin. Upang gawin ito, sa halip na isang pagkakasunud-sunod ng maraming mga zero, ipinasok namin ang 1 zero at pagkatapos nito ay isang numero na nagpapahiwatig ng kanilang numero sa pagkakasunud-sunod. Sa ganitong paraan maaari mong i-reset sa 1/3 ang laki ng buong array. At pagkatapos ay i-compress lang namin ang array na ito gamit ang Huffman method at isulat ito sa mismong file.

Kung saan ginamit

Kahit saan. Tulad ng PNG, ginagamit ang JPEG sa mga camera, OS (bilang mga logo ng kumpanya, icon ng application, thumbnail) at sa lahat ng posibleng lugar kung saan kailangang maimbak nang mahusay ang mga larawan.

Pagbubuhos

Sa ngayon, ang kaalaman tungkol sa JPEG ay mahalaga na ngayon para lamang sa mga layuning pang-edukasyon, dahil ito ay itinayo na sa lahat ng dako at na-optimize ng malalaking grupo ng mga tao, ngunit ang granite ng agham ay masarap pa rin.

pinagmumulan

Artikulo tungkol sa YCbCr sa Wikipedia
Artikulo sa Wikipedia sa JPEG
Kaunti tungkol sa PrEP mula sa post ng Pikabu
Artikulo sa Wikipedia sa PrEP

Pinagmulan: www.habr.com

Magdagdag ng komento