Hoe werkt JPEG

Een van de meest gebruikte bestandsformaten is jpeg. Weinigen denken na over de manier waarop hun foto’s worden omgezet in een jpeg-bestand, nog veel minder mensen weten hoe deze techniek precies werkt.

Informatieverlies

Wiskundigen hebben in de loop der jaren vele methoden bedacht om data te comprimeren met een acceptabel verlies van informatie. De meest bruikbare bleken technieken op basis van een wiskundige transformatie. Het uitgangspunt voor deze technieken is dat niet alle informatie in een signaal even belangrijk hoeft te zijn. De hoge frequenties in een willekeurig signaal zijn over het algemeen minder belangrijk dan de lage frequenties.

In alledaagse termen: het is minder erg om een deel van lichte delen van een foto verloren te laten gaan dan de donkere partijen in een foto. Sterker nog, de schaduwen in een foto bepalen voor een heel groot gedeelte hoe een afbeelding bij mensen overkomt. Daar moet een compressietechniek dus niet te veel mee rommelen! Ook jpeg richt zich in eerste instantie dus op de lichte delen van een foto: de verwijdering van de helft van het aantal bits in de delen van een signaal met de hoge frequenties (de ‘lichten’), resulteert hierdoor in slechts vijf procent informatieverlies van de gecodeerde informatie. Met andere woorden: onze ogen zien verlies aan beeld in lichte partijen veel minder goed dan in de donkere delen van een afbeelding.

Kleurkanalen

Een afbeelding kan zijn opgebouwd uit percentages rood, groen en blauw (RGB) of uit percentages van de kleuren cyaan, magenta, geel en zwart (CMYK). Het beeldscherm waarnaar u nu kijkt is een voorbeeld van RGB, terwijl kleurendrukwerk dat van een pers rolt in de meeste gevallen is gemaakt met CMYK-inkten. Een afbeelding op de computer die bestemd is voor bijvoorbeeld internet is daarom opgebouwd uit de RGB-kleuren (kanalen) en afbeeldingen bestemd voor de drukpers uit CMYK-kanalen. Een foto in RGB bestaat op de computer dus uit drie keer dezelfde afbeelding: de rode delen daarvan, de groenen en tenslotte de blauwe delen. Professionele software zoals Photoshop kan die lagen ook afzonderlijk tonen en bewerken.

Grijswaarden

De jpeg-compressie kan worden toegepast op zowel RGB- als CMYK-beelden van zeer uiteenlopende resoluties. Alle hierna beschreven stappen vinden plaats in de drie of vier kleurkanalen van een afbeelding. De methode start met het indelen van een afbeelding in groepen van 8 x 8 pixels (beeldpunten). Dit lijkt vreemd in een tijd dat een plaatje met een resolutie (afmeting) van 800 bij 600 pixels al aan de kleine kant is, maar een matrix van deze omvang was nu eenmaal het maximum dat de elektronica uit de tijd van de totstandkoming van de jpeg-standaard kon verwerken.

Van iedere pixel in de matrix wordt de grijswaarde bepaald. Dit is de mate waarin een pixel een bepaalde kleur heeft. De grijswaarde wordt uitgedrukt in bits. Helemaal geen kleur krijgt de waarde ‘0’ en honderd procent van een bepaalde kleur de waarde ‘255’. Als alle 64 pixels op deze manier zijn geanalyseerd, resulteert dit in 64 getallen van elk acht bits (één byte) die een waarde kunnen hebben die ligt tussen 0 en 255. De matrix is dus 64 byte groot. Om een idee te krijgen van het rekenwerk dat hiermee gemoeid is: er passen 100 maal 75 keer een matrix van 8 bij 8 pixels in een plaatje van 800 bij 600 pixels. Er moet dus 7500 x 64 = 480.000 keer de grijswaarde van een pixel worden vastgelegd, en dat voor alle drie de kleurkanalen. Dat zijn dus in totaal 1,44 miljoen berekeningen!

jpeg_01
Afbeelding 1
Heuvellandschap

Nu is van alle afzonderlijke pixels in de afbeelding de grijswaarde bekend. Als we op de matrix van 8 bij 8 pixels de grijswaarden zouden weergeven met verticale staven, krijgen we een diagram die met een beetje fantasie op een heuvellandschap lijkt, met zacht glooiende hellingen en wellicht hier en daar pieken (hoge frequenties) en dalen (lage frequenties). De hogere frequenties zijn zoals gezegd minder belangrijk en kunnen dus meer worden gecomprimeerd eer het menselijk oog dit in de gaten krijgt. De verdeling van lichte en donkere delen is bij iedere afbeelding weer anders. In de foto zijn vaak lichte of juist donkere delen te zien en op die plekken zal de matrix van 8 bij 8 weinig variatie vertonen. Maar dat hoeft niet zo te zijn: menselijk haar vertoont grote verschillen in lichtintensiteit (grijswaarde) vlak bij elkaar. Die matrix heeft dus een grote variatie in grijswaarden.

jpeg_02
Afbeelding 2
Transformatie

Het lijkt erop dat nu voor iedere pixel moet worden vastgesteld hoe veel deze kan worden gecomprimeerd zonder storend verlies aan informatie. Dit is mogelijk, maar niet echt praktisch: voor een relatief kleine rgb-afbeelding van 800 bij 600 pixels moet er dan immers weer 1,44 miljoen berekeningen worden uitgevoerd! Het is een stuk handiger om de hoge en lage frequenties in een afbeelding altijd op dezelfde plek te hebben en in één keer een compressie toe te passen op de hoge en de lage frequenties. De list die wiskundigen hiervoor hebben verzonnen, is de transformatie. De wiskundige transformatie die bij jpeg wordt gebruikt, zorgt ervoor dat de waarden van de lichte partijen in een afbeelding bij elkaar worden gegroepeerd en die met de donkere delen op een andere plek in de matrix terechtkomen. In de oorspronkelijke matrix van 8 bij 8 pixels stonden de pieken en dalen door elkaar heen, maar na de wiskundige transformatie staan de dalen netjes bij de dalen in de ene hoek van de matrix en de pieken bij de pieken in een andere hoek.

Kwaliteitsbepaling

De transformatie zit in werkelijkheid overigens iets ingewikkelder in elkaar. Uitleg hiervan hoort echter in een universitair wiskundecollege thuis, niet in dit artikel. Voor een goed begrip van de jpeg-compressie is het voldoende te weten dat het oorspronkelijke heuvellandschap is omgetoverd in een landschap waar de lichte en donkere delen op vaste plekken zijn terechtgekomen en bovendien zowel naar boven als naar beneden kunnen wijzen met een maximum van 127 (de helft van de oorspronkelijke 255). Pas dan kan de echte jpeg-compressie plaatsvinden. Er worden hier twee strategieën toegepast: kijken welke delen weggegooid kunnen worden zonder al te veel kwaliteitsverlies, gevolgd door het reduceren van het aantal bits waarmee de afbeelding wordt weergegeven. De combinatie van deze maatregelen bepaalt de mate van compressie. Dit is ook het moment waarop de jpeg-compressie zichtbaar wordt: wanneer u in een grafisch programma als Photoshop een bestand opslaat als een jpeg van een bepaalde kwaliteit (laag, midden, hoog en maximaal).

jpeg_03
Afbeelding 3
Informatiebeperking

Het weglaten van min of meer overbodige informatie gebeurt door de waarde van de frequenties te delen door een getal en de uitkomst af te ronden naar het dichtstbijzijnde hele getal. De getallen zijn wederom ingedeeld in een matrix van 8 x 8, waarbij de quotiënten rechtsonder (bestemd voor de hogere frequenties) aanzienlijk hoger zijn dan de quotiënten linksboven (bestemd voor de lagere frequenties). De mate van compressie wordt bepaald door de hoogte van de quotiënten uit deze tabel. Een lage compressiegraad deelt de hoge frequentiewaarden rechtsonder door zestien, waarmee de frequentiewaarden tussen de -7 en 7 komen te liggen, in plaats van -127 en 127. De afbeelding wordt op deze plek in de matrix dus gerepresenteerd door vier bits (2 tot de macht 4 = 16), in plaats van de oorspronkelijke acht bits (één byte). Een extreem hoge compressiegraad start rechtsonder met quotiënten van 256, die de hoge frequenties volledig elimineren.

Reconstrueren

Het beeld is nu in meer of mindere mate gereduceerd. Een tweede manier om een afbeelding al dan niet verder te reduceren is om deze na de compressie weer op te bouwen (reconstrueren) met meer of juist minder bytes. Zware compressie geeft dan de toch al sterk gereduceerde lichte partijen ook nog eens met minder bytes weer, wat tot een nog kleiner bestand leidt. Of het nog mooi is, valt echter te bezien. Door op deze manier te stoeien met reduceren van bepaalde delen in de afbeelding en het resultaat hiervan met veel of juist weinig byte weer te geven, is het bijvoorbeeld mogelijk om een originele afbeelding van 64 byte per matrix (coëfficiënt 64) nagenoeg foutloos weer te geven met coëfficiënt 15, minder dan een kwart van het origineel. Zelfs met coëfficiënt 6 ontstaat nog een redelijk beeld, al treedt zichtbaar vervlakking op, en met coëfficiënt 3 wordt het beeld ernstig vervormd. Dat is op internet vaak zichtbaar als afbeeldingen met weinig ‘diepgang’ en bovendien hinderlijke ‘blokvorming’ rond de details op de foto.

jpeg_04
Afbeelding 4
Fabeltje

De vierde stap in het algoritme plaatst de 64 getallen in de matrix achter elkaar door vanaf rechtsboven diagonaalsgewijs door te matrix te lopen en linksonder te eindigen. Hierdoor ontstaat een reeks van getallen met series van nullen, die worden gereduceerd door de run-length-compressie. De reeks getallen die vervolgens ontstaat wordt tot slot nog verder gecomprimeerd met behulp van de Huffman-methode. Als de afbeelding aan het eind moet worden opgeslagen als jpeg, moet die getransformeerde matrix voor alle kleurkanalen vertaald worden naar een plaatje dat de mens kan zien. Dat komt neer op in omgekeerde volgorde de stappen herhalen. Echter, sommige informatie is tijdens het comprimeren weggegooid en kan dus nooit meer worden weergegeven. Dat is dus blijvend kwaliteitsverlies. Daarom wordt jpeg ook wel een ‘lossy’ techniek genoemd. Dit verschijnsel heeft ook tot de opvatting geleid dat herhaald openen en weer opslaan van een jpeg-bestand tot nog meer kwaliteitverlies leidt. Praktijktests hebben echter uitgewezen dat dit een fabeltje is: informatie die de eerste keer verloren is gegaan, hoeft de volgende keer niet weer weggegooid te worden omdat deze er simpelweg niet is. Extra kwaliteitsverlies treedt alleen op als een jpeg later met nog zwaardere compressie wordt opgeslagen, maar dat is logisch!

jpeg_05
Afbeelding 5
Scroll Up

Pin It on Pinterest