JPEG-kuvan laadun heikkeneminen uudelleenkompressiossa
Tässä dokumentissa esitellään pikaisesti, miten JPEG-kuvan laatu
putoaa uudelleen kompressoitaessa.
Sivun JPEG-kuvat on generoitu seuraavalla C-ohjelmalla, joka
pyörinee suoraan ainakin Unixeissa, jossa on asennettuna
pakkaajaohjelma cjpeg ja purkuohjelma djpeg:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i;
srandom(time(NULL));
for (i=0; i<1000; i++) {
char s[80];
sprintf(s, "djpeg < s%04d.jpg | cjpeg -Q %d > s%04d.jpg",
i, 85+(random()%10), i+1);
system(s);
printf("\r%s", s);
fflush(stdout);
}
printf("\n");
return EXIT_SUCCESS;
}
Ohjelma siis purkaa JPEG-kuvan ja pakkaa sen heti uudelleen
satunnaisella laatuasetuksella välillä 85-94 (0 on huonoin,
100 paras). Tämä vastaa sitä, että kuva pakataan hyvällä
laatuasetuksella kokonaan uudelleen eri ohjelmalla kuin millä
se viimeksi oli pakattu.
Alkuperäinen lähdekuva on pakattu laatuasetuksella 98.
Tämä on alkuperäinen kuva, josta lähdetään liikkeelle.
Kuva on nyt uudelleenpakattu yhden kerran. Koska käytetään varsin
korkeita laatuasetuksia, ei liene suurikaan yllätys, että eroa
alkuperäiseen on vaikea huomata.
Suurentamalla voidaan huomata, että kolmannessa pylväässä
vasemmalta olevan pysäkkimerkin punainen rengas on hieman haalistunut.
Tämä selittyy sillä, että uudelleenkompressio tehtiin pienemmällä
laatuasetuksella kuin alkuperäinen kuva.
Kymmenen kompression jälkeen havaitaan molempien lähimpien
pysäkkimerkkien renkaiden haalistuneen selkeästi. Lisäksi voimakkaan
punaiset ja siniset kohdat ovat muuttuneet suttuisemmiksi.
On huomattavaa, että paikoissa, joissa ei ole paljoa väriä, on
edelleenkin vaikea havaita mitään eroa alkuperäiseen kuvaan.
Värien nopeampi huononeminen on helppo ymmärtää, kun muistaa,
että normaaleissa JPEG-kuvissa värit koodataan vain neljänneksellä
kuvan mustavalko-osan tarkkuudesta.
Sadan kompression jälkeen alkaa eroa olla kaikkialla. Kuva on
täynnä yliterävöityjä reunoja, jotka ovat seurausta jatkuvasti
toistuneista DCT-taajuuskomponenttien uudelleenpyöristyksistä.
Tuhannen kompression jälkeen kuvassa alkaa pikkuhiljaa olemaan
enemmän häiriöitä kuin alkuperäistä kuvaa. Kuvasta saa tosin
edelleenkin selvän, mistä se esittää, ja jos sen pienentää
puoleen kokoon, niin kyllä se internet-laadusta kelpaisi.
Jos ohjelmaa muutetaan siten, että se käyttää
q-arvojen 85-94 sijaan arvoja 65-94, päästään jo sadalla sukupolvella
suunnilleen tämän kaltaiseen kuvaan.
Tässä esitettyjen kuvien lisäksi tein myös muutamia kokeita,
joissa uudelleenkompressoin kuvaa siten, että jokaisessa
kompressiovaiheessa oli sama laatuarvo. Pienillä laatuarvoilla
järjestelmä konvergoitui jo muutaman uudelleenkompression jälkeen
niin, että kuva ei enää muuttunut. Suuremmilla q-arvoilla tähän
meni enemmän aikaa, tai se ei onnistunut lainkaan. Järjestelmä
saattoi myös jäädä värähtelemään, eli se saattoi jäädä parinsadan
kuvan jälkeen tuottamaan esimerkiksi kahden tiedoston sarjaa.
Summa summarum:
Vaikka JPEG-kuvan uudelleenkompressointi heikentää kuvan laatua,
on heikennöksen määrää joissain yhteyksissä ehkä liioiteltu. Tämä
päättely pätee ainakin sellaisissa tapauksissa, joissa jokaisessa
kompressiossa on käytetty hyvää laatuasetusta eli on annettu
JPEG-kooderin tehdä iso tiedosto. Puristin kannattaa kuitenkin
edelleenkin pitää käsiteltävät välitiedostot jossain häviöttömässä
formaatissa, jos vain levytila antaa myöten.
- Henrik Herranen, 2004-10-06