Algorytm kompresji JPEG

JPEG jest algorytmem stratnej kompresji grafiki rastrowej. Może być używany do kompresji pojedynczych obrazów oraz ich sekwencji (wideo).

W standardzie JPEG kompresowany obraz jest dzielony na bloki pikseli o wymiarach 8 x 8. Każdy z nich jest dalej do pewnego momentu przetwarzany osobno. Na początku jest obliczana dwuwymiarowa transformata kosinusowa dla N = M = 8 opisana wzorem (wzór dla postaci dwuwymiarowej).

W praktyce przy pomocy DCT można rozłożyć dowolny obraz na sumę składowych, zależnych od częstotliwości funkcji bazowych - kosinusów. Składowe te odpowiadają za poziom szczegółowości obrazu. Ten etap nie odpowiada jeszcze za docelową kompresję i jest całkowicie odwracalny.

Poniższy rysunek obrazuje wszystkie funkcje bazowe transformacji DCT dla bloku 8 x 8 pikseli. Obraz (blok 8 x 8) zrekonstruowany z jego reprezentacji częstotliwościowej DCT będzie ważoną sumą wszystkich 64 obrazków.

Poniższy obrazek prezentuje porównanie obrazu oryginalnego z obrazem utworzonym z harmonicznych o niskich częstotliwościach. Jak widać większość energii obrazu zachowana jest właśnie w niskich składowych harmonicznych.
Kolejny obrazek prezentuje porównanie obrazu oryginalnego z obrazem utworzonym z harmonicznych o wysokich częstotliwościach. Jak widać energia zgromadzona w tych sygnałach odpowiada za szczegóły oraz szum obrazu.
Eksperyment wykonano w środowisku LabView. Klikając na odpowiednie kwadraty "maski" można aktywować lub deaktywować wpływ wybranych składowych harmonicznych na obraz wynikowy.
Po przeprowadzeniu transformaty algorytm dokonuje kwantyzacji współczynników z wykorzystaniem przyporządkowanych im wartości Q(k,l) z tablic kwantyzacji Q:
W wyniku tej operacji współczynniki transformaty o małych wartościach zostają wyzerowane. Warto pamiętać, że norma JPEG zaleca używanie kilku tablic kwantyzacji np. osobna tablica dla składowej luminancji i osobne dla tablic chrominancji.

Aby lepiej zobrazować koncentrację informacji w składnikach o niskich częstotliwościach warto przyjrzeć się animacji:

Na tym etapie w wyniku zastosowanych operacji obraz reprezentowany jest przez bloki macierzy, które zawierają współczynniki energetyczne określające "wagę" czyli zawartość składowej harmonicznej w danym bloku obrazu - już po procesie kompresji (wyzerowane składowe o wysokich częstostliwościach). W tym momencie można już przekształcić liczby na ciągi bitowe, oraz zakodować je entropijnym koderem Huffmana.

Należy pamiętać, że współczynniki DC (lewy górny narożnik) bloków 8x8 pikseli są najczęściej duże i skorelowane (z powodu składowej stałej obrazu), dlatego są one traktowane specjalnie: współczynnik DC pierwszego bloku oraz różnice tych współczynników pomiędzy kolejnymi blokami są zapisywane w kodzie VLI (Variable Length Integers). Pozostałe współczynniki tzw. AC, każdego bloku są kodowane oddzielnie. Ich wartości skanuje się wzdłuż linii ukośnych prostopadłych do głównej diagonali macierzy współczynników transformaty, zaczynając od lewego górnego rogu, czyli porządkuje od najniższych do najwyższych częstotliwości. Ponieważ w wyniku kwantyzacji większość współczynników AC jest wyzerowanych, uzyskuje się długie sekwencje zer, poprzedzielane nielicznymi wartościami niezerowymi.

Schemat JPEG zaprezentowano na poniższym rysunku.

Warto w tym miejscu wspomnieć o działaniu dekodera JPEG czyli o powrocie obrazu do postaci macierzy liczb. W dekoderze wszystkie operacje są przeprowadzane w odwrotnej kolejności, a rekwantyzacja jest przeprowadzana według wzoru:
gdzie: jest wynikiem dekodowania entropijnego.