JPEG

JPEG-standard

"JPEG", laiendatult 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 väljastati 1992 aastal ja võeti vastu septembris 1992 kui ITU-T soovitus T.81, ning hiljem 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-ndatel.

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 üle aeglase ühenduse alla laetakse. 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-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.

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:

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 "ruudutamine". Järgnev 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.

Kvantimine

Iga komponendi ploki iga arv jagatakse eraldi arvuga, mis võivad olla kasutaja poolt antud 8 × 8 maatriksis, mida kutsutakse kvantimise maatriksiks. Ja saadud arvud ümardatakse täisarvuks.
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. Sedasi 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.