Hallo opnieuw! Ik vond dit artikel, geschreven in mei 2019. Dit is een vervolg op de serie artikelen over WAVE en JPEG. Deze 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: Y 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) ā
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):

Compressie
Eerst gaan we zigzaggend door de matrix:

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
Bron: habr.com
