JPEG. Komprimeringsalgoritme

Hallo igjen! Jeg fant denne artikkelen skrevet tilbake i mai 2019. Dette er en fortsettelse av en serie artikler om WAVE og JPEG, her første. Denne publikasjonen vil inneholde informasjon om bildekodingsalgoritmen og selve formatet som helhet.

En klype historie

En spiseskje med Wikipedia-artikkel:

JPEG (Joint Photographic Experts Group) er et av de populære rastergrafikkformatene som brukes til å lagre fotografier og lignende bilder.

Denne standarden ble utviklet av Joint Photographic Experts Group tilbake i 1991 for effektiv bildekomprimering.

Hvordan går bilder fra rå til JPEG?

Noen tror at JPEG-bilder er rådata komprimert ved hjelp av Huffman-metoden, men dette er ikke sant. Før kontrollkomprimering reiser data langt.

Først endres fargemodellen fra RGB til YCbCr. Det er til og med en spesiell algoritme for dette - her. Y blir ikke rørt, siden den er ansvarlig for lysstyrken, og endringen vil være merkbar.

Det første du må gjøre med bildet er "tynning" (delprøvetaking). Det er lett å forstå: en 2x2 rekke piksler tas, deretter tas Cb og Cr - gjennomsnittsverdiene for hver av YCbCr-komponentene til disse 4 piksler. Så, vi vant 6 byte, i stedet for 4 Y, 4 Cb, 4 Cr fikk vi 4 Y og samme Cb og Cr for hver av dem (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). På jevn 2x2-skala høres tapskompresjon med et 2:1-kompresjonsforhold solid ut. Dette gjelder hele bildet. Og så - de falt en halv størrelse. Og vi kan bruke denne teknikken takket være vår fargeoppfatning. En person vil lett legge merke til en forskjell i lysstyrke, men ikke i farge, hvis det beregnes gjennomsnitt over en liten blokk med piksler. Tynning kan også gjøres i en linje, 4 piksler horisontalt og vertikalt. Det første alternativet brukes oftere. Hvis bildekvaliteten er viktig, utføres ikke desimering i det hele tatt.
En visuell illustrasjon av tynning (Habr tillot meg ikke å sette inn en gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Hoveddelen av forberedelsen

PrEP

Nå kommer den vanskeligste og mest nødvendige delen. Hele bildet er delt inn i 8x8 blokker (utfylling brukes hvis oppløsningen ikke er et multiplum av blokksiden).

Nå gjelder hver blokk DCT (Discrete Cosinus Transform). I denne delen er alt unødvendig tatt ut av bildet. Ved å bruke DCT må du forstå om en gitt blokk (8×8) beskriver en monoton del av bildet: himmelen, veggen; eller den inneholder kompleks struktur (hår, symboler, etc.). Det er logisk at 64 piksler med lignende farge kan beskrives med bare 1, fordi blokkstørrelsen er allerede kjent. Så mye for kompresjonen: 64 til 1.

DCT gjør blokken til et spektrum, og der avlesningene endres kraftig, blir koeffisienten positiv, og jo skarpere overgangen er, desto høyere blir utgangen. Der koeffisienten er høyere, viser bildet klare overganger i farge og lysstyrke, hvor den er lavere - svake (glatte) endringer i verdiene til YCbCr-komponentene i blokken.

Kvantisering

Komprimeringsinnstillinger er allerede brukt her. Hver av koeffisientene i hver av 8x8-matrisene er delt med et visst tall. Hvis du ikke vil redusere bildekvaliteten etter alle modifikasjonene, bør divisoren være en. Hvis minnet som er opptatt av dette bildet er viktigere for deg, vil divisoren være større enn 1, og kvotienten vil bli avrundet. Det viser seg at etter avrunding ender man ofte opp med mange nuller.

Kvantisering gjøres for å skape mulighet for enda større komprimering. Slik ser det ut ved å bruke eksempelet på kvantisering av grafen y = sin(x):

JPEG. Komprimeringsalgoritme

Kompresjon

Først går vi gjennom matrisen i et sikk-sakk-mønster:

JPEG. Komprimeringsalgoritme

Vi får en endimensjonal matrise med tall. Vi ser at det er mange nuller i den, de kan fjernes. For å gjøre dette, i stedet for en sekvens med mange nuller, legger vi inn 1 null og etter det et tall som indikerer nummeret deres i sekvensen. På denne måten kan du tilbakestille til 1/3 av størrelsen på hele matrisen. Og så komprimerer vi ganske enkelt denne matrisen ved å bruke Huffman-metoden og skriver den inn i selve filen.

Hvor brukt

Overalt. I likhet med PNG brukes JPEG i kameraer, OSer (som firmalogoer, applikasjonsikoner, miniatyrbilder) og i alle mulige områder der bilder må lagres effektivt.

Utgang

For øyeblikket er kunnskap om JPEG nå verdifull kun for pedagogiske formål, fordi den allerede er innebygd overalt og optimert av store grupper mennesker, men vitenskapens granitt er fortsatt velsmakende.

kilder

Artikkel om YCbCr på Wikipedia
Wikipedia-artikkel om JPEG
Litt om PrEP fra Pikabu-innlegget
Wikipedia-artikkel om PrEP

Kilde: www.habr.com

Legg til en kommentar