JPEG. Kompressionsalgoritm

Hej igen! Jag hittade den här artikeln skriven i maj 2019. Detta är en fortsättning på en serie artiklar om WAVE och JPEG, här först. Denna publikation kommer att innehålla information om bildkodningsalgoritmen och själva formatet som helhet.

En nypa historia

En matsked Wikipedia-artikel:

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 Joint Photographic Experts Group redan 1991 för effektiv bildkomprimering.

Hur går bilder från rå till JPEG?

Vissa människor tror att JPEG-bilder är rådata komprimerade med Huffman-metoden, men det är inte sant. Innan kontrollkomprimering färdas data långt.

Först ändras färgmodellen från RGB till YCbCr. Det finns till och med en speciell algoritm för detta - här. Y berörs inte, eftersom den är ansvarig för ljusstyrkan, och dess förändring kommer att märkas.

Det första att göra med bilden är "gallring" (delprovtagning). Det är lätt att förstå: en 2x2-array av pixlar tas, sedan tas Cb och Cr - medelvärdena för var och en av YCbCr-komponenterna i dessa 4 pixlar. Så, vi vann 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 jämn skala 2x2 låter förlustbringande komprimering med ett 2:1 kompressionsförhållande stabilt. Detta gäller hela bilden. Och så - de tappade en halv storlek. Och vi kan använda denna teknik tack vare vår färguppfattning. En person kommer lätt att märka en skillnad i ljusstyrka, men inte i färg, om den beräknas i medeltal över ett litet block av pixlar. Gallring kan också göras i en linje, 4 pixlar horisontellt och vertikalt. Det första alternativet används oftare. Om bildkvaliteten är viktig utförs inte decimering alls.
En visuell illustration av gallring (Habr tillät mig inte att infoga en gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Huvuddelen av förberedelsen

PrEP

Nu kommer den svåraste och mest nödvändiga delen. Hela bilden är uppdelad i 8x8 block (fyllning används om upplösningen inte är en multipel av blocksidan).

Applicera nu på varje block DCT (Discrete Cosine Transform). I denna del tas allt onödigt ur bilden. Med hjälp av DCT måste du förstå om ett givet block (8×8) beskriver någon monoton del av bilden: himlen, väggen; eller den innehåller komplex struktur (hår, symboler, etc.). Det är logiskt att 64 pixlar av liknande färg kan beskrivas med bara 1, eftersom blockstorleken är redan känd. Så mycket för kompressionen: 64 till 1.

DCT förvandlar blocket till ett spektrum, och där avläsningarna ändras kraftigt blir koefficienten positiv, och ju skarpare övergången är, desto högre blir uteffekten. Där koefficienten är högre visar bilden tydliga övergångar i färg och ljusstyrka, där den är lägre - svaga (släta) förändringar i värdena för YCbCr-komponenterna i blocket.

Kvantisering

Komprimeringsinställningarna tillämpas redan här. Var och en av koefficienterna i var och en av 8x8-matriserna delas med ett visst tal. Om du inte kommer att minska bildkvaliteten efter alla dess modifieringar, bör divisorn vara en. Om minnet som upptas av detta foto är viktigare för dig, kommer divisorn att vara större än 1, och kvoten kommer att avrundas. Det visar sig att man efter avrundning ofta hamnar på många nollor.

Kvantisering görs för att skapa möjlighet till ännu större komprimering. Så här ser det ut med exemplet på att kvantisera grafen y = sin(x):

JPEG. Kompressionsalgoritm

kompression

Först går vi igenom matrisen i ett sicksackmönster:

JPEG. Kompressionsalgoritm

Vi får en endimensionell array med siffror. Vi ser att det är många nollor i den, de kan tas bort. För att göra detta, istället för en sekvens med många nollor, anger vi 1 noll och efter den ett nummer som anger deras nummer i sekvensen. På så sätt kan du återställa till 1/3 av storleken på hela arrayen. Och sedan komprimerar vi helt enkelt den här arrayen med Huffman-metoden och skriver in den i själva filen.

Var används

Överallt. Liksom PNG används JPEG i kameror, operativsystem (som företagslogotyper, applikationsikoner, miniatyrbilder) och i alla möjliga områden där bilder behöver lagras effektivt.

Utgång

För närvarande är kunskap om JPEG nu värdefull endast för utbildningsändamål, eftersom den redan är inbyggd överallt och optimerad av stora grupper av människor, men vetenskapens granit är fortfarande välsmakande.

källor

Artikel om YCbCr på Wikipedia
Wikipedia-artikel om JPEG
Lite om PrEP från Pikabu-inlägget
Wikipedia-artikel om PrEP

Källa: will.com

Lägg en kommentar