JPEG. Compressie-algoritme

Hallo opnieuw! Ik vond dit artikel, geschreven in mei 2019. Dit is een vervolg op de serie artikelen over WAVE en JPEG. eersteDeze publicatie zal informatie bevatten over het afbeeldingscoderingsalgoritme en het formaat zelf.

Een snufje geschiedenis

Een lepel artikel uit Wikipedia:

JPEG (Joint Photographic Experts Group) is een van de populaire rasterafbeeldingsformaten dat wordt gebruikt voor het opslaan van foto's en soortgelijke afbeeldingen.

Deze standaard werd ontwikkeld door een samenwerkingsgroep van fotografie-experts in 1991 voor efficiƫnte beeldcompressie.

Welke weg afgebeeldingen afleggen van rauwe staat naar JPEG

Sommigen geloven dat JPEG-afbeeldingen gecomprimeerde ruwe gegevens zijn met behulp van Huffman-compressie, maar dat is niet waar. Voordat de controlecompressie plaatsvindt, doorlopen de gegevens een lange weg.

Eerst verandert men het kleurenmodel van RGB naar YCbCr. Er is zelfs een speciaal algoritme voor: hierY blijft ongemoeid, omdat dit verantwoordelijk is voor de helderheid, en een wijziging ervan zal merkbaar zijn.

Het eerste wat met een afbeelding gebeurt, is "onderverdeling" (subsampling). Dit is eenvoudig te begrijpen: een 2x2 matrix van pixels wordt genomen, vervolgens worden de Cb en Cr — de gemiddelde waarden van elk van de YCbCr-componenten van deze 4 pixels. En zo, hebben we 6 byte gewonnen, in plaats van 4 Y, 4 Cb, 4 Cr hebben we 4 Y en identieke Cb en Cr voor elk (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Zelfs bij een 2Ɨ2-compressie met een compressieverhouding van 2:1 klinkt dat solide. Dit wordt op de hele afbeelding toegepast. En zo — hebben we de helft van de grootte weggegooid. Een dergelijke aanpak kunnen we gebruiken dankzij onze kleurperceptie. Mensen merken gemakkelijk een verschil in helderheid op, maar niet in kleur, als deze gemiddeld is in een kleine groep pixels. Ook kan onderverdeling lijngewijs gebeuren, 4 pixels horizontaal en verticaal. De eerste optie wordt vaker gebruikt. Als de beeldkwaliteit belangrijk is, wordt er helemaal geen onderverdeling uitgevoerd.
Een duidelijke illustratie van onderverdeling (Habr liet niet toe om een gif in te voegen) — https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Het belangrijkste deel van de voorbereiding

DCT

Nu komt het moeilijkste en noodzakelijke deel. Het hele beeld wordt verdeeld in blokken van 8Ɨ8 (er wordt opgevuld als de resolutie niet deelbaar is door de zijde van het blok).

Nu wordt er een DCT (Discrete Cosine Transform) op elk blok toegepast.In dit gedeelte wordt alles overbodige uit de afbeelding gehaald. Met behulp van DCT moet worden begrepen of dit blok (8Ɨ8) een monotone afbeelding beschrijft: lucht, muren; of dat het een complexe structuur bevat (haar, symbolen, enz.). Logisch gezien kunnen 64 pixels die op kleur lijken, door slechts 1 worden beschreven, aangezien de grootte van het blok al bekend is. Dit is compressie: 64 naar 1.

DCT transformeert het blok naar een spectrum, en daar waar de waarden abrupt veranderen, wordt de coƫfficiƫnt positief, en hoe steiler de overgang, des te hoger de output zal zijn. Daar waar de coƫfficiƫnt hoger is, worden in de afbeelding scherpe kleur- en helderheidsovergangen afgebeeld, terwijl daar waar deze lager is, de veranderingen van de componenten YCbCr in het blok zwakker (vloeiender) zijn.

Quantisatie

Hier worden compressie-instellingen toegepast. Elke coĆ«fficiĆ«nt in elke 8Ɨ8-matrix wordt gedeeld door een bepaald getal. Als de kwaliteit van de afbeelding na al zijn modificaties niet verder verminderd moet worden, moet de deler gelijk aan ƩƩn zijn. Als de ruimte die deze foto in beslag neemt belangrijker is, dan zal de deler groter dan 1 zijn, en het quotiĆ«nt wordt afgerond. Zo komt het voor dat er na afronding vaak veel nullen ontstaan.

Quantisatie wordt gedaan om de mogelijkheid voor nog grotere compressie te creƫren. Zo ziet het eruit in het voorbeeld van de quantisatie van de grafiek y = sin(x):

JPEG. Compressie-algoritme

Compressie

Eerst gaan we zigzaggend door de matrix:

JPEG. Compressie-algoritme

Hierdoor krijgen we een eendimensionale array met getallen. We zien dat er veel nullen in staan, die kunnen we verwijderen. In plaats van een reeks van veel nullen schrijven we 1 nul en daarna een getal dat het aantal in de reeks aangeeft. Op deze manier kan de totale grootte van de array tot 1/3 worden teruggebracht. En daarna wordt deze array gewoon gecomprimeerd met de Huffman-methode en wordt deze in het bestand geschreven.

Waar het wordt gebruikt

Overal. Net als PNG wordt JPEG gebruikt in camera's, besturingssystemen (als bedrijfslogo's, app-iconen, thumbnails) en in alle mogelijke gebieden waar afbeeldingen efficiƫnt moeten worden opgeslagen.

Uitslag

Op dit moment zijn kennis over JPEG alleen nog waardevol voor educatieve doeleinden, aangezien het overal is ingebouwd en geoptimaliseerd door grote groepen mensen, maar de graniet van de wetenschap blijft toch verleidelijk.

Bronnen

Artikel over YCbCr op Wikipedia
Artikel over JPEG op Wikipedia
Een beetje over DCT uit een post op Pikabu
Artikel over DCT op Wikipedia

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster