Tajemnica JPEG
2. Jak działa JPEG?
Najpierw algorytm zapamiętuje wartości składowych barwnych. Nie analizuje jednak wartości odpowiadających systemom RGB, czy CMYK. Zamiast tego posługuje się przestrzenią kolorów podobną do YUV. YUV jest modelem koloru zawierającym informację o jasności (nazywanej luminacją lub jaskrawością, Y) oraz barwie koloru (chrominancji o składowych: nasycenie i odcień, U i V). Taka separacja na składowe (Y,U,V) wiąże się z tym, że jasność obrazu jest dla oka ważniejsza niż informacja o barwie. Tę cechę naszego postrzegania stara się wykorzystać algorytm podczas kompresji.
Warto wspomnieć, że na modelu YUW oparty jest także telewizyjny sygnał wideo.
Na tym etapie może wystąpić redukcja składowych U i V (tzw. downsampling). Z wyjściowej wartości stosunku składowych barwnych 4:4:4 zwykle do: 4:2:2 w poziomie oraz 4:2:0 w pionie i w poziomie obrazu. Ten krok redukuje objętość pliku o około 1/2 -- 1/3. Dla większości obrazów nie zauważymy żadnej różnicy w wyglądzie. Trzeba zauważyć, że podobna redukcja nie zachodzi dla odcieni szarości (grayscale). Dlatego grafika kolorowa kompresuje się lepiej niż czarno-biała.
Następnie obraz dzielony jest na bloki o rozmiarach 8x8 pikseli. W dalszej części JPEG posługuje się tzw. Dyskretną Transformatą Kosinusową (Discrete Cosine Transform, DCT). DCT jest rodzajem Transformaty Furiera. Składowe (Y,U,V) 8-pikselowego bloku przekonwertowane zostają do przestrzeni częstości. Powstaje macierz współczynników transformaty. Są to liczby, które reprezentują średnią wartość piksela w bloku i zmiany częstości poza blokiem. Dzięki temu można pozbyć się informacji występujących częściej bez naruszenia szczegółów.
Dalej, każdy z 64 elementów określających częstość, zostaje podzielony przez odpowiedni element tzw. macierzy kwantyzacji, a następnie iloraz ten przybliżany jest do wartości całkowitej. Tu następuje główny etap kompresji (nieodwracalnej). Taka kwantyzacja powoduje, że mało istotne wartości współczynników transformaty stają się zerami, a pozostałe zmniejszają się.
Otrzymane macierzowe współczynniki transformaty zostają pogrupowane na podstawie podobieństw i powtarzalności (np. zer) oraz zapisane w postaci ciągu cyfr. Do tego celu używa się kodu Huffmana, co również -- choć już znacznie mniej -- kompresuje dane, ale tym razem bezstratnie, w pełni odwracalnie. Zamiennie do algorytmu Huffmana może być stosowany tzw. arytmetyczny algorytm. Stosuje się go jednak rzadziej, ze względu na wolniejszy w stosunku to Huffmana proces kodowania i odkodowania danych. Może jednak kompresować 5-10 procent lepiej, niestety jest opatentowany. Najwyraźniej stosunek wielkości kompresji do ceny jest zbyt mały, przez co nie cieszy się ogólną popularnością.