Naar inhoud springen

JPEG

Uit Wikipedia, de vrije encyclopedie
(Doorverwezen vanaf JPG)
Joint photographic experts group
JPEG
Een foto van een bloem met van links naar rechts steeds meer verlieslijdende compressieverhoudingen.
Een foto van een bloem met van links naar rechts steeds meer verlieslijdende compressieverhoudingen.
Bestandsextensie jpeg, jpg, jpe, jfif, jfi, jif
MIME-type image/jpeg
Verschijningsdatum 18 september 1992
Magisch nummer FF D8 FF
Portaal  Portaalicoon   Informatica

Joint photographic experts group (JPEG) (spreekt uit als: jee-peg) is een bestandsindeling voor het opslaan van rasterafbeeldingen in digitale vorm. Het is een vorm van datacompressie en van broncodering.

De JPEG-bestandsindeling kent diverse compressiemogelijkheden. Hoe hoger de compressie des te kleiner het bestand, en des te geringer de beeldkwaliteit. Het kwaliteitsverlies van JPEG valt niet veel op bij foto’s, maar wel bij bijvoorbeeld grafieken, lijnen of letters. Voor dit soort afbeeldingen is de GIF- of PNG-compressie beter geschikt, of de nieuwe RAW-methode waar de opslag plaatsvindt zonder compressie en het beeld later via geschikte software bewerkt kan worden. JPEG wordt vooral gebruikt voor foto’s, zoals bij digitale camera’s.

Een tekortkoming van de JPEG-bestandsindeling is dat slechts 8 bits per kleur (rood, groen en blauw) mogelijk zijn en dat er geen mogelijkheid is om een deel van de afbeelding transparant te maken. In 2009 maken de wat duurdere digitale camera's foto's met meer bits per kleur. Ook scanners kunnen meer dan 8 bits-kleuren scannen. Doordat de kwaliteit van de apparatuur steeds meer toeneemt, wordt de JPEG-bestandsindeling langzamerhand minder gebruikt.

Een overblijfsel uit de tijd dat het besturingssysteem MS-DOS populair was, is dat de JPEG-bestanden vaak de extensie ‘JPG’ krijgen (drie letters was het maximum).

De JPEG-indeling is complex. In tegenstelling tot indelingen als PNG of GIF, wordt niet van een enkel mechanisme gebruikgemaakt, maar wordt een groot aantal stappen na elkaar toegepast om tot het uiteindelijke JPEG-bestand te komen.

Stel, we hebben een afbeelding van 16 bij 16 pixels, zoals dit (uitvergrote) voorbeeld:

Deze afbeelding bestaat uit drie kleurkanalen: rood, groen en blauw. Deze kanalen zijn op de afbeeldingen rechts uitgesplitst. Het menselijk oog is gevoeliger voor helderheid dan voor kleur. Om het bestand kleiner te maken kunnen we informatie verwijderen op een manier dat het zo weinig mogelijk opvalt. Kleurdetails verwijderen valt minder op dan helderheidsdetails. Daarom is het de bedoeling dat we minder informatie aan kleur opslaan dan aan helderheid.

Dat lukt niet in de RGB-kleurenruimte. Daarom worden de drie kanalen omgerekend naar de YUV-kleurenruimte. Het Y-kanaal bevat vervolgens de intensiteit, de U- en V-kanalen de kleurinformatie. JPEG biedt de mogelijkheid de U- en V- kanalen ongemoeid te laten, of met een factor 2 of 4 in resolutie omlaag te brengen. Het resultaat van hoe de kleurkanalen er met factor 4 dan uitzien is rechts te zien.

Vervolgens wordt ieder kanaal afzonderlijk behandeld. Een kanaal wordt in blokjes van 8 bij 8 pixels opgedeeld. Op zo’n blokje wordt vervolgens een discrete cosinustransformatie toegepast. Het resultaat daarvan is weer een blokje van 8 bij 8 pixels. In dat blokje is de pixel linksboven de gemiddelde kleur van de afbeelding. Als je nu naar rechts of naar onder beweegt, dan bepalen die pixels details van steeds kleinere gebieden.

De discrete cosinustransformatie is wiskundig gezien exact omkeerbaar; in de praktijk gaat er echter wegens de beperkte rekenkundige precisie in de computer wat informatie verloren.

De pixels rechtsonder in het getransformeerde blokje bepalen dus zeer fijne details. Als we die weggooien, vallen alleen wat fijne details weg. Dat is ook wat men bij JPEG doet. In de JPEG-standaard is een aantal kwantisatie-matrices opgenomen. Afhankelijk van de kwaliteit die de gebruiker kiest wordt een andere matrix gekozen.

In deze 8 bij 8-matrix staat voor iedere pixel een getal. Voor alle pixels in het getransformeerde blokje wordt de pixelwaarde gedeeld door het getal in de kwantisatiematrix. Bij hoge kwaliteit zullen veel pixels door 1 gedeeld worden, naarmate de kwaliteit teruggeschroefd wordt, zullen de pixels rechtsonder door grotere getallen gedeeld worden.

Een van de kwantisatiematrices ziet er zo uit:

1 1 2 4 8 16 32 64
1 1 2 4 8 16 32 64
2 2 2 4 8 16 32 64
4 4 4 4 8 16 32 64
8 8 8 8 8 16 32 64
16 16 16 16 16 16 32 64
32 32 32 32 32 32 32 64
64 64 64 64 64 64 64 64

Omdat hier met gehele getallen gerekend wordt, wordt informatie weggegooid. Het idee achter dit delen is dat je veel lage pixelwaardes krijgt. Als je de kwaliteit van JPEG laag zet, worden veel pixels in het getransformeerde blokje door 128 gedeeld. Na de deling houd je dan dus altijd een 0 of een 1 over.

Vervolgens worden de pixels gelineariseerd tot één lange sliert van 64 pixels. Dat gebeurt in een heel speciale volgorde: de volgende tabel laat zien welke pixel op welke plaats in de sliert komt.

0 1 5 6 14 15 27 28
2 4 7 13 16 26 29 42
3 8 12 17 25 30 41 43
9 11 18 24 31 40 44 53
10 19 23 32 39 45 52 54
20 22 33 38 46 51 55 60
21 34 37 47 50 56 59 61
35 36 48 49 57 58 62 63

De bedoeling hiervan is zo veel mogelijk nullen gegroepeerd bij elkaar te krijgen zodat je effectief run-length encoding kunt toepassen. Dat is dan ook de volgende stap.

In de laatste stap wordt het getransformeerde blokje van 8 bij 8 pixels met een Huffmancodering bewerkt. Het resultaat daarvan wordt in het JPEG-bestand opgeslagen.

Compressie versus kwaliteit

[bewerken | brontekst bewerken]

Bij de meeste programma’s kan de kwaliteit waarin een foto wordt opgeslagen ingesteld worden. Bij een hogere kwaliteit wordt het bestand groter, en bij een lagere kwaliteit wordt het bestand kleiner. Elk programma heeft zijn eigen methode om een zo goed mogelijke kwaliteit op te slaan in een zo klein mogelijk bestand. Ook de instelling van compressiefactor of kwaliteitsfactor wordt door het programma bepaald en verschilt per programma.

De voorbeelden hieronder laten zien wat het effect is van de gekozen kwaliteit op een schaal van 0 tot 100 (dit is voor ieder programma anders, deze voorbeelden zijn gemaakt met de Gimp, met een integer DCT-methode, en 2×2,1×1,1×1 subsampling).

Op het zicht lijkt een kwaliteit van 80 al goed, als echter een detail wordt uitvergroot, dan zijn er bij een kwaliteit van 90 nog artefacten zichtbaar en zelfs een kwaliteit van 100 heeft nog kleurverschil met het origineel.

Extra gegevens in het JPEG-bestand

[bewerken | brontekst bewerken]

Een JPEG-bestand kan verschillende extra gegevens of metadata bevatten. Dit worden APP markers genoemd:

  • Comment: vrij in te vullen commentaar.
  • EXIF: gegevens van de digitale camera of scanner.
  • IPTC: gestandaardiseerde indeling voor gegevens van de afbeelding.
  • Andere, niet-standaard gegevens.

Veel programma's om foto's te organiseren voegen de 'tags' ook aan de bestanden toe. De Photo Gallery van Microsoft voegt op zijn eigen manier deze tags aan het bestand van de foto toe. En Adobe Photo Album doet dat ook, en ook op zijn eigen manier.

Verliesvrij bewerken

[bewerken | brontekst bewerken]

Doordat de JPEG-compressie hetzelfde werkt in horizontale en verticale richting, is het mogelijk om een afbeelding, die al is opgeslagen als een JPEG-bestand, verliesvrij 90 graden te roteren (en ook 180° en 270°). Ook verliesvrij spiegelen (horizontaal en verticaal) is mogelijk.

Mogelijk softwarepatent

[bewerken | brontekst bewerken]

In april 2004 klaagde Forgent Networks 31 ondernemingen (onder andere Adobe, Apple, IBM) aan in verband met softwarepatentschending. Het Texaanse bedrijf bezit een op 27 oktober 1986 toegewezen patent dat zou worden gebruikt in de JPEG-indeling; het patent beschrijft een methode om bewegende beelden te comprimeren en bevat betreffende kwantisatie overeenkomsten met de JPEG-indeling. Verder beschrijft het patent een cosinustransformatie die op het eerste gezicht niet overeenkomt met wat er binnen JPEG gebeurt. Dertig andere bedrijven hebben in totaal al 90 miljoen dollar betaald. Ondertussen is dit patent verlopen en werd de ongeldigheid van dit patent aangetoond.[1]