JPEG. Kompressionsalgoritme

Hej igen! Jeg fandt denne artikel skrevet tilbage i maj 2019. Dette er en fortsættelse af en serie artikler om WAVE og JPEG, her først. Denne publikation vil indeholde oplysninger om billedkodningsalgoritmen og selve formatet som helhed.

En knivspids historie

En spiseskefuld Wikipedia-artikel:

JPEG (Joint Photographic Experts Group) er et af de populære rastergrafikformater, der bruges til lagring af fotografier og lignende billeder.

Denne standard blev udviklet af Joint Photographic Experts Group tilbage i 1991 til effektiv billedkomprimering.

Hvordan går billeder fra rå til JPEG?

Nogle mennesker tror, ​​at JPEG-billeder er rådata, der er komprimeret ved hjælp af Huffman-metoden, men det er ikke sandt. Før kontrolkomprimering rejser data langt.

Først ændres farvemodellen fra RGB til YCbCr. Der er endda en speciel algoritme til dette - her. Y røres ikke, da den er ansvarlig for lysstyrken, og dens ændring vil være mærkbar.

Den første ting at gøre med billedet er "udtynding" (delprøveudtagning). Det er let at forstå: et 2x2-array af pixels tages, derefter tages Cb og Cr - gennemsnitsværdierne for hver af YCbCr-komponenterne af disse 4 pixels. Så, vi vandt 6 bytes, i stedet for 4 Y, 4 Cb, 4 Cr fik vi 4 Y og samme Cb og Cr for hver af dem (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Ved selv 2x2 skala lyder tabsgivende komprimering med et 2:1 kompressionsforhold solidt. Dette gælder for hele billedet. Og så - de faldt en halv størrelse. Og vi kan bruge denne teknik takket være vores farveopfattelse. En person vil let bemærke en forskel i lysstyrken, men ikke i farven, hvis gennemsnittet beregnes over en lille blok af pixels. Udtynding kan også udføres i en linje, 4 pixels vandret og lodret. Den første mulighed bruges oftere. Hvis billedkvaliteten er vigtig, udføres decimeringen slet ikke.
En visuel illustration af udtynding (Habr tillod mig ikke at indsætte en gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Hoveddelen af ​​forberedelsen

Forbered

Nu kommer den sværeste og mest nødvendige del. Hele billedet er opdelt i 8x8 blokke (udfyldning bruges, hvis opløsningen ikke er et multiplum af bloksiden).

Anvend nu til hver blok DCT (Diskret Cosinus Transform). I denne del er alt unødvendigt taget ud af billedet. Ved hjælp af DCT skal du forstå, om en given blok (8×8) beskriver en monoton del af billedet: himlen, væggen; eller det indeholder kompleks struktur (hår, symboler osv.). Det er logisk, at 64 pixels af lignende farve kan beskrives med kun 1, fordi blokstørrelsen er allerede kendt. Så meget for kompressionen: 64 til 1.

DCT gør blokken til et spektrum, og hvor aflæsningerne ændrer sig kraftigt, bliver koefficienten positiv, og jo skarpere overgangen er, jo højere bliver outputtet. Hvor koefficienten er højere, viser billedet klare overgange i farve og lysstyrke, hvor den er lavere - svage (glatte) ændringer i værdierne af YCbCr-komponenterne i blokken.

Kvantisering

Kompressionsindstillinger er allerede anvendt her. Hver af koefficienterne i hver af 8x8-matricerne er divideret med et bestemt tal. Hvis du ikke vil reducere billedkvaliteten efter alle dens ændringer, skal divisoren være én. Hvis hukommelsen optaget af dette billede er vigtigere for dig, vil divisoren være større end 1, og kvotienten vil blive afrundet. Det viser sig, at man efter afrunding ofte ender med mange nuller.

Kvantisering sker for at skabe mulighed for endnu større kompression. Sådan ser det ud ved at bruge eksemplet med kvantisering af grafen y = sin(x):

JPEG. Kompressionsalgoritme

kompression

Først gennemgår vi matrixen i et zig-zag mønster:

JPEG. Kompressionsalgoritme

Vi får et endimensionelt array med tal. Vi ser, at der er mange nuller i det, de kan fjernes. For at gøre dette, i stedet for en sekvens med mange nuller, indtaster vi 1 nul og efter det et tal, der angiver deres nummer i sekvensen. På denne måde kan du nulstille til 1/3 størrelsen af ​​hele arrayet. Og så komprimerer vi simpelthen dette array ved hjælp af Huffman-metoden og skriver det ind i selve filen.

Hvor skal man bruge

Overalt. Ligesom PNG bruges JPEG i kameraer, OS'er (som firmalogoer, applikationsikoner, thumbnails) og i alle mulige områder, hvor billeder skal opbevares effektivt.

Output

I øjeblikket er viden om JPEG nu kun værdifuld til uddannelsesformål, fordi den allerede er indbygget overalt og optimeret af store grupper af mennesker, men videnskabens granit er stadig velsmagende.

kilder

Artikel om YCbCr på Wikipedia
Wikipedia-artikel om JPEG
Lidt om PrEP fra Pikabu-indlægget
Wikipedia-artikel om PrEP

Kilde: www.habr.com

Tilføj en kommentar