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.


[s0000.jpg]
Tämä on alkuperäinen kuva, josta lähdetään liikkeelle.
[s0001.jpg]
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.


[s0020.jpg]
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.


[s0100.jpg]
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ä.
[s1000.jpg]
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