JPEG

**JPEG** on digitaalpiltide pakkimise standard, mis on mõeldud eeskätt digitaalfotograafia jaoks. Pakkimise määra saab kohandada, see laseb leida kompromissi talletatava faili mahu ja pildikvaliteedi vahel. JPEG võimaldab ilma suurema kvaliteedikaota 10:1 pakkimist.

JPEG-pakkimist kasutatakse mitmes pildifailivormingus. JPEG/Exif on üks tüüpilisemaid failivorminguid, mis on kasutusel digikaamerates ja muudes pildindusseadmetes. Koos JPEG/JFIF-iga on see kõige levinum vorming piltide edastamiseks ja talletamiseks veebis. Tihti ei tehta vahet, et JPEG on pakkimismeetod ja JFIF on failivorming, ning kutsutakse neid lihtsalt JPEG-ks.

JPEG on akronüüm ingliskeelsest nimetusest Joint Photographics Experts Group (JPEG-standardi loonud asutus). MIME-meedia tüüp JPEG jaoks on image/jpeg. JPEG-failid on tavaliselt failinimelaiendiga .jpg või .jpeg.

JPEG/JFIF-pildi maksimaalne suurus on 65 535 × 65 535 pikslit ehk kuni 4 gigapikslit (kuvasuhte 1:1 puhul).

## JPEG-standard

JPEG (akronüüm nimetusest Joint Photographic Experts Group), on JPEG-standardi loonud grupi nimi, mis on loonud ka muid pildikodeerimise standardeid. "Joint" (ühis) tähendas ISO TC97 WG8 ja CCITT SGVIII. 1987. aastal muutus ISO TC 97 ISO/IEC JTC1-eks ja 1992. aastal muutus CCITT ITU-T-ks. Praegu on JPEG *ISO/IEC Joint Technical Committee 1* alamgrupp *Subcommittee 29*, *Working Group 1*(ISO/IEC JTC 1/SC 29/WG 1) – nimega Coding of still pictures. ITU-T poolelt on vastav asutus ITU-T SG16. Algne JPEG grupp moodustati 1986 aastal. Esimene JPEG-standard töötati välja 1992. aastal ja võeti vastu septembris 1992 kui ITU-T soovitus T.81, ning 1994. aastal kui ISO/IEC 10918-1.

JPEG-standard määratleb koodeki, mis defineerib kuidas pilt kodeeritakse baitide voogu ja dekodeeritakse tagasi algseks pildiks, kuid ei määratle failivormingut, millesse need baidid pannakse. Exifi ja JFIF-standardid on JPEG-pakitud piltide vahetamiseks tavaliselt kasutatavad failivormingud.

JPEG-standardid on ametlikult *Information technology – Digital compression and coding of continuous-tone still images* nime all.

Ecma International TR/98 JPEG-failivormingu spetsifikatsioon *JPEG File Interchange Format* (JFIF) anti ametlikult välja alles 2009. aasta juunis, ehkki see oli olemas juba 1990. aastatel.

## Tüüpiline kasutamine

JPEG-pakkimisalgoritm on parim realistlike stseenide jaoks, kus on tooni ja värvi sujuvad üleminekud. JPEG on väga populaarne veebis kasutamiseks, sest seal on enamasti andmemaht oluline. JPEG/Exif on kasutusel ka digikaamerates.

Teisest küljest ei pruugi JPEG olla parim lahendus jooniste ja teiste tekstilist graafikat sisaldavate piltide jaoks, kus teravad kontrastid kõrvuti asetsevate pikslite vahel võivad tekitada märgatavaid moonutusi. Sellised pildid on parem salvestada kadudeta pildivormingus, nagu TIFF, GIF, PNG või RAW (eeltöötlemata vorming). JPEG-standard sisaldab kadudeta pakkimise võimalust, kuid see ei ole enamikus toodetes toetatud.

Kuna tüüpiline JPEG kasutusala on kadudega pakkimine, mis kaotab pildi täpsust, siis ei peaks seda kasutama lahendustes, kus täpne andmete reproduktsioon on oluline (näiteks mõned teaduslikud ja meditsiinis kasutatavad rakendused).

JPEG ei sobi ka failide jaoks, mida töödeldakse korduvalt (pilditöötlus), sest iga kodeerimine ja dekodeerimine vähendab faili vastavust originaalile. Selle vältimiseks võib vastava pildi salvestada kadudeta vormingus ja hiljem levitamiseks uuesti JPEG-vormingus.

## JPEG-pakkimine

JPEG kasutab kadudega pakkimise meetodit, mis põhineb diskreetsel koosinusteisendusel (*discrete cosine transform*, DCT). See teisendus viib iga välja ruumivallast sagedusvalda. See on pidev mudel, mis põhineb psühhovisuaalsel süsteemil ja jätab välja kõrgsagedusliku informatsiooni ehk teravad üleminekud erksuses ja värvitoonis. Sagedusvallas informatsiooni vähendamise protsessi nimetatakse kvantimiseks. Lihtsamalt on kvantimine protsess, kus vähendatakse arvude mõõtkava (kus iga arv kordub erinevalt) väiksemaks mõõtkavaks. Sagedusvalda kasutatakse, sest see sisaldab kõrgsageduslikke koefitsiente, mis panustavad pildile üldiselt vähem kui muud koefitsiendid, kuid sellised väiksed väärtused on hea pakkimisvõimalusega. Kvantiseeritud koefitsiendid reastatakse ja pakitakse kadudeta väljund bitivoogu (kaod tekivad kvantimisel). Enamus JPEG-standardit kasutatavaid tarkvararakendusi lubavad kasutajal kontrollida pakkimise määra (ja veel mõnda parameetrit), lubades kasutajal kvaliteedi ja failimahu suhet muuta. Manusrakendustes (nagu miniDV, mis kasutab sarnast DCT-pakkimise mudelit) on parameetrid juba valitud ja fikseeritud.

Pakkimismeetod on tavaliselt kadudega, mis tähendab, et osa informatsiooni pildi originaalist on kadunud ja seda pole võimalik taastada. Kadudeta valikut, mis on standardis olemas, ei toetata laialdaselt. Viimasel juhul kasutatakse lihtsalt jooksu-pikkuse (*run-length encoding*, RLE) ja Huffmani kodeeringut.

On olemas ka progressiivne JPEG-vorming, kus andmeid pakitakse progressiivselt kõrgema detailsusega. See on ideaalne suurte piltide jaoks, mida näidatakse samal ajal, kui neid aeglase ühenduse kaudu alla laaditakse. Võimaldades nii, peale osaliste andmete saabumist, mõistliku eelvaate. Progressiivse JPEG-vormingu toetamine tarkvara poolt ei ole universaalne. Sel juhul näitab vastuvõttev programm pilti alles siis, kui see on täismahus kohale jõudnud.

### Kadudeta pilditöötlus

Mitmeid JPEG-pilditöötluse toiminguid saab teha kadudeta (st ilma uuesti pakkimata) – niikaua kui pildi suurus on 1 MCU plokiga (plokk piksleid) jaguv (tavaliselt 16 pikslit mõlemas suunas, 4:2:0 kromaatilise alladiskreetimise korral). Vahendid, kus seda rakendatud: jpegtran, koos kasutajaliidesega Jpegcrop ja JPG_TRANSFORM plugin IrfanView-s.

Plokke võib keerata 90 kraadi, ümber pöörata horisontaalselt, vertikaalselt ja diagonaalselt, ning liigutada pildis ringi. Muudetud plokk ei sõltu kõigist teistest plokkidest pildil.

Vasak ülemine äär JPEG pildil on 8 × 8 pikslise ploki piiril, kuid alumine parem ei pruugi nii olla. See ei võimalda kadudeta liigutada ja keerata pilti, mille alumine parem äär ei ole kõigil kanalitel 8 × 8 ploki äärel.

Pildi keeramine, kus ta ei ole 8- või 16-kordne (mis sõltub alladiskreetimisest), ei ole kadudeta. Sellise pildi keeramine tähendab, et need plokid arvutatakse uuesti ja nii kaotatakse kvaliteedis.

Mitu JPEG pilti võib kadudeta kokku panna, kui nad on salvestatud samasuguste kvaliteedi seadistustega ja nende ääred kattuvad plokkide piiridega.

## JPEG-failid

Failivorming, tuntud kui "JPEG Interchange Format" (JIF), on kirjeldatud standardi lisas B (Annex B). Seda "puhast" vormingut ei kasutata tihti, peamiselt sellepärast, et raske on programmeerida kodeerijaid ja dekodeerijaid, mis rakendavad standardit kogu ulatuses, ja tänu mõningastele standardi puudujääkidele:
* Värvimudeli kirjeldus;
* Värvikomponentide alladiskreetimise registreerimine;
* Pikslite kuvasuhte definitsioon.
Nende probleemide lahendamiseks on arenenud mitmed täiendavad standardid. Esimene neist, mis töötati välja 1992. aastal, oli JPEG File Interchange Format (JFIF), millele järgnes Exchangeable image file format (Exif) ja International Color Consortium (ICC) värviprofiilid. Mõlemad vormingud kasutavad JIF-failile omast baidipaigutust, millele lisaks on JIF-standardi laienduspunktid, täpsemalt rakendusmarkerid (*application markers*): JFIF kasutab APP0-i ja Exif APP1-e. Neis JIF faili osades, mis jäeti edasiseks kasutuseks, lisatakse vajalikud metaandmed.

Nii on JFIF mõnes mõttes piiratud JIF-standard, sest ta määrab mõned piirangud (näiteks ei luba kõiki kodeerimise mooduseid), samas on JFIF ka JIF laiendus, sest lisatud on metaandmeid.

Pildifaile, mis teevad JPEG-pakkimist, kutsutakse tavaliselt "JPEG-failideks", ja neid talletatakse JIF-pildivormingu variantides. Enamik pildistamiseks mõeldud seadmeid (digikaamerad), mis väljastavad JPEG-faile, väljastavad neid tegelikult Exif-vormingus, mille kaameratööstus on standardiseerinud metaandmete vahetamiseks. Samas, kuna Exifi standard ei luba värviprofiile, siis enamus piltide töötlemiseks mõeldud tarkvara kasutab JPEG talletamiseks JFIF-vormingut, ning lisavad sellele APP1 segmendi Exif-failist, olles niimoodi standardi suhtes peaaegu kuulekad. Seega JFIF-standardit interpreteeritakse mõnevõrra paindlikult 
.

### JPEG-vormingu faililaiendid

Tüüpilised faililaiendid JPEG-pakkimisega failide puhul on .jpg ja .jpeg, kuid .jpe, .jfif ja .jif on samuti kasutuses. Võimalik on sisestada JPEG-andmeid ka muud tüüpi failidesse – TIFF-kodeeritud failid sisaldavad JPEG-pilte eelvaatena, MP3-failid sisaldavad kaanena JPEG-faile (ID3V2 märgises).

### Värviprofiil

Paljud JPEG-failid kasutavad ICC värvimudelit. Kasutatavamad värviprofiilid on ka sRGB ja Adobe RGB. Kuna need värvimudelid kasutavad mittelineaarset teisendust, siis dünaamiline ulatus 8-bitisel JPEG-failil on umbes 11 *stop*-i.

## Süntaks ja struktuur

JPEG-pilt koosneb jadast segmentidest, mis algavad markeriga 0xFF, millele järgneb bait, mis näitab, millise markeriga on tegu. Mõned markerid koosnevad ainult neist kahest baidist; teistele järgnevad kaks baiti, mis näitavad järgneva sõnumi (vt tabelit), mis on markeripõhiselt määratud, pikkust (pikkus sisaldab kaks baiti pikkuse jaoks, kuid mitte neid kahte markeri baiti). Mõnele markerile järgnevad entroopia-kodeeritud andmed, sellise markeri pikkus ei sisalda nende andmete pikkust. Kõrvuti asetsevad 0xFF baidid on samuti ka täiteks, kuid ainult entroopia-kodeeritud andmetele järgnevate markerite juhul.

Entroopia-kodeeritud andmete raames, peale 0xFF baiti on enne järgmist baiti lisatud 0x00 bait, et ei paistaks, nagu oleks marker seal, kuhu pole planeeritud. Dekodeerija peab selle 0x00 baidi vahele jätma. Seda tehnikat kasutatakse ainult entroopia-kodeeritud andmetega. Entroopia-kodeeritud andmetel on mõned oma markerid: *reset* markerid (0xD0 kuni 0xD7), mida kasutatakse entroopia-kodeeritud osade isoleerimiseks, et saavutada paralleelne dekodeerimine. Kodeerijad võivad neid *reset*-markereid sisestada korrapäraste intervallide järel (kuigi kõik kodeerijad ei tee seda).

## JPEG-koodeki näidis

JPEG-faili võib kodeerida mitut moodi, kuid enamjaolt kasutatakse JFIF-vormingut. Kodeerimine toimub nii:

1. Värvid teisendatakse RGB-st Y'CbCr-ks, mis koosneb ühest luma (heledus) komponendist Y' ja kahest kromaatsuse komponendist Cb ja Cr, mis tähistavad värvi erineval heleduse intensiivsusel (CIE). Vahest see samm jäetakse vahele.

2. Kromaatsust sisaldava andmehulga resolutsiooni vähendatakse, tavaliselt 2 või 3 korda. Seda sellepärast, et silm on vähemtundlik värvidetailide suhtes, kui heleduse suhtes.

3.Pilt jagatakse 8 × 8 piksli suurusteks plokkideks, Y, Cb, Cr andmed käivad läbi DCT (dekorrelatsioon).

4. DCT koefitsiendid kvanditakse. Inimese nägemine on palju tundlikum väikeste muutuste suhtes värvis või heleduses üle suurte alade, kui kõrgsagedusliku heleduse muutuse suhtes. Seega kõrgsageduslikud komponendid salvestatakse väiksema täpsusega. Kui väga madalat kvaliteedi seadistust kasutatakse, siis kõrgsageduslikud komponendid muutuvad nullideks ja neid ei loeta.

5. Kõigi 8 × 8 plokkide andmed, mis on kvanditud, pakitakse Huffman koodiga.

Dekodeerija teeb need sammud tagurpidi, peale kvantimise, kuna kvantimine on pöördumatu ja andmed kaovad tänu sellele alatiseks.

### Kodeerimine
Mitmed JPEG-standardi võimalused jäetakse kasutamata, ja nagu mainitud, kasutab enamus tarkvara lihtsamat JFIF-vormingut JPEG-faili konteinerina, mis muuhulgas täpsustab kodeerimise meetodi. Siin on lühike kodeerimise seletus, kasutades 24 bitti piksli kohta (8 iga R G ja B jaoks). See on kadudega pakkimise meetod.

### Värvimudeli teisendus

Esiteks tuleks pilt teisendada RGB-ruumist Y'CbCr-ruumi. Selles on kolm komponenti Y', Cb ja Cr. Y' komponent on piksli heledus, Cb ja Cr on kromaatsus (sinine ja punane komponent). See on sama värvimudel, mida kasutavad digitaalsed televiisorid ja video DVD-d, ning sarnane sellega, kuidas värvi esitatakse analoogses PAL-videos. Y'CbCr värvimudel võimaldab paremat pakkimist, ilma olulise kvaliteedi kaota. Pakkimine on efektiivsem, sest heleduse informatsioon (mustvalge), mis on tajutava pildi kvaliteedi jaoks olulisem, on ühel kanalil.

JFIF-standardis on Y'CbCr teisendus kirjas, ja seda tuleks jälgida, et saavutada maksimaalne vastavus standardiga. Kuid osad JPEG-rakendused oma "kõrgeimal kvaliteediastmel" ei kasuta seda sammu ja jätkavad RGB värvimudeliga, kus pilti hoitakse eraldi punase, sinise ja rohelise kanali peal. Selle tulemusel on pakkimine kehvem.
Y', Cb ja Cr komponentide arvutamine JFIF standardi järgi on lineaarne:

Y' = (77/256)R + (150/256)G + (29/256)B

Cb = -(44/256)R - (87/256)G + (131/256)B + 128

Cr = (131/256)R - (110/256)G - (21/256)B + 128

### Alladiskreetimine

Tänu värvi retseptorite tihedusele inimsilmas, näevad inimesed Y' komponenti parema detailsusega, kui Cb ja Cr komponente. Selle teadmisega võivad kodeerijad pilte pakkida suurema tõhususega.
Järgmine samm on Cb ja Cr komponentide resolutsiooni vähendamine, mis tähendab et neid piksleid pannakse kokku vastavalt etteantud skeemile. 4:2:0 on näiteks horisontaalselt ja vertikaalselt kaks korda väiksemaks; see samm jäetakse *grayscale* (toonivalik mustast valgeni) piltide puhul vahele.

Seega alladiskreetimisel võetakse tavaliselt 2 × 2 suurune piksliplokk ja selle kromaatsuse komponentidest keskmine väärtus, mis teeb ploki (ja seega ka pildi) originaalsuurusest 1 / 2 väiksemaks: 1 / 3 + (2 / 3) * (1 / 4)..

### Plokkideks jagamine

Edasi tuleb iga kanal jagada 8 × 8 suurusteks plokkideks, mis pakitakse eraldi. Neid plokke kutsutakse andmeüksusteks (*dataunits*). See plokkideks jagamine on JPEG üks miinuseid, millest tuleneb piltide diskreetmoonutus ("ruudustumine"). Järgmine samm oleks tervet pilti ühe plokina võttes problemaatiline, sest suure hulga puhul ei ole andmed korreleerunud, ja koefitsiendid oleksid suured.

Kui pildi ridade või veergude arv ei ole 8-ga jaguv, täidetakse ääred äärmiste pikslite väärtustega või lihtsalt musta värviga.

### Diskreetne koosinusteisendus

Edasi iga komponendi 8 × 8 plokk viiakse üle sagedusvalda, kasutades normaliseeritud tüüp-2 DCT-d, mis on kasutusel 1974. aastast tänu N. Ahmed-ile ja T. Natarajan-ile. Enne kui DCT-d rakendatakse igale 8 × 8 plokile, viiakse selle väärtused positiivsest vahemikust, vahemikku, mis on keskmega nullis – [-128, 127] [0, 255] asemel. See on vajalik järgneva DCT sammu jaoks, ja on samaväärne kui lahutada DC koefitsiendist peale teisenduse tegemist 1024, mis võib olla parem lahendus mõne arhitektuuri juures, sest siis tehakse ainult üks lahutamine 64 asemel. Edasi tehakse igale 8 × 8 plokile kahedimensiooniline DCT. Ülemisse vasakusse nurka jääb DC koefitsient, millel on suurim ulatus, ja mis defineerib kogu ploki heleduse. Ülejäänud 63 koefitsienti on AC-koefitsiendid (nimed tulenevad elektrotehnikast). Järgneb kvantimisetapp, mille käigus koefitsiendid jagatakse eraldi arvudega.
\ G_{u,v} =
 \frac{1}{4}
 \alpha(u)
 \alpha(v)
 \sum_{x=0}^7
 \sum_{y=0}^7
 g_{x,y}
 \cos \left[\frac{(2x+1)u\pi}{16} \right]
 \cos \left[\frac{(2y+1)v\pi}{16} \right]


kus

* \ u horisontaalne ruumiline sagedus \ 0 \leq u .
* \ v vertikaalne ruumiline sagedus, täisarvude jaoks \ 0 \leq v .
* 
\alpha(u) =
\begin{cases}
 \frac{1}{\sqrt{2}}, & \mbox{if }u=0 \\
 1, & \mbox{otherwise}
\end{cases}
 normaliseeriv tegur
* \ g_{x,y} piksli väärtus koordinaatidel \ (x,y)
* \ G_{u,v} DCT koefitsient koordinaatidel \ (u,v).

### Kvantimine

Iga komponendi ploki iga arv jagatakse eraldi arvuga, mis võivad olla kasutaja antud 8 × 8 maatriksis, mida kutsutakse kvantimise maatriksiks. Ja saadud arvud ümardatakse täisarvuks.

B=
\left[
\begin{array}{rrrrrrrr}
-26 & -3 & -6 & 2 & 2 & -1 & 0 & 0 \\
0 & -2 & -4 & 1 & 1 & 0 & 0 & 0 \\
-3 & 1 & 5 & -1 & -1 & 0 & 0 & 0 \\
-3 & 1 & 2 & -1 & 0 & 0 & 0 & 0 \\
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 0
\end{array}
\right].


DC-koefitsient jääb vasakule üles, ja enamus arve on pärast kvantimist nullid (vt antud maatriksit). Seda juhul, kui kõrvutised pikslid on algsel pildil sarnased.

### Entroopia-kodeerimine

Entroopia-kodeerimine on kadudeta pakkimise meetod, mis põhineb RLE ja Huffmani algoritmidel. Selle skeemi järgi kodeeritakse kõik kvanditud koefitsiendid. JPEG-standard lubab kasutada ka aritmeetilist kodeerimist, mida tegelikult harva kasutatakse, sest seda kaitsevad erinevad patendid.

### Pakkimise suhtarv ja moonutused

Pakkimise tegurit võib muuta vastavalt vajadusele, olles rohkem või vähem agressiivne kvantimise faasis jagamiste kasutamise suhtes. Kümme ühele pakkimine on tavaliselt silmnähtavalt hea kvaliteediga ja originaalist eristamatu. 100:1-le on võimalik, kuid see paistab väga teistsugune kui originaal.
Tavaliselt väljenduvad need moonutused kontrastsete üleminekute piiril oleva mürana või plokkidest koosneva pildina. Analoogset moonutust MPEG videos kutsutakse moskiito müraks, sest need täpid meenutavad moskiito parve.
Neid moonutusi saab vähendada kasutades väiksemat pakkimise taset. Osad programmid lubavad kasutajal muuta kuivõrd iga individuaalne plokk pakitakse. Tugevamalt pakitakse pildi regioonid, kus on näha vähem moonutusi. Nii on võimalik manuaalselt JPEG-faili mahtu vähendada, ilma et kvaliteet kannataks. Isegi kui kvantimise maatriks on kõik ühed, kaotatakse infot täisarvuks muutmise protsessis. Seega kvantimine on alati kadudega.

### Dekodeerimine

Dekodeerimine pildi näitamiseks toimub eespoolmainitut vastupidises suunas tehes.

## Standardid

Siin on mõned standardid, mis on ISO/IEC JTC1 SC29 *Working Group 1* loodud:

*JPEG (kadudega ja kadudeta): ITU-T T.81, ISO/IEC 10918-1
*JPEG extensions: ITU-T T.84
*JPEG-LS (kadudega, täiustatud): ITU-T T.87, ISO/IEC 14495-1
*JBIG (kadudeta, bi-tasemel pildid, fax): ITU-T T.82, ISO/IEC 11544
*JBIG2 (bi-tasemel pildid): ITU-T T.88, ISO/IEC 14492
*JPEG 2000: ITU-T T.800, ISO/IEC 15444-1
*JPEG 2000 laiendused: ITU-T T.801
*JPEG XR (endine HD-foto) : ITU-T T.832, ISO/IEC 29199-2

## Vaata ka
* MJPEG
* Andmete pakkimine
* Rastergraafika

## Viited

## Välislingid
* JPEG Standard (JPEG ISO/IEC 10918-1 ITU-T Recommendation T.81) W3.org
* Official Joint Photographic Experts Group site
* JFIF File Format W3.org
* JPEG viewer in 250 lines of easy to understand python code
* Wotsit.org's entry JPEG-vorming
* Example images over the full range of quantization levels from 1 to 100 visengi.com
* Public domain JPEG compressor in a single C++ source file, along with a matching decompressor at code.google.com
* Example of .JPG file decoding
* Jpeg Decoder Open Source Code , Copyright (C) 1995–1997, Thomas G. Lane.
* JPEG compression and decompression on GPU.