JPEG. Konpresioaren algoritmoa

Kaixo berriro! 2019ko maiatzean idatzitako artikulu hau aurkitu nuen. WAVE eta JPEG-i buruzko artikulu sorta baten jarraipena da, hemen lehenengo. Argitalpen honek irudiak kodetzeko algoritmoari eta formatuari berari buruzko informazioa jasoko du.

Historia pixka bat

Wikipediako artikulu koilarakada bat:

JPEG (Joint Photographic Experts Group) argazkiak eta antzeko irudiak gordetzeko erabiltzen den raster grafiko formatu ezagunetako bat da.

Estandar hau Joint Photographic Experts Group-ek garatu zuen 1991n irudien konpresio eraginkorra izateko.

Nola pasatzen dira irudiak gordinetik JPEGra?

Batzuek uste dute JPEG irudiak Huffman metodoa erabiliz konprimitutako datu gordinak direla, baina hori ez da egia. Kontrol-konpresioaren aurretik, datuek bide luzea egiten dute.

Lehenik eta behin, kolore-eredua RGBtik YCbCr-era aldatzen da. Algoritmo berezi bat ere badago horretarako - Hemen. Y ez da ukitzen, distiraren arduraduna baita, eta haren aldaketa nabaria izango da.

Irudiarekin egin beharreko lehenengo gauza da "argaltzea" (azpilaginketa). Ulertzea erraza da: 2x2 pixel multzo bat hartzen da, ondoren Cb eta Cr hartzen dira - 4 pixel horien YCbCr osagai bakoitzaren batez besteko balioak. Beraz, 6 byte irabazi genituen, 4 Y, 4 Cb, 4 Crren ordez 4 Y eta Cb eta Cr berdinak lortu ditugu horietako bakoitzarentzat (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Nahiz eta 2x2 eskalatan, 2:1 konpresio erlazioa duen konpresio galerak sendoa dirudi. Hau irudi osoan aplikatzen da. Eta horrela - tamaina erdia jaitsi zuten. Eta teknika hau gure kolore-pertzepzioari esker erabil dezakegu. Pertsona batek erraz nabarituko du distira-aldea, baina ez kolorea, pixel bloke txiki batean batez bestekoa bada. Mehetzea ere lerro batean egin daiteke, 4 pixel horizontalean eta bertikalean. Lehen aukera maizago erabiltzen da. Irudiaren kalitatea garrantzitsua bada, ez da dezimaketa batere egiten.
Argaltzearen irudi bisual bat (Habrek ez zidan gif bat sartzen utzi) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Prestaketaren zati nagusia

PrEP

Orain zailena eta beharrezkoena dator. Irudi osoa 8x8 blokeetan banatuta dago (betetzea erabiltzen da bereizmena blokearen aldearen multiploa ez bada).

Orain aplikatu bloke bakoitzari DCT (kosinu-eraldaketa diskretua). Zati honetan, beharrezkoa ez den guztia argazkitik ateratzen da. DCT erabiliz, bloke jakin batek (8Γ—8) irudiaren zati monotonorik deskribatzen duen ulertu behar duzu: zerua, horma; edo egitura konplexua dauka (ilea, ikurrak, etab.). Logikoa da antzeko koloreko 64 pixel bakarrarekin deskribatzea, zeren blokearen tamaina dagoeneko ezagutzen da. Hainbeste konpresioari dagokionez: 1 eta 64.

DCT-k blokea espektro bihurtzen du, eta irakurketak nabarmen aldatzen diren lekuetan, koefizientea positibo bihurtzen da, eta trantsizioa zenbat eta zorrotzagoa izan, orduan eta irteera handiagoa izango da. Koefizientea handiagoa denean, irudiak kolore eta distira trantsizio argiak erakusten ditu, non txikiagoa den - blokeko YCbCr osagaien balioen aldaketa ahulak (leunak).

Kuantizazioa

Konpresioaren ezarpenak dagoeneko aplikatuta daude hemen. 8x8 matrize bakoitzeko koefiziente bakoitza zenbaki jakin batekin zatitzen da. Aldaketa guztien ondoren irudiaren kalitatea murrizten ez baduzu, zatitzaileak bat izan behar du. Argazki honek hartzen duen memoria garrantzitsuagoa bada zuretzat, zatitzailea 1 baino handiagoa izango da eta zatidura biribildu egingo da. Ematen du biribildu ondoren askotan zero askorekin amaitzen duzula.

Kuantizazioa are konpresio handiagoa izateko aukera sortzeko egiten da. Hona hemen y = sin(x) grafikoaren kuantifikazioaren adibidea erabiliz:

JPEG. Konpresioaren algoritmoa

Konpresioa

Lehenik eta behin matrizea zeharkatuko dugu sigi-saga ereduan:

JPEG. Konpresioaren algoritmoa

Zenbakiekin dimentsio bakarreko array bat lortzen dugu. Zero asko daudela ikusten dugu, kendu daitezkeela. Horretarako, zero askoren segidaren ordez, zero 1 sartuko dugu eta horren ondoren segidan haien zenbakia adierazten duen zenbaki bat. Horrela, array osoaren tamainaren 1/3ra berrezarri dezakezu. Eta gero, array hau Huffman metodoa erabiliz konprimitu eta fitxategian bertan idatziko dugu.

Non erabiltzen den

Nonahi. PNG bezala, JPEG kameretan, sistema eragileetan (enpresen logotipoetan, aplikazioen ikonoetan, irudi txikietan) eta irudiak modu eraginkorrean gorde behar diren eremu posible guztietan erabiltzen da.

Irteera

Momentuz, JPEG-i buruzko ezagutzak hezkuntza helburuetarako soilik balio du, dagoeneko nonahi eraikita dagoelako eta jende talde handiek optimizatuta dagoelako, baina zientziaren granitoa zaporetsua da oraindik.

iturri

YCbCr-i buruzko artikulua Wikipedian
Wikipediako artikulua JPEG-ri buruz
Pikabu-ko PrEP-ri buruz apur bat
Wikipediako PrEP-ri buruzko artikulua

Iturria: www.habr.com

Gehitu iruzkin berria