Kā darbojas JPEG formāts

JPEG formāta attēli ir sastopami visur mÅ«su digitālajā dzÄ«vē, taču aiz Ŕī izpratnes slāņa slēpjas algoritmi, kuri izslēdz cilvēka acÄ«m neredzamos detaļas. Rezultātā tiek panākta visaugstākā vizuālā kvalitāte ar minimālo faila lielumu – bet kā tieÅ”i tas viss darbojas? ApskatÄ«sim, ko tieÅ”i mÅ«su acis neredz!

Kā darbojas JPEG formāts

Ir viegli pieņemt, ka iespējams nosÅ«tÄ«t fotogrāfiju draugam, nesatraucoties par to, kuru ierÄ«ci, pārlÅ«kprogrammu vai operētājsistēmu viņŔ izmanto – taču tā nebija vienmēr. 1980. gadu sākumā datoriem bija spējas glabāt un rādÄ«t digitālos attēlus, tomēr labākais veids, kā to izdarÄ«t, radÄ«ja daudz konkurējoÅ”u ideju. Nebija iespējams vienkārÅ”i nosÅ«tÄ«t attēlu no viena datora uz citu un cerēt, ka viss darbosies.

Lai atrisinātu Å”o problēmu, 1986. gadā tika izveidota ekspertu komiteja no visas pasaules ar nosaukumu ā€žApvienotā foto ekspertu grupaā€œ (Joint Photographic Experts Group, JPEG), kas tika izveidota starptautiskās standartizācijas organizācijas (ISO) un Starptaustiskās elektrotehniskās komisijas (IEC) kopÄ«gā darbā – divās starptautiskās standartizācijas organizācijās, kuru centrs atrodas Ženēvā (Å veicē).

JPEG grupas cilvēki izveidoja JPEG digitālo attēlu saspieÅ”anas standartu 1992. gadā. Ikviens, kurÅ” ir lietojis internetu, visticamāk, ir saskāries ar JPEG kodētiem attēliem. Tas ir visizplatÄ«tākais attēlu kodēŔanas, nosÅ«tīŔanas un glabāŔanas veids. No tÄ«mekļa lapām lÄ«dz e-pastiem un sociālajiem tÄ«kliem, JPEG tiek izmantots miljardiem reižu dienā – praktiski katru reizi, kad skatāmies attēlu tieÅ”saistē vai to sÅ«tām. Bez JPEG tÄ«meklis bÅ«tu mazāk krāsains, lēnāks, un, iespējams, tajā bÅ«tu mazāk kaÄ·u fotogrāfiju!

Å is raksts ir par to, kā dekodēt JPEG attēlu. Citiem vārdiem sakot, tas attiecas uz to, kas nepiecieÅ”ams, lai pārveidotu datorsistēmā glabātos saspiestos datus par attēlu, kas parādās ekrānā. Par to jāzina ne tikai tāpēc, ka tas ir bÅ«tiski, lai labāk izprastu tehnoloÄ£iju, ko mēs lietojam katru dienu, bet arÄ« tāpēc, ka, atklājot saspieÅ”anas lÄ«meņus, mēs labāk iepazÄ«stam uztveri un redzi, kā arÄ« to, uz kuriem sÄ«kumiem mÅ«su acis ir visjutÄ«gākās.

Turklāt spēlēties ar attēliem Ŕādā veidā ir ļoti interesanti.

Kā darbojas JPEG formāts

Ieskats JPEG iekÅ”ienē

Datorā viss tiek glabāts kā secÄ«ba bināro ciparu. Parasti Å”ie biti, nulles un vieninieki, tiek grupēti pa astoņiem, veidojot baitus. Kad jÅ«s atverat JPEG attēlu datorā, kaut kas (pārlÅ«ks, operētājsistēma, vēl kas) ir jādekodē baitiem, atjaunojot sākotnējo attēlu kā krāsu sarakstu, ko var parādÄ«t.

Ja jÅ«s lejupielādējat Å”o jauko kaÄ·a fotogrāfiju un atverat to teksta redaktorā, jÅ«s ieraudzÄ«siet virkni nesakarÄ«gu simbolu.

Kā darbojas JPEG formāts
Å eit es izmantoju Notepad++, lai izpētÄ«tu faila saturu, jo parastie teksta redaktori, piemēram, Windows Notepad, sabojās bināro failu pēc saglabāŔanas, un tas vairs neatbilst JPEG formātam.

Atverot attēlu teksta redaktorā, jūs sajaucat datoru tāpat kā jūsu smadzenes, kad jūs berzējat acis un sākat redzēt krāsainus plankumus!

Å ie plankumi, ko jÅ«s redzat, ir pazÄ«stami kā fossenes, un nav gaismas stimulu vai sapņu radÄ«tu halucināciju rezultāts. Tie rodas, jo jÅ«su smadzenes uzskata, ka jebkādi elektriskie signāli acs nervos nodod informāciju par gaismu. Smadzenēm ir jāveic Ŕādi pieņēmumi, jo nav iespējams noteikt, vai signāls ir skaņa, redzējums vai kaut kas cits. Visi nervi Ä·ermenÄ« nodod pilnÄ«gi identiskus elektriskos impulsus. Spiežot uz acÄ«m, jÅ«s sÅ«tāt neskaidrus signālus, kas aktivizē acs receptorus, ko jÅ«su smadzenes interpretē – Å”ajā gadÄ«jumā nepareizi – kā kaut ko redzamu. JÅ«s burtiski spējat redzēt spiedienu!

Ir ironiÄ·i domāt par to, cik datori ir lÄ«dzÄ«gi smadzenēm, taču tā ir arÄ« noderÄ«ga analogija, kas ilustrē, cik ļoti datu nozÄ«me – pārvadājamā caur nervu sistēmu vai uzglabāta datorā – atkarÄ«ga no to interpretācijas. Visi binārie dati sastāv no nullēm un viendabÄ«bām, pamatelementiem, kas spēj nodot jebkāda veida informāciju. JÅ«su dators bieži vien uzmin, kā tos interpretēt, izmantojot norādes, piemēram, failu paplaÅ”inājumus. Un tagad mēs liekam tam interpretēt tos kā tekstu, jo tieÅ”i to sagaida teksta redaktors.

Lai saprastu, kā dekodēt JPEG, mums jāredz paÅ”i sākotnējie signāli – binārie dati. To var izdarÄ«t, izmantojot heksadecimālo redaktoru, vai tieÅ”i uz veb-lapas oriÄ£ināla raksta! Tur ir attēls, blakus kuram tekstlaukā ir visi tā baļķi (izņemot virsrakstu), kas attēloti desmitiŔķā formā. JÅ«s varat tos mainÄ«t, un skripts pārkodē un nodroÅ”ina jaunu attēlu ātri.

Kā darbojas JPEG formāts

Var daudz ko uzzināt, vienkārÅ”i spēlējoties ar Å”o redaktoru. Piemēram, vai varat pateikt, kādā secÄ«bā tiek uzglabāti pikseļi?

Šajā piemērā dīvainā lieta ir tā, ka dažu numuru maiņa vispār neietekmē attēlu, bet, piemēram, ja pirmājā rindā nomaināt numuru 17 uz 0, attēls pilnībā sabojās!

Kā darbojas JPEG formāts

Citi mainÄ«jumi, piemēram, 7 maiņa 1988. rindā uz numuru 254 maina krāsu, bet tikai sekojoÅ”iem pikseļiem.

Kā darbojas JPEG formāts

Iespējams, dÄ«vainākais ir tas, ka daži numuri maina ne tikai krāsu, bet arÄ« attēla formu. Nomainiet 70 12. rindā uz 2 un skatieties augŔējo rindu attēlā, lai redzētu, ko domāju.

Kā darbojas JPEG formāts

Un neatkarÄ«gi no tā, kuru JPEG attēlu izmantojat, jÅ«s vienmēr atradÄ«siet Ŕīs noslēpumainās Å”aha secÄ«bas, rediģējot baitus.

Spēlējoties ar redaktoru, grÅ«ti saprast, kā attēls tiek atjaunots no Å”iem baitiem, jo JPEG saspieÅ”anas process sastāv no trim dažādām tehnoloÄ£ijām, kas tiek piemērotas secÄ«gi pa lÄ«meņiem. Mēs katru no tām pētot atseviŔķi, lai atklātu novēroto noslēpumaino uzvedÄ«bu.

TrÄ«s JPEG saspieÅ”anas lÄ«meņi:

  1. Krāsu subsample.
  2. Diskrētā kosīna transformācija un discretizācija.
  3. Garuma kodēŔana, delta un Hafmana

Lai jÅ«s varētu iztēloties saspieÅ”anas apmērus, lÅ«dzu, ņemiet vērā, ka iepriekÅ” minētā attēlā ir 79 819 skaitļu, tas ir, aptuveni 79 kB. Ja mēs to saglabātu nesaspiestā veidā, katram pikselim bÅ«tu nepiecieÅ”ami trÄ«s skaitļi – sarkanajai, zaļajai un zilajai komponentei. Tas bÅ«tu 917 700 skaitļu, jeb apmēram 917 kB. JPEG saspieÅ”anas rezultātā gala fails ir samazinājies vairāk nekā 10 reizes!

PatiesÄ«bā Å”o attēlu var saspiest daudz spēcÄ«gāk. Zemāk ir divi attēli blakus – attēls pa labi ir saspiests lÄ«dz 16 kB, tas ir 57 reizes mazāk nekā nesaspiestā versija!

Kā darbojas JPEG formāts

Ja paskatāties tuvāk, bÅ«s redzams, ka Å”ie attēli nav identiski. Abi ir JPEG saspieÅ”anas attēli, tomēr labā ir daudz mazāka izmērā. Tā arÄ« izskatās nedaudz sliktāk (paskatieties uz fona krāsu kvadrātiem). Tādēļ JPEG dēvē arÄ« par saspieÅ”anu ar zaudējumiem; saspieÅ”anas procesā attēls mainās un zaudē dažas detaļas.

1. Krāsu subdiskrēcija

Å eit ir attēls, kurā tiek izmantots tikai pirmais saspieÅ”anas lÄ«menis.

Kā darbojas JPEG formāts
(InteraktÄ«vā versija – oriÄ£inālā rakstā). Viena skaitļa izdzēŔana sagrauj visus krāsas. Tomēr, ja izdzēsÄ«s tieÅ”i seÅ”as skaitļus, tas praktiski neietekmē attēlu. Tagad skaitļus ir nedaudz vieglāk atÅ”ifrēt. Tas ir gandrÄ«z vienkārÅ”s krāsu saraksts, kur katrs baits maina tieÅ”i vienu pikseli, bet tas jau ir divas reizes mazāks nekā nesaspiestais attēls (kurÅ” ieņemtu apmēram 300 kB Ŕādā samazinātā izmērā). Vai varat uzminēt, kāpēc?

Ir redzams, ka Å”ie skaitļi nenozÄ«mē standartkrāsu sarkano, zaļo un zilo komponentes, jo, ja nomainÄ«tu visus skaitļus uz nullēm, mēs iegÅ«tu zaļu attēlu (nevis baltu).

Tas ir tāpēc, ka Å”ie baitīŔi apzÄ«mē Y (spÄ«dumu),

Kā darbojas JPEG formāts

Cb (proporcionālo zilgnumu),

Kā darbojas JPEG formāts

un Cr (proporcionālo sarkanumu) attēlā.

Kā darbojas JPEG formāts

Kāpēc nelietot RGB? Galu galā tieÅ”i tā darbojas lielākā daļa moderno ekrānu. JÅ«su monitors var parādÄ«t jebkuru krāsu, tostarp sarkano, zaļo un zilo krāsu ar atŔķirÄ«gu intensitāti katram pikselim. Balts iegÅ«st, ieslēdzot visus trÄ«s pilnā spožumā, bet melns – tos izslēdzot.

Kā darbojas JPEG formāts

Tas ir arÄ« ļoti lÄ«dzÄ«gi cilvēka acs darbÄ«bai. Krāsu receptori mÅ«su acÄ«s tiek saukti par ā€ž

Kā darbojas JPEG formāts

konusiemspraudņiĀ«, un tiek iedalÄ«ti trijos tipos, no kuriem katrs ir jÅ«tÄ«gāks pret sarkano, zaļo vai zilo krāsu [S tips ir jutÄ«gs violeti-zilajā (S no angļu valodas Short – Ä«sviļņu spektrā), M tips – zaļgani dzeltenajā (M no angļu valodas Medium – vidēji viļņu), un L tips – dzeltenÄ«gi sarkanajā (L no angļu valodas Long – garÅ”viļņu) spektra daļā. Å o trÄ«s veidu konusi (un stieņi, kas ir jutÄ«gi smaragda zaļajā spektrā) klātbÅ«tne nodroÅ”ina cilvēka krāsu redzi. / komentārs pārtulkots]. Stieņi, cits fotor receptoru veids mÅ«su acÄ«s, spēj uztvert izmaiņas spilgtumā, tomēr ir daudz jÅ«tÄ«gāks pret krāsu. MÅ«su acÄ«s ir apmēram 120 miljoni stieņu un tikai 6 miljoni konusi.

Tāpēc mÅ«su acis daudz labāk pamanās izmaiņas spilgtumā, nekā izmaiņas krāsā. Ja atdalām krāsu no spilgtuma, varam nedaudz noņemt krāsu, un neviens to nemanÄ«s. Krāsu subdiskretizācija – tas ir process, kas attēla krāsu komponentus attēlo mazākā izŔķirtspējā salÄ«dzinājumā ar spilgtuma komponentiem. IepriekÅ” minētajā piemērā katram pikselim ir tieÅ”i viena Y komponente, bet katrai atseviŔķai četru pikseļu grupai ir tieÅ”i viena Cb un viena Cr komponente. Tāpēc attēls satur četras reizes mazāk krāsu informācijas, nekā oriÄ£ināls.

Krāsu telpa YCbCr tiek izmantota ne tikai JPEG. Tā tika izstrādāta jau 1938. gadā televÄ«zijai. Ne visiem ir krāsains televizors, tāpēc krāsas un spilgtuma atdalīŔana ļāva visiem saņemt to paÅ”u signālu, bet krāsu trÅ«kumi tikai izmantoja spilgtuma komponentu.

Tāpēc vienas skaitļa dzēŔana redaktorā pilnÄ«bā sagrauj visus krāsas. Komponentes tiek glabātas Y Y Y Y Cb Cr veidā (patiesÄ«bā, tas nav obligāti Ŕādā secÄ«bā – glabāŔanas secÄ«bu nosaka faila galvenē). Pirmajā skaitļa dzēŔana novedÄ«s pie tā, ka pirmais Cb vērtÄ«ba tiks uztverta kā Y, Cr kā Cb, un vispārēju rezultātu iegÅ«st domino efekts, kas maina visas attēla krāsas.

JPEG specifikācija nenosaka, ka jums bÅ«tu jāizmanto YCbCr. Tomēr lielākajā daļā failu tā tiek izmantota, jo tā nodroÅ”ina labāku attēlu kvalitāti pēc subdiskrēcijas salÄ«dzinājumā ar RGB. Bet jums nav jāpārliecinās par to vienkārÅ”i manu vārdu dēļ. Apskatiet paÅ”i tabulā zemāk, kā katra atseviŔķā komponenta subdiskrēcija izskatÄ«sies gan RGB, gan YCbCr.

Kā darbojas JPEG formāts
(InteraktÄ«vā versija – oriÄ£inālā rakstā). Viena skaitļa izdzēŔana sagrauj visus krāsas. Tomēr, ja izdzēsÄ«s tieÅ”i seÅ”as skaitļus, tas praktiski neietekmē attēlu. raksti).

Zils noņemÅ”ana nav tik pamanāma kā sarkana vai zaļa. Tas saistÄ«ts ar to, ka no seÅ”iem miljoniem konusi jÅ«su acÄ«s aptuveni 64% ir jutÄ«gi pret sarkano, 32% pret zaļo un 2% pret zilo.

Y komponentes subdiskrēcija (pa kreisi apakŔā) ir vispamanāmākā. Pat nelielas izmaiņas ir redzamas.

Attēla pārvērÅ”ana no RGB uz YCbCr nesamazina faila lielumu, bet atvieglo mazāk pamanāmu detaļu meklēŔanu, kuras var izdzēst. Zudumu kompresija notiek otrajā posmā. Tās pamatā ir ideja attēlot datus kompresējamākā veidā.

2. Diskrētā kosinusa transformācija un diskrēcija

Å is kompresijas lÄ«menis lielā mērā nosaka JPEG bÅ«tÄ«bu. Pēc krāsu pārvērÅ”anas uz YCbCr komponentes tiek saspiestas atseviŔķi, tāpēc mēs varam koncentrēties tikai uz Y komponenti. Un lÅ«k, kā Y komponentes baitus izskatās pēc Ŕī lÄ«meņa piemēroÅ”anas.

Kā darbojas JPEG formāts
(InteraktÄ«vā versija – oriÄ£inālā rakstā). Viena skaitļa izdzēŔana sagrauj visus krāsas. Tomēr, ja izdzēsÄ«s tieÅ”i seÅ”as skaitļus, tas praktiski neietekmē attēlu. raksti). InteraktÄ«vajā versijā klikŔķis uz pikseļa ritina redaktoru uz rindu, kas to apzÄ«mē. Mēģiniet izdzēst skaitļus galā vai pievienot dažus nulles noteiktam skaitlim.

Pirmajā mirklÄ« Ŕķiet, ka tas ir ļoti slikta kompresija. Attēlā ir 100 000 pikseļu, un, lai apzÄ«mētu to spilgtumu (Y komponentes), ir nepiecieÅ”ami 102 400 skaitļu — tas ir sliktāk nekā nekādā veidā nespiesties!

Tomēr ņemiet vērā, ka lielākā daļa Å”o skaitļu ir vienādi ar nulli. Vairāk nekā tas, visi Å”ie nulli rindas beigās var tikt izdzēsti, nemainot attēlu. Paliek apmēram 26 000 skaitļu, un tas jau ir gandrÄ«z četras reizes mazāk!

Å ajā lÄ«menÄ« ir noslēpums Å”aha rakstos. AtŔķirÄ«bā no citiem efektiem, kurus esam redzējuÅ”i, Å”o rakstu parādīŔanās nav kļūdas. Tie ir visu attēlu bÅ«vblokki. Katru redaktora rindu aizņem tieÅ”i 64 skaitļi, diskrētās kosinusa transformācijas (DCT) koeficienti, kas atbilst 64 unikālu rakstu intensitātēm.

Šie raksti veidojas, pamatojoties uz kosinusa grafiku. Šeit ir daži no tiem:

Kā darbojas JPEG formāts
8 no 64 koeficientiem

Zemāk ir attēls, kas parāda visus 64 rakstus.

Kā darbojas JPEG formāts
(InteraktÄ«vā versija – oriÄ£inālā rakstā). Viena skaitļa izdzēŔana sagrauj visus krāsas. Tomēr, ja izdzēsÄ«s tieÅ”i seÅ”as skaitļus, tas praktiski neietekmē attēlu. raksti).

Å ie raksti ir Ä«paÅ”i svarÄ«gi, jo tie veido 8x8 izmēra attēlu pamatu. Ja neesi pazÄ«stams ar lineāro algebru, tas nozÄ«mē, ka jebkuru 8x8 izmēra attēlu var iegÅ«t no Å”iem 64 rakstiem. DCT ir process, kas sadala attēlus 8x8 blokos un pārveido katru bloku par Å”o 64 koeficientu kombināciju.

Tas, ka jebkuru attēlu var sastādÄ«t no 64 noteiktiem rakstiem, Ŕķiet kā burvÄ«ba. Tomēr tas ir tas pats, kas teikt, ka jebkuru vietu uz Zemes var aprakstÄ«t ar divām skaitļiem – platumu un garumu [norādot puslodes / piezÄ«me tulkotājam]. Mēs bieži uzskatām, ka Zemes virsma ir divdimensionāla, tāpēc mums nepiecieÅ”ami tikai divi skaitļi. Attēls 8x8 ir 64 dimensijas, tāpēc mums nepiecieÅ”ami 64 skaitļi.

Vēl nav skaidrs, kā tas palÄ«dzējis kompresijas ziņā. Ja mums nepiecieÅ”ami 64 skaitļi, lai attēlotu 8x8 attēlu, kāpēc Ŕī metode bÅ«tu labāka par vienkārÅ”u 64 spilgtuma komponentu glabāŔanu? Mēs to darām tāpēc, ka mēs pārveidojām trÄ«s RGB skaitļus par trim YCbCr skaitļiem: tas ļauj mums izņemt nemanāmās detaļas.

GrÅ«ti redzēt, kuras tieÅ”i detaļas tiek izņemtas Å”ajā posmā, jo JPEG pielieto DCT 8x8 blokiem. Tomēr neviens mums neierobežo to pielietot visam attēlam. LÅ«k, kā DCT izskatās Y komponentē, piemērojot to visam attēlam:

Kā darbojas JPEG formāts

No beigām var izņemt vairāk nekā 60 000 skaitļu praktiski bez manām izmaiņām attēlā.

Kā darbojas JPEG formāts

Tomēr ņemiet vērā, ka, ja mēs nullificēsim pirmos piecus skaitļus, atŔķirÄ«ba bÅ«s acÄ«mredzama.

Kā darbojas JPEG formāts

Pirmajā rindā esoÅ”ie skaitļi norāda uz zemas frekvences izmaiņām attēlā, un mÅ«su acis tos uztver vislabāk. Beigu daļā esoÅ”ie skaitļi norāda uz augstas frekvences izmaiņām, kuras ir grÅ«tāk pamanÄ«t. Lai ā€œredzētu to, ko acs neredzā€, mēs varam izolēt Ŕīs augstas frekvences detaļas, nullificējot pirmos 5000 skaitļus.

Kā darbojas JPEG formāts

Mēs redzam visas attēla zonas, kurās notiek vislielākās izmaiņas no pikseļa uz pikseļa. Izceļas kaÄ·a acis, viņa Å«sas, kažokādas sega un ēnas kreisajā apakŔējā stÅ«rÄ«. Varam iet tālāk, nullificējot pirmos 10 000 skaitļus:

Kā darbojas JPEG formāts

20 000:

Kā darbojas JPEG formāts

40 000:

Kā darbojas JPEG formāts

60 000:

Kā darbojas JPEG formāts

Å ie augstas frekvences JPEG elementi tiek noņemti kompresijas posmā. Krāsu pārveidoÅ”ana DCT koeficientos nesniedz zaudējumus. Zaudējumi rodas diskretizācijas posmā, kur tiek dzēsti augstas frekvences vai tuvu nulles vērtÄ«bas. Kad samazināt JPEG saglabāŔanas kvalitāti, programma palielina dzēsto vērtÄ«bu slieksni, kas samazina faila izmēru, bet padara attēlu vairāk pikselizētu. Tāpēc attēls pirmajā sadaļā, kas bija 57 reizes mazāks, izskatÄ«jās tāds. Katrs 8x8 bloks tika attēlots ar daudz mazāk DCT koeficientiem salÄ«dzinājumā ar kvalitatÄ«vāku versiju.

Vai var radÄ«t jauku efektu, piemēram, pakāpenisku attēlu straumēŔanu. Var parādÄ«t izplÅ«duÅ”u attēlu, kas kļūst arvien detalizētāks, lejupielādējot aizvien vairāk koeficientu.

Å eit ir, vienkārÅ”i ziņkārÄ«bas pēc, kas notiks, ja tiks izmantoti tikai 24 000 skaitļu:

Kā darbojas JPEG formāts

Vai arī tikai 5000:

Kā darbojas JPEG formāts

Ļoti izplūdis, bet it kā atpazīstams!

3. Garuma kodēŔana, delta un Hafmana

LÄ«dz Å”im visi sasprindzinājuma posmi bija ar zaudējumiem. Pēdējais posms, gluži pretēji, notiek bez zaudējumiem. Tas nezina informāciju, taču ievērojami samazina faila izmēru.

Kā var saspiest kaut ko, neizmetot informāciju? Iedomājieties, kā mēs aprakstÄ«tu vienkārÅ”u melnu taisnstÅ«ri 700 x 437.

JPEG izmanto Å”im 5000 skaitļu, bet var sasniegt daudz labākus rezultātus. Vai varat iedomāties kodēŔanas shēmu, kas aprakstÄ«tu lÄ«dzÄ«gu attēlu ar pēc iespējas mazāku baitā skaitu?

Minimālā shēma, kuru esmu spējis izdomāt, izmanto četrus: trÄ«s krāsas apzÄ«mēŔanai, un ceturtais – cik pikseļu ir ar tādu krāsu. Ideja par atkārtotu vērtÄ«bu attēloÅ”anu Ŕādā kompresētā veidā tiek dēvēta par garuma kodēŔanu. Tā ir bez zaudējumiem, jo mēs varam atjaunot kodēt datos sākotnējā formā.

JPEG faila izmērs ar melnu taisnstÅ«ri ir daudz lielāks par 4 baitiem – atcerieties, ka DCT lÄ«menÄ« saspieÅ”ana tiek piemērota 8x8 pikseļu blokiem. Tāpēc mums nepiecieÅ”ams vismaz viens DCT koeficients katriem 64 pikseļiem. Vienu mums vajag, jo, nevis glabājot vienu DCT koeficientu, kam seko 63 nulles, garo secÄ«bu kodēŔana ļauj mums uzglabāt vienu skaitli un norādÄ«t, ka ā€žvisi pārējie ir nullesā€.

Delta kodēŔana ir tehnika, kurā katrs baits satur atŔķirÄ«bu no kādas vērtÄ«bas, nevis absolÅ«tu lielumu. Tādējādi noteiktu baitus rediģējot, tiek mainÄ«ts visu citu pikseļu krāsa. Piemēram, nevis glabājot

12 13 14 14 14 13 13 14

Mēs varētu sākt ar 12, bet pēc tam vienkārÅ”i norādÄ«t, cik daudz jāpieadding vai jāatņem, lai iegÅ«tu nākamo skaitli. Un Ŕī secÄ«ba delta kodēŔanā izskatās Ŕādi:

12 1 1 0 0 -1 0 1

Pārveidotie dati nav mazāki par sākotnējiem, bet saspieÅ”ana ir vieglāka. Delta kodēŔanas lietoÅ”ana pirms garo secÄ«bu kodēŔanas var bÅ«t bÅ«tiska palÄ«dzÄ«ba, paliekot pie bezzaudējumu saspieÅ”anas.

Delta kodēŔana ir viena no nedaudzajām tehnikām, kuras tiek pielietotas ārpus 8x8 blokiem. No 64 DCT koeficientiem viens – vienkārÅ”i ir nemainÄ«ga vilnis funkcija (viendabÄ«ga krāsa). Tas pārstāv katra bloka vidējo spilgtumu luminansa komponentiem, vai vidējo zilo komponentu Cb un tā tālāk. Pirmais katra DCT bloka vērtÄ«ba tiek saukta par DC vērtÄ«bu, un katra DC vērtÄ«ba tiek delta kodēta attiecÄ«bā pret iepriekŔējām. Tādējādi pirmā bloka spilgtuma izmaiņas ietekmē visus blokos.

Paliek pēdējā mÄ«kla: kā viena skaitļa maiņa pilnÄ«bā sabojā visu attēlu? LÄ«dz Å”im saspieÅ”anas lÄ«meņiem nebija Ŕādu Ä«paŔību. Atbilde slēpjas JPEG virsrakstā. Pirmie 500 baitus satur metadatus par attēlu – platumu, augstumu un citu informāciju, un, kamēr mēs ar tiem neesam strādājuÅ”i.

Bez virsraksta gandrÄ«z nav iespējams (nu, vai vismaz ļoti grÅ«ti) atÅ”ifrēt JPEG. Tas izskatÄ«tos tā, it kā es mēģinātu aprakstÄ«t jums gleznu, un sāku izdomāt vārdus, lai nodotu savas izjÅ«tas. Apraksts, visticamāk, bÅ«s ļoti saspringts, jo es varu izdomāt vārdus tieÅ”i ar to nozÄ«mi, ko vēlos nodot, taču visiem pārējiem tie nebÅ«s saprotami.

Tas izklausās muļķīgi, bet tieÅ”i tā tas notiek. Katrs JPEG attēls tiek saspiests ar kodiem, kas ir specifiski tieÅ”i tam. Kodu vārdnÄ«ca tiek glabāta virsrakstā. Å Ä« tehnika tiek saukta par 'Hafmana kodu', bet vārdnÄ«ca – par Hafmana tabulu. Virsrakstā tabula ir marķēta ar diviem baitiem – 255 un pēc tam 196. Katram krāsu komponentam var bÅ«t sava tabula.

Izmaiņas tabulās radikāli ietekmēs jebkuru attēlu. Labs piemērs ir nomainīt 1 uz 12 15. rindā.

Kā darbojas JPEG formāts

Tas notiek tāpēc, ka tabulās tiek norādÄ«ts, kā jāizlasa atseviŔķi biti. LÄ«dz Å”im mēs strādājām tikai ar binārajiem skaitļiem desmitnieku formātā. Bet tas slēpj no mums to faktu, ka, ja vēlaties saglabāt skaitli 1 baitā, tam bÅ«s jāizskatās kā 00000001, jo katrā baitā ir precÄ«zi astoņi biti, pat ja no tiem nepiecieÅ”ams tikai viens.

Potenciāli tas ir liels vietas zudums, ja jums ir daudz mazu skaitļu. Hafmana kods ir tehnika, kas ļauj mums mazināt Å”o prasÄ«bu, ka katram skaitlim jāaizņem astoņi biti. Tas nozÄ«mē, ka, ja redzat divus baitus:

234 115

Tad, atkarībā no Hafmana tabulas, tie var būt trīs skaitļi. Lai tos izvilktu, jums vispirms jāsadala tie atseviŔķos bitos:

11101010 01110011

Pēc tam mēs skatāmies tabulā, lai saprastu, kā tos grupēt. Piemēram, tie var bÅ«t pirmie seÅ”i biti (111010), vai 58 desmitnieku sistēmā, kam seko pieci biti (10011), vai 19, un visbeidzot pēdējie četri biti (0011), vai 3.

Tāpēc Å”ajā kompresijas posmā ir ļoti sarežģīti saprast baitus. Baiti nepārstāv to, kas Ŕķiet. Es neievadīŔu tabulas darbÄ«bas detaļās Å”ajā rakstā, bet materiāli par Å”o jautājumu tÄ«meklÄ« pietiekami.

Viens no interesantajiem trikiem, kuru varat izdarÄ«t, zinot to – atdalÄ«t JPEG virsrakstu un glabāt to atseviŔķi. PatiesÄ«bā tas nozÄ«mē, ka failu varēsiet izlasÄ«t tikai jÅ«s. Facebook to dara, lai vēl vairāk samazinātu failus.

Ko vēl var izdarÄ«t – nedaudz mainÄ«t Hafmana tabulu. Citiem tas izskatÄ«sies kā sabojāts attēls. Un tikai jÅ«s zināsiet burvju variantu tās labojumam.

Kopsavilkumā: kas tad nepiecieÅ”ams JPEG dekodēŔanai? NepiecieÅ”ams:

  1. Izvilkt Hafmana tabulu (tabulas) no virsraksta un dekodēt bitus.
  2. IegÅ«t diskrečā kosinusa transformācijas koeficientus katrai krāsas un spilgtuma komponentēm katram 8x8 blokam, veicot atpakaļsvērÅ”anas garo secÄ«bu un delta kodēŔanu.
  3. Apvienot kosinusus, pamatojoties uz koeficientiem, lai iegūtu pikseļu vērtības katram 8x8 blokam.
  4. MērÄ«t krāsu komponentus, ja tika veikta apakÅ”diskretizācija (Ŕī informācija ir galvenē).
  5. Pārvērst iegūtās YCbCr vērtības katram pikselim RGB.
  6. Parādīt attēlu ekrānā!

Liela apjoma darbs vienkārÅ”ai kaÄ·u attēla apskatei! Tomēr, kas man tajā patÄ«k - ir redzams, cik tehnoloÄ£ija JPEG ir cilvēkam centrēta. Tā balstās uz mÅ«su uztveres Ä«paŔībām, ļaujot sasniegt ievērojami labāku saspieÅ”anu nekā parastās tehnoloÄ£ijas. Un tagad, saprotot, kā darbojas JPEG, varam iedomāties, kā Ŕīs tehnoloÄ£ijas varētu tikt piemērotas citās jomās. Piemēram, delta kodēŔana video varētu sniegt ievērojamu faila lieluma samazinājumu, jo bieži ir veselas zonas, kas nemainās no kadra uz kadru (piemēram, fons).

Kods, kas izmantots rakstā, ir pieejams un satur norādījumus, kā nomainīt attēlus uz savējiem.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster