JPEG. Compressie-algoritme

Welkom terug! Ik vond dit artikel geschreven in mei 2019. Dit is een voortzetting van een serie artikelen over WAVE en JPEG, hier eerste. Deze publicatie bevat informatie over het beeldcoderingsalgoritme en het formaat zelf als geheel.

Een snufje geschiedenis

Een eetlepel Wikipedia-artikel:

JPEG (Joint Photographic Experts Group) is een van de populaire rastergrafische formaten die worden gebruikt voor het opslaan van foto's en soortgelijke afbeeldingen.

Deze standaard werd in 1991 ontwikkeld door de Joint Photographic Experts Group voor efficiënte beeldcompressie.

Hoe gaan afbeeldingen van raw naar JPEG?

Sommige mensen denken dat JPEG-afbeeldingen onbewerkte gegevens zijn die zijn gecomprimeerd met behulp van de Huffman-methode, maar dit is niet waar. Vóór controlecompressie reizen gegevens een lange weg.

Eerst wordt het kleurmodel gewijzigd van RGB naar YCbCr. Er is zelfs een speciaal algoritme hiervoor - hier. Y wordt niet aangeraakt, omdat het verantwoordelijk is voor de helderheid en de verandering ervan merkbaar zal zijn.

Het eerste dat u met de afbeelding moet doen, is "uitdunnen" (subbemonstering). Het is gemakkelijk te begrijpen: er wordt een reeks van 2x2 pixels genomen, vervolgens worden Cb en Cr genomen - de gemiddelde waarden van elk van de YCbCr-componenten van deze 4 pixels. Dus, we hebben 6 bytes gewonnen, in plaats van 4 Y, 4 Cb, 4 Cr kregen we 4 Y en dezelfde Cb en Cr voor elk van hen (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Zelfs op een schaal van 2x2 klinkt lossy compressie met een compressieverhouding van 2:1 solide. Dit geldt voor het gehele beeld. En dus zijn ze een halve maat kleiner geworden. En wij kunnen deze techniek gebruiken dankzij onze kleurwaarneming. Een persoon zal gemakkelijk een verschil in helderheid opmerken, maar niet in kleur, als het gemiddelde wordt genomen over een klein blok pixels. Uitdunnen kan ook in een lijn, 4 pixels horizontaal en verticaal. De eerste optie wordt vaker gebruikt. Als beeldkwaliteit belangrijk is, wordt er helemaal niet gedecimeerd.
Een visuele illustratie van het dunner worden (Habr stond me niet toe een gif in te voegen) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Het grootste deel van de voorbereiding

PrEP

Nu komt het moeilijkste en meest noodzakelijke deel. De gehele afbeelding is verdeeld in blokken van 8x8 (opvulling wordt gebruikt als de resolutie geen veelvoud is van de blokzijde).

Pas nu op elk blok toe DCT (Discrete cosinustransformatie). In dit deel wordt al het onnodige uit beeld gehaald. Met behulp van DCT moet je begrijpen of een bepaald blok (8×8) een monotoon deel van het beeld beschrijft: de lucht, de muur; of het bevat een complexe structuur (haar, symbolen, enz.). Het is logisch dat 64 pixels van vergelijkbare kleur kunnen worden beschreven door slechts 1, omdat de blokgrootte is al bekend. Tot zover de compressie: 64 tegen 1.

DCT verandert het blok in een spectrum, en waar de meetwaarden scherp veranderen, wordt de coëfficiënt positief, en hoe scherper de overgang, hoe hoger de output zal zijn. Waar de coëfficiënt hoger is, vertoont de afbeelding duidelijke overgangen in kleur en helderheid, waar deze lager is: zwakke (vloeiende) veranderingen in de waarden van de YCbCr-componenten in het blok.

Kwantisering

Compressie-instellingen worden hier al toegepast. Elk van de coëfficiënten in elk van de 8x8 matrices wordt gedeeld door een bepaald getal. Als u de beeldkwaliteit na alle wijzigingen niet wilt verminderen, moet de deler één zijn. Als het geheugen dat deze foto inneemt belangrijker voor je is, dan is de deler groter dan 1 en wordt het quotiënt afgerond. Het blijkt dat je na afronding vaak op veel nullen uitkomt.

Kwantisering wordt gedaan om de mogelijkheid van een nog grotere compressie te creëren. Hier ziet u hoe het eruit ziet als u het voorbeeld van het kwantiseren van de grafiek y = sin(x) gebruikt:

JPEG. Compressie-algoritme

samendrukking

Eerst gaan we in een zigzagpatroon door de matrix:

JPEG. Compressie-algoritme

We krijgen een eendimensionale array met getallen. We zien dat er veel nullen in zitten, deze kunnen worden verwijderd. Om dit te doen, voeren we in plaats van een reeks van vele nullen 1 nul in en daarna een getal dat hun nummer in de reeks aangeeft. Op deze manier kunt u terugzetten naar 1/3 van de grootte van de gehele array. En dan comprimeren we deze array eenvoudig met behulp van de Huffman-methode en schrijven deze in het bestand zelf.

Waar gebruikt

Overal. Net als PNG wordt JPEG gebruikt in camera's, besturingssystemen (als bedrijfslogo's, applicatiepictogrammen, miniaturen) en op alle mogelijke gebieden waar afbeeldingen efficiënt moeten worden opgeslagen.

Uitgang

Op dit moment is kennis over JPEG nu alleen waardevol voor educatieve doeleinden, omdat het al overal is ingebouwd en door grote groepen mensen is geoptimaliseerd, maar het graniet van de wetenschap is nog steeds smakelijk.

bronnen

Artikel over YCbCr op Wikipedia
Wikipedia-artikel over JPEG
Iets over PrEP uit de Pikabu-post
Wikipedia-artikel over PrEP

Bron: www.habr.com

Voeg een reactie