JPEG. Komprimeringsalgoritm

Hej igen! Jag hittade den hÀr artikeln som skrevs i maj 2019. Detta Àr en fortsÀttning pÄ serien av artiklar om WAVE och JPEG, hÀr första. Detta inlÀgg kommer att innehÄlla information om bildkodningsalgoritmen och formatet i stort.

Ett litet stycke historia

En matsked frÄn Wikipedia:

JPEG (Joint Photographic Experts Group) Àr ett av de populÀra rastergrafikformaten som anvÀnds för att lagra fotografier och liknande bilder.

Denna standard utvecklades av den gemensamma expergruppen för fotografi redan 1991 för effektiv komprimering av bilder.

Vilken vÀg gÄr bilderna frÄn rÄformat till JPEG?

Vissa anser att JPEG-bilder Àr rÄdata som Àr komprimerade med Huffman-metoden, men sÄ Àr det inte. Innan kontrollkomprimeringen passerar data en lÄng vÀg.

Först Ă€ndras fĂ€rgmodellen frĂ„n RGB till YCbCr. Det finns till och med en speciell algoritm för detta — hĂ€r. Y rörs inte, eftersom den ansvarar för ljusstyrka och dess förĂ€ndring skulle vara mĂ€rkbar.

Det första som görs med bilden Ă€r att «pröva» (subsampling). Det Ă€r enkelt att förstĂ„: en 2x2 pixelmatris tas, och Cb och Cr — medelvĂ€rdena av var och en av YCbCr-komponenterna för dessa 4 pixlar tas. SĂ„, har vi vunnit 6 byte, istĂ€llet för 4 Y, 4 Cb, 4 Cr fick vi 4 Y och samma Cb och Cr för var och en av dem (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). I skala 2x2 lĂ„ter en förlustkomprimering med en komprimeringsfaktor pĂ„ 2:1 solid. Detta tillĂ€mpas pĂ„ hela bilden. SĂ„ vi har minskat storleken med hĂ€lften. En sĂ„dan metod kan vi anvĂ€nda tack vare vĂ„rt fĂ€rguppfattande. En mĂ€nniska mĂ€rker lĂ€tt skillnaden i ljusstyrka, men inte i fĂ€rg, om den Ă€r genomsnittlig i en liten pixelblock. Samt prövning kan ocksĂ„ göras radvis, 4 pixlar horisontellt och vertikalt. Den första varianten anvĂ€nds oftare. Om kvaliteten pĂ„ bilden Ă€r viktig, sĂ„ utförs inte prövning i överhuvudtaget.
En visuell illustration av prövningen (Habr tillĂ€t inte att jag infogade en gif) — https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Den största delen av förberedelsen

DCT

Nu Àr den mest komplexa och nödvÀndiga delen. Hela bilden delas in i block av 8x8 (fyllning anvÀnds om upplösningen inte Àr ett heltal av blockets sida).

Nu tillĂ€mpas DCT (diskret cosinustransformation) pĂ„ varje block.. I den hĂ€r delen tas allt överflödigt frĂ„n bilden bort. Genom att anvĂ€nda DCT mĂ„ste man förstĂ„ om den hĂ€r blocken (8×8) beskriver nĂ„gon monoton del av bilden: himlen, vĂ€ggen; eller om den innehĂ„ller en komplex struktur (hĂ„r, symboler osv.). Det Ă€r logiskt att 64 pixel som Ă€r lika i fĂ€rg kan beskrivas med endast 1, eftersom blockets storlek redan Ă€r kĂ€nd. HĂ€r har ni kompression: 64 till 1.

DCT omvandlar blocket till ett spektrum, och dĂ€r vĂ€rdena plötsligt förĂ€ndras blir koefficienten positiv, och ju skarpare övergĂ„ngen Ă€r, desto högre blir resultatet. DĂ€r koefficienten Ă€r högre finns det tydliga övergĂ„ngar i fĂ€rg och ljusstyrka avbildade, dĂ€r den Ă€r lĂ€gre — svaga (mjuka) förĂ€ndringar i vĂ€rdena av YCbCr-komponenterna i blocket.

Kvantisering

HĂ€r tillĂ€mpas redan komprimeringsinstĂ€llningarna. Varje koefficient i varje 8×8-matris delas med ett visst tal. Om kvaliteten pĂ„ bilden efter alla dess modifieringar inte ska minskas mer, bör delaren vara 1. Om minnet som denna bild tar upp Ă€r viktigare för dig, kommer delaren att vara större Ă€n 1, och kvoten avrundas. SĂ„, efter avrundningen, fĂ„r man ofta mĂ„nga nollor.

Kvantisering görs för att möjliggöra Ànnu större kompression. SÄ hÀr ser det ut med ett exempel pÄ kvantisering av grafen y = sin(x):

JPEG. Komprimeringsalgoritm

Kompression

Först gÄr vi igenom matrisen i en zig-zag:

JPEG. Komprimeringsalgoritm

Vi fÄr en endimensionell array med siffror. Vi ser att det finns mÄnga nollor i den, de kan tas bort. För detta skriver vi istÀllet en nolla följt av ett nummer som anger deras antal i sekvensen. PÄ sÄ sÀtt kan vi minska storleken pÄ hela arrayen till 1/3. Och sedan komprimeras denna array med hjÀlp av Huffman-metoden och skrivs in i sjÀlva filen.

DÀr det anvÀnds

Överallt. Precis som PNG anvĂ€nds JPEG i kameror, operativsystem (som företagslogotyper, appikoner, miniatyrer) och i alla möjliga omrĂ„den dĂ€r man behöver lagra bilder effektivt.

Utdata

För nÀrvarande Àr kunskapen om JPEG bara vÀrdefull i utbildningssyfte, eftersom den redan Àr inbyggd överallt och optimerad av stora grupper mÀnniskor, men kunskapens granit Àr ÀndÄ vÀlsmakande.

KĂ€llor

Artikel om YCbCr pÄ Wikipedia
Artikel om JPEG pÄ Wikipedia
Lite om DCT frÄn ett inlÀgg pÄ Pikabu
Artikel om DCT pÄ Wikipedia

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster