Hoe het JPEG-formaat werkt

JPEG-afbeeldingen zijn alomtegenwoordig in ons digitale leven, maar achter dit laagje bewustzijn schuilen algoritmen die details verwijderen die niet waarneembaar zijn voor het menselijk oog. Het resultaat is de hoogste visuele kwaliteit in de kleinste bestandsgrootte - maar hoe werkt het allemaal precies? Laten we eens kijken wat onze ogen precies niet zien!

Hoe het JPEG-formaat werkt

Het is gemakkelijk om de mogelijkheid om een ​​foto naar een vriend te sturen als vanzelfsprekend te beschouwen zonder je zorgen te hoeven maken over welk apparaat, browser of besturingssysteem ze gebruiken - maar dat was niet altijd het geval. Begin jaren tachtig konden computers digitale afbeeldingen opslaan en weergeven, maar er waren veel concurrerende ideeën over de beste manier om dit te doen. Je kunt niet zomaar een afbeelding van de ene computer naar de andere sturen en hopen dat het werkt.

Om dit probleem op te lossen werd in 1986 een commissie van deskundigen uit de hele wereld samengesteld onder de naam "Gezamenlijke groep fotografie-experts» (Joint Photographic Experts Group, JPEG), opgericht als een gezamenlijke inspanning van de Internationale Organisatie voor Standaardisatie (ISO) en de Internationale Elektrotechnische Commissie (IEC), twee internationale standaardisatieorganisaties met hoofdkantoor in Genève, Zwitserland.

Een groep mensen genaamd JPEG creëerde in 1992 de JPEG-standaard voor digitale beeldcompressie. Iedereen die internet heeft gebruikt, is waarschijnlijk JPEG-gecodeerde afbeeldingen tegengekomen. Dit is de meest gebruikelijke manier om afbeeldingen te coderen, verzenden en opslaan. Van webpagina's tot e-mail en sociale media: JPEG wordt miljarden keren per dag gebruikt, vrijwel elke keer dat we een afbeelding online bekijken of verzenden. Zonder JPEG zou het web minder kleurrijk en langzamer zijn en waarschijnlijk minder kattenfoto's bevatten!

Dit artikel gaat over het decoderen van een JPEG-afbeelding. Met andere woorden: wat is er nodig om gecomprimeerde gegevens die op een computer zijn opgeslagen, om te zetten in een afbeelding die op het scherm verschijnt. Dit is de moeite waard om te weten, niet alleen omdat het belangrijk is om de technologie te begrijpen die we elke dag gebruiken, maar ook omdat we door compressieniveaus te ontgrendelen meer leren over perceptie en zicht, en voor welke details onze ogen het meest gevoelig zijn.

Bovendien is het op deze manier spelen met beelden erg interessant.

Hoe het JPEG-formaat werkt

Binnen JPEG kijken

Op een computer wordt alles opgeslagen als een reeks binaire getallen. Meestal worden deze bits, nullen en enen, gegroepeerd in groepen van acht om bytes te vormen. Wanneer u een JPEG-afbeelding op een computer opent, moet iets (een browser, een besturingssysteem, iets anders) de bytes decoderen, waardoor de originele afbeelding wordt hersteld als een lijst met kleuren die kunnen worden weergegeven.

Als je dit lief downloadt foto van een kat en open het in een teksteditor, je zult een aantal onsamenhangende karakters zien.

Hoe het JPEG-formaat werkt
Hier gebruik ik Notepad++ om de inhoud van het bestand te onderzoeken, aangezien reguliere teksteditors zoals Notepad op Windows het binaire bestand na het opslaan zullen beschadigen en het niet langer aan het JPEG-formaat zal voldoen.

Het openen van een afbeelding in een tekstverwerker brengt de computer in verwarring, net zoals u uw hersenen in verwarring brengt wanneer u in uw ogen wrijft en kleurvlekken begint te zien!

Deze plekken die je ziet staan ​​bekend als fosfenen, en zijn niet het resultaat van een lichte stimulus of een hallucinatie die door de geest wordt gegenereerd. Ze ontstaan ​​omdat uw hersenen denken dat elektrische signalen in de oogzenuwen informatie over licht overbrengen. De hersenen moeten deze aannames maken omdat er geen manier is om te weten of een signaal een geluid, een visie of iets anders is. Alle zenuwen in het lichaam zenden precies dezelfde elektrische impulsen uit. Door druk uit te oefenen op uw ogen, verzendt u signalen die niet visueel zijn, maar de receptoren van het oog activeren, die uw hersenen – in dit geval ten onrechte – interpreteren als iets visueels. Je kunt de druk letterlijk zien!

Het is grappig om te bedenken hoe vergelijkbaar computers zijn met de hersenen, maar het is ook een bruikbare analogie om te illustreren hoezeer de betekenis van gegevens (of ze nu door het lichaam worden getransporteerd door zenuwen of opgeslagen op een computer) afhangt van hoe ze worden geïnterpreteerd. Alle binaire gegevens bestaan ​​uit nullen en enen, de basiscomponenten die allerlei soorten informatie kunnen overbrengen. Uw computer weet vaak hoe hij ze moet interpreteren door aanwijzingen zoals bestandsextensies te gebruiken. Nu dwingen we het om ze als tekst te interpreteren, omdat dat is wat de teksteditor verwacht.

Om te begrijpen hoe we JPEG kunnen decoderen, moeten we de originele signalen zelf zien: de binaire gegevens. Dit kan gedaan worden met behulp van een hexadecimale editor, of rechtstreeks via originele artikelwebpagina! Er is een afbeelding, waarnaast in het tekstveld alle bytes staan ​​(behalve de kop), gepresenteerd in decimale vorm. U kunt ze wijzigen en het script zal direct opnieuw coderen en een nieuwe afbeelding produceren.

Hoe het JPEG-formaat werkt

Je kunt veel leren door gewoon met deze editor te spelen. Kunt u bijvoorbeeld vertellen in welke volgorde de pixels zijn opgeslagen?

Het vreemde aan dit voorbeeld is dat het veranderen van sommige cijfers helemaal geen invloed heeft op de afbeelding, maar als je bijvoorbeeld op de eerste regel het getal 17 vervangt door 0, dan is de foto compleet verpest!

Hoe het JPEG-formaat werkt

Andere wijzigingen, zoals het vervangen van de 7 op regel 1988 door het nummer 254, veranderen de kleur, maar alleen van daaropvolgende pixels.

Hoe het JPEG-formaat werkt

Misschien wel het vreemdste is dat sommige cijfers niet alleen de kleur, maar ook de vorm van de afbeelding veranderen. Verander de 70 in regel 12 naar 2 en kijk naar de bovenste rij van de afbeelding om te zien wat ik bedoel.

Hoe het JPEG-formaat werkt

En welke JPEG-afbeelding je ook gebruikt, je zult altijd deze mysterieuze schaakpatronen tegenkomen bij het bewerken van de bytes.

Als je met de editor speelt, is het moeilijk te begrijpen hoe een foto uit deze bytes wordt gereconstrueerd, aangezien JPEG-compressie uit drie verschillende technologieën bestaat, die opeenvolgend in niveaus worden toegepast. We zullen ze allemaal afzonderlijk bestuderen om het mysterieuze gedrag dat we zien te ontdekken.

Drie niveaus van JPEG-compressie:

  1. Subsampling van kleuren.
  2. Discrete cosinustransformatie en bemonstering.
  3. Runlengtecodering, delta и Huffman

Om u een idee te geven van de omvang van de compressie, moet u er rekening mee houden dat de afbeelding hierboven 79 getallen vertegenwoordigt, of ongeveer 819 KB. Als we het zonder compressie zouden opslaan, zou elke pixel drie cijfers nodig hebben: voor de rode, groene en blauwe componenten. Dit zou neerkomen op 79 nummers, oftewel ca. 917 KB. Als resultaat van JPEG-compressie werd het uiteindelijke bestand meer dan 700 keer verkleind!

In feite kan dit beeld veel meer worden gecomprimeerd. Hieronder staan ​​twee afbeeldingen naast elkaar - de foto aan de rechterkant is gecomprimeerd tot 16 KB, dat wil zeggen 57 keer kleiner dan de niet-gecomprimeerde versie!

Hoe het JPEG-formaat werkt

Als je goed kijkt, zie je dat deze afbeeldingen niet identiek zijn. Het zijn allebei afbeeldingen met JPEG-compressie, maar de rechter is qua volume veel kleiner. Het ziet er ook iets slechter uit (kijk naar de achtergrondkleurvierkantjes). Daarom wordt JPEG ook wel lossy-compressie genoemd; Tijdens het compressieproces verandert het beeld en gaan enkele details verloren.

1. Kleursubsampling

Hier is een afbeelding waarop alleen het eerste compressieniveau is toegepast.

Hoe het JPEG-formaat werkt
(Interactieve versie - in origineel Lidwoord). Als u één getal verwijdert, worden alle kleuren vernietigd. Als er echter precies zes cijfers worden verwijderd, heeft dit vrijwel geen effect op de afbeelding.

Nu zijn de cijfers iets gemakkelijker te ontcijferen. Dit is een bijna eenvoudige lijst met kleuren, waarbij elke byte precies één pixel verandert, maar tegelijkertijd al de helft kleiner is dan de ongecomprimeerde afbeelding (die in deze verkleinde grootte ongeveer 300 KB in beslag zou nemen). Kun jij raden waarom?

Je kunt zien dat deze getallen niet de standaard rode, groene en blauwe componenten vertegenwoordigen, want als we alle getallen vervangen door nullen, krijgen we een groen beeld (in plaats van wit).

Hoe het JPEG-formaat werkt

Dit komt omdat deze bytes staan ​​voor Y (helderheid),

Hoe het JPEG-formaat werkt

Cb (relatieve blauwheid),

Hoe het JPEG-formaat werkt

en Cr-foto's (relatieve roodheid).

Hoe het JPEG-formaat werkt

Waarom geen RGB gebruiken? Dit is tenslotte hoe de meeste moderne schermen werken. Uw monitor kan elke kleur weergeven, inclusief rood, groen en blauw, met verschillende intensiteiten voor elke pixel. Wit wordt verkregen door ze alle drie op volledige helderheid in te schakelen, en zwart door ze uit te schakelen.

Hoe het JPEG-formaat werkt

Dit lijkt ook erg op hoe het menselijk oog werkt. De kleurreceptoren in onze ogen worden "kegels“, en zijn onderverdeeld in drie typen, die elk gevoeliger zijn voor rode, groene of blauwe kleuren [S-type kegels zijn gevoelig in het violetblauwe (S van het Engelse korte-kortegolfspectrum), M -type - in de groen-gele (M van de Engelse middengolf - middengolf), en L-type - in de geel-rode (L van de Engelse lange - lange golf) delen van het spectrum. De aanwezigheid van deze drie soorten kegeltjes (en staafjes, die gevoelig zijn in het smaragdgroene deel van het spectrum) geeft iemand kleurzicht. / ca. vert.]. sticks, een ander type fotoreceptor in onze ogen, kan veranderingen in helderheid detecteren, maar is veel gevoeliger voor kleur. Onze ogen hebben ongeveer 120 miljoen staafjes en slechts 6 miljoen kegeltjes.

Dit is de reden waarom onze ogen veel beter zijn in het detecteren van veranderingen in helderheid dan in kleurveranderingen. Als je kleur van helderheid scheidt, kun je een beetje kleur verwijderen en niemand zal er iets van merken. Chroma-subsampling is het proces waarbij de kleurcomponenten van een afbeelding worden weergegeven met een lagere resolutie dan de luminantiecomponenten. In het bovenstaande voorbeeld heeft elke pixel precies één Y-component, en elke individuele groep van vier pixels heeft precies één Cb- en één Cr-component. Daarom bevat de afbeelding vier keer minder kleurinformatie dan het origineel.

De YCbCr-kleurruimte wordt niet alleen in JPEG gebruikt. Het werd oorspronkelijk in 1938 uitgevonden voor televisieprogramma's. Niet iedereen heeft een kleuren-tv, dus door kleur en helderheid te scheiden kon iedereen hetzelfde signaal krijgen, en tv's zonder kleur gebruikten eenvoudigweg alleen de helderheidscomponent.

Als u dus één getal uit de editor verwijdert, worden alle kleuren volledig verpest. De componenten worden opgeslagen in de vorm Y Y Y Y Cb Cr (in feite niet noodzakelijkerwijs in die volgorde - de opslagvolgorde wordt gespecificeerd in de bestandskop). Als u het eerste getal verwijdert, wordt de eerste waarde van Cb waargenomen als Y en Cr als Cb, en in het algemeen krijgt u een domino-effect dat alle kleuren van het beeld verwisselt.

De JPEG-specificatie dwingt u niet om YCbCr te gebruiken. Maar de meeste bestanden gebruiken het omdat het betere gedownsampelde afbeeldingen produceert dan RGB. Maar je hoeft mij niet op mijn woord te geloven. Kijk zelf in de onderstaande tabel hoe subsampling van elke individuele component eruit zal zien in zowel RGB als YCbCr.

Hoe het JPEG-formaat werkt
(Interactieve versie - in origineel Lidwoord).

De verwijdering van blauw is niet zo opvallend als die van rood of groen. Dat komt door de zes miljoen kegeltjes in je ogen: ongeveer 64% is gevoelig voor rood, 32% voor groen en 2% voor blauw.

De downsampling van de Y-component (linksonder) is het best zichtbaar. Zelfs een kleine verandering is merkbaar.

Het converteren van een afbeelding van RGB naar YCbCr verkleint de bestandsgrootte niet, maar maakt het wel gemakkelijker om minder zichtbare details te vinden die kunnen worden verwijderd. Compressie met verlies vindt plaats in de tweede fase. Het is gebaseerd op het idee om gegevens in een meer samendrukbare vorm te presenteren.

2. Discrete cosinustransformatie en bemonstering

Dit compressieniveau is voor het grootste deel waar het bij JPEG om draait. Na het converteren van de kleuren naar YCbCr worden de componenten afzonderlijk gecomprimeerd, zodat we ons kunnen concentreren op alleen de component Y. En zo zien de bytes van de Y-component eruit na het aanbrengen van deze laag.

Hoe het JPEG-formaat werkt
(Interactieve versie - in origineel Lidwoord). In de interactieve versie scrollt de editor door op een pixel te klikken naar de regel die deze pixel vertegenwoordigt. Probeer cijfers aan het einde te verwijderen of een paar nullen toe te voegen aan een bepaald nummer.

Op het eerste gezicht lijkt het een zeer slechte compressie. Er zijn 100 pixels in een afbeelding, en er zijn 000 getallen nodig om de helderheid weer te geven (Y-componenten). Dat is nog erger dan helemaal niets comprimeren!

Houd er echter rekening mee dat de meeste van deze cijfers nul zijn. Bovendien kunnen al die nullen aan het einde van regels worden verwijderd zonder de afbeelding te veranderen. Er zijn nog ongeveer 26 nummers over, en dit is bijna 000 keer minder!

Dit niveau bevat het geheim van schaakpatronen. In tegenstelling tot andere effecten die we hebben gezien, is het verschijnen van deze patronen geen fout. Zij zijn de bouwstenen van het hele beeld. Elke regel van de editor bevat exact 64 getallen, discrete cosinustransformatie (DCT) coëfficiënten die overeenkomen met de intensiteiten van 64 unieke patronen.

Deze patronen worden gevormd op basis van de cosinusplot. Hier ziet u hoe sommige eruitzien:

Hoe het JPEG-formaat werkt
8 van de 64 kansen

Hieronder ziet u een afbeelding met alle 64 patronen.

Hoe het JPEG-formaat werkt
(Interactieve versie - in origineel Lidwoord).

Deze patronen zijn van bijzonder belang omdat ze de basis vormen van de 8x8 afbeeldingen. Als u niet bekend bent met lineaire algebra, betekent dit dat u met deze 8 patronen elk 8x64-beeld kunt maken. DCT is het proces waarbij afbeeldingen in blokken van 8x8 worden verdeeld en elk blok wordt omgezet in een combinatie van deze 64 coëfficiënten.

Het lijkt magisch dat elk beeld uit 64 specifieke patronen kan bestaan. Dit is echter hetzelfde als zeggen dat elke plaats op aarde kan worden beschreven door twee getallen: breedtegraad en lengtegraad [geeft halfronden aan / ongeveer 8 graden Celsius). vert.]. We denken vaak dat het aardoppervlak tweedimensionaal is, dus we hebben maar twee getallen nodig. Een afbeelding van 8x64 heeft 64 afmetingen, dus we hebben XNUMX getallen nodig.

Het is nog niet duidelijk hoe dit ons helpt qua compressie. Als we 64 getallen nodig hebben om een ​​8x8 afbeelding weer te geven, waarom zou dit dan beter zijn dan alleen het opslaan van 64 helderheidscomponenten? We doen dit om dezelfde reden waarom we drie RGB-getallen hebben omgezet in drie YCbCr-getallen: het stelt ons in staat subtiele details te verwijderen.

Het is moeilijk om precies te zien welke details in dit stadium worden verwijderd, omdat JPEG DCT toepast op 8x8 blokken. Niemand verbiedt ons echter om het op het hele plaatje toe te passen. Zo ziet DCT eruit voor de Y-component toegepast op het hele plaatje:

Hoe het JPEG-formaat werkt

Meer dan 60 nummers kunnen vanaf het einde worden verwijderd zonder dat er merkbare wijzigingen aan de foto optreden.

Hoe het JPEG-formaat werkt

Houd er echter rekening mee dat als we de eerste vijf cijfers op nul zetten, het verschil duidelijk zal zijn.

Hoe het JPEG-formaat werkt

De cijfers aan het begin vertegenwoordigen laagfrequente veranderingen in het beeld, die onze ogen het beste opmerken. Getallen aan het einde geven veranderingen in de hoge frequenties aan die moeilijker op te merken zijn. Om “te zien wat het oog niet kan zien”, kunnen we deze hoogfrequente details isoleren door de eerste 5000 cijfers op nul te zetten.

Hoe het JPEG-formaat werkt

We zien alle delen van de afbeelding waar de grootste verandering optreedt van pixel tot pixel. De ogen van de kat, zijn snorharen, de badstofdeken en de schaduwen in de linker benedenhoek vallen op. Je kunt nog verder gaan door de eerste 10 nummers op nul te zetten:

Hoe het JPEG-formaat werkt

20 000:

Hoe het JPEG-formaat werkt

40 000:

Hoe het JPEG-formaat werkt

60 000:

Hoe het JPEG-formaat werkt

Deze hoogfrequente details worden tijdens de compressiefase door JPEG verwijderd. Er is geen verlies bij het omzetten van kleuren naar DCT-coëfficiënten. Verlies treedt op bij de bemonsteringsstap, waar hoogfrequente of bijna-nulwaarden worden verwijderd. Wanneer u de JPEG-opslagkwaliteit verlaagt, verhoogt het programma de drempel voor het aantal verwijderde waarden, waardoor de bestandsgrootte kleiner wordt, maar de afbeelding korreliger wordt. Daarom zag de afbeelding in het eerste deel, die 57 keer kleiner was, er zo uit. Elk 8x8-blok werd vertegenwoordigd door veel minder DCT-coëfficiënten vergeleken met de versie van hogere kwaliteit.

Je kunt zo'n cool effect creëren als een geleidelijke streaming van beelden. U kunt een wazig beeld weergeven dat steeds gedetailleerder wordt naarmate er steeds meer coëfficiënten worden gedownload.

Dit is, gewoon voor de lol, wat u krijgt als u slechts 24 nummers gebruikt:

Hoe het JPEG-formaat werkt

Of gewoon 5000:

Hoe het JPEG-formaat werkt

Heel wazig, maar ergens herkenbaar!

3. Runlengtecodering, delta en Huffman

Tot nu toe zijn alle stadia van compressie verliesgevend geweest. De laatste fase verloopt daarentegen zonder verliezen. Het verwijdert geen informatie, maar verkleint de bestandsgrootte aanzienlijk.

Hoe kun je iets comprimeren zonder informatie weg te gooien? Stel je voor hoe we een eenvoudige zwarte rechthoek van 700 x 437 zouden beschrijven.

JPEG gebruikt hiervoor 5000 nummers, maar er kunnen veel betere resultaten worden behaald. Kunt u zich een coderingsschema voorstellen dat zo'n afbeelding in zo weinig mogelijk bytes beschrijft?

Het minimale schema dat ik kon bedenken, gebruikt er vier: drie om een ​​kleur weer te geven, en een vierde om aan te geven hoeveel pixels die kleur heeft. Het idee om herhalende waarden op deze gecomprimeerde manier weer te geven wordt run-length-codering genoemd. Het is verliesvrij omdat we de gecodeerde gegevens in de oorspronkelijke vorm kunnen herstellen.

Een JPEG-bestand met een zwarte rechthoek is veel groter dan 4 bytes. Houd er rekening mee dat op DCT-niveau compressie wordt toegepast op blokken van 8x8 pixels. Daarom hebben we minimaal één DCT-coëfficiënt nodig voor elke 64 pixels. We hebben er één nodig omdat in plaats van één DCT-coëfficiënt op te slaan, gevolgd door 63 nullen, run-length-codering ons in staat stelt één getal op te slaan en aan te geven dat "alle andere nullen zijn".

Deltacodering is een techniek waarbij elke byte een verschil met een bepaalde waarde bevat, in plaats van een absolute waarde. Daarom verandert het bewerken van bepaalde bytes de kleur van alle andere pixels. In plaats van bijvoorbeeld op te slaan

12 13 14 14 14 13 13 14

We kunnen beginnen met 12 en dan eenvoudigweg aangeven hoeveel we moeten optellen of aftrekken om het volgende getal te krijgen. En deze reeks in deltacodering heeft de vorm:

12 1 1 0 0 -1 0 1

De geconverteerde gegevens zijn niet kleiner dan de oorspronkelijke gegevens, maar kunnen gemakkelijker worden gecomprimeerd. Het toepassen van delta-codering vóór run-length-codering kan veel helpen, terwijl het nog steeds verliesvrije compressie is.

Deltacodering is een van de weinige technieken die buiten 8x8 blokken wordt gebruikt. Van de 64 DCT-coëfficiënten is er één eenvoudigweg een constante golffunctie (effen kleur). Het vertegenwoordigt de gemiddelde helderheid van elk blok voor de luma-componenten, of de gemiddelde blauwheid voor de Cb-componenten, enzovoort. De eerste waarde van elk DCT-blok wordt de DC-waarde genoemd, en elke DC-waarde is delta-gecodeerd ten opzichte van de voorgaande. Daarom heeft het wijzigen van de helderheid van het eerste blok invloed op alle blokken.

Het laatste mysterie blijft: hoe kan het veranderen van het enkelvoud het hele plaatje volledig verpesten? Tot nu toe hebben compressieniveaus dergelijke eigenschappen niet gehad. Het antwoord ligt in de JPEG-header. De eerste 500 bytes bevatten metagegevens over de afbeelding (breedte, hoogte, enz.), en we hebben er nog niet mee gewerkt.

Zonder header is het bijna onmogelijk (of heel moeilijk) om JPEG te decoderen. Het zal lijken alsof ik het beeld aan u probeer te beschrijven, en ik begin woorden te verzinnen om mijn indruk over te brengen. De beschrijving zal waarschijnlijk behoorlijk beknopt zijn, omdat ik woorden kan verzinnen met precies de betekenis die ik wil overbrengen, maar voor alle anderen zullen ze niet logisch zijn.

Het klinkt stom, maar dat is precies wat er gebeurt. Elke JPEG-afbeelding wordt gecomprimeerd met specifieke codes. Het codewoordenboek wordt opgeslagen in de header. Deze techniek wordt Huffman-code genoemd en de woordenschat heet Huffman-tabel. In de koptekst wordt de tabel gemarkeerd met twee bytes: 255 en vervolgens 196. Elke kleurcomponent kan zijn eigen tabel hebben.

Wijzigingen in tabellen zullen elke afbeelding radicaal beïnvloeden. Een goed voorbeeld is om de 15e regel te wijzigen in 1.

Hoe het JPEG-formaat werkt

Dit gebeurt omdat de tabellen specificeren hoe individuele bits moeten worden gelezen. Tot nu toe hebben we alleen met binaire getallen in decimale vorm gewerkt. Maar dit verbergt voor ons het feit dat als je het getal 1 in een byte wilt opslaan, het er als 00000001 uit zal zien, aangezien elke byte precies acht bits moet hebben, zelfs als er maar één nodig is.

Dit is potentieel een grote verspilling van ruimte als u veel kleine aantallen heeft. Huffman-code is een techniek waarmee we de eis kunnen versoepelen dat elk getal acht bits moet beslaan. Dit betekent dat als je twee bytes ziet:

234 115

Afhankelijk van de Huffman-tabel kunnen dit dan drie getallen zijn. Om ze te extraheren, moet je ze eerst opsplitsen in afzonderlijke bits:

11101010 01110011

Vervolgens kijken we naar de tabel om erachter te komen hoe we ze kunnen groeperen. Dit kunnen bijvoorbeeld de eerste zes bits zijn (111010), of 58 in decimalen, gevolgd door vijf bits (10011), of 19, en ten slotte de laatste vier bits (0011), of 3.

Daarom is het erg moeilijk om de bytes in dit compressiestadium te begrijpen. Bytes vertegenwoordigen niet wat ze lijken. Ik zal in dit artikel niet ingaan op de details van het werken met de tabel, maar materieel over dit onderwerp online genoeg.

Een interessante truc die je met deze kennis kunt doen, is door de header van de JPEG te scheiden en deze afzonderlijk op te slaan. Het blijkt zelfs dat alleen jij het bestand kunt lezen. Facebook doet dit om bestanden nog kleiner te maken.

Wat we nog meer kunnen doen, is de Huffman-tabel behoorlijk veranderen. Voor anderen zal het lijken op een gebroken foto. En alleen jij kent de magische manier om het te repareren.

Laten we samenvatten: wat is er nodig om JPEG te decoderen? Nodig:

  1. Haal de Huffman-tabel(len) uit de header en decodeer de bits.
  2. Extraheer de discrete cosinustransformatiecoëfficiënten voor elke kleur- en luminantiecomponent voor elk 8x8 blok, waarbij inverse runlength- en delta-coderingstransformaties worden uitgevoerd.
  3. Combineer cosinussen op basis van coëfficiënten om pixelwaarden voor elk 8x8 blok te verkrijgen.
  4. Kleurcomponenten schalen als er subsampling is uitgevoerd (deze informatie staat in de koptekst).
  5. Converteer de resulterende YCbCr-waarden voor elke pixel naar RGB.
  6. Geef het beeld weer op het scherm!

Serieus werk voor simpelweg een foto met een kat bekijken! Wat ik er echter leuk aan vind, is dat het laat zien hoe mensgericht JPEG-technologie is. Het is gebaseerd op de eigenaardigheden van onze perceptie, waardoor we een veel betere compressie kunnen bereiken dan conventionele technologieën. En nu we begrijpen hoe JPEG werkt, kunnen we ons voorstellen hoe deze technologieën naar andere gebieden kunnen worden overgedragen. Delta-codering in video kan bijvoorbeeld een aanzienlijke verkleining van de bestandsgrootte opleveren, omdat er vaak hele gebieden zijn die niet van frame tot frame veranderen (bijvoorbeeld de achtergrond).

Code gebruikt in het artikel, is geopend en bevat instructies voor het vervangen van de afbeeldingen door uw eigen afbeeldingen.

Bron: www.habr.com

Voeg een reactie