JPEG i rozmiar fotografii
Fotografia cyfrowa przechowuje dla każdego piksela wartości składowych obrazu. Nieskompresowany obraz RGB o wysokiej rozdzielczości może w przykładowym przypadku zajmować 20 do 30 megabajtów, zależnie od rozdzielczości i głębi próbkowania. Rozmiar rośnie wraz z liczbą pikseli, liczbą kanałów oraz liczbą bitów na próbkę. Album z kilkuset zdjęciami zajmowałby wtedy gigabajty, a przesłanie pojedynczego pliku pocztą elektroniczną mogłoby długo trwać. Kompresja ma więc znaczenie zarówno dla pamięci masowej, jak i dla przepływności łącza.
JPEG jest szeroko używanym standardem kodowania obrazów o ciągłych tonach, takich jak fotografie. zwykle wykorzystuje w przypadku obrazów fotograficznych. Dla fotografii kolorowych często uzyskuje współczynnik około 10:1 do 20:1 przy mało widocznych zmianach, a większe współczynniki zwiększają degradację. Mechanizm wykorzystuje różną wrażliwość wzroku na jasność i kolor. Standard definiuje sposób zapisu składowych, transformacji oraz kodowania, natomiast konkretne ustawienia jakości i metadane zależą od programu zapisującego plik.
Etapy kodowania JPEG
Kompresja JPEG jest wieloetapowym procesem, w którym dane obrazu są przekształcane, próbkowane i kodowane. Kolejne etapy wpływają na rozmiar pliku oraz jakość obrazu. Zakodowany strumień zawiera również znaczniki, informacje o komponentach i tabele potrzebne dekoderowi do interpretacji współczynników.
Krok 1: Transformacja przestrzeni kolorów
Większość obrazów cyfrowych jest przechwytywana i początkowo przechowywana w przestrzeni kolorów RGB (Czerwony, Zielony, Niebieski), gdzie kolor każdego piksela jest definiowany przez intensywność tych trzech podstawowych kolorów. Chociaż jest to intuicyjne dla wyświetlaczy, nie jest idealne dla kompresji. Pierwszym krokiem w procesie JPEG jest konwersja obrazu z RGB na inną przestrzeń kolorów, zazwyczaj YCbCr.
Przestrzeń YCbCr dzieli informacje o obrazie na trzy składniki:
- Y (Luminancja): Ten składnik reprezentuje informacje o jasności lub skali szarości obrazu. To jest to, co byś zobaczył, patrząc na czarno-białą wersję fotografii.
- Cb (Chrominancja-niebieska): Ten składnik opisuje różnicę składowej niebieskiej względem luminancji.
- Cr (Chrominancja-czerwona): Ten składnik opisuje różnicę składowej czerwonej względem luminancji.
Rozdzielenie jest użyteczne, ponieważ wzrok jest bardziej wrażliwy na szczegóły jasności (luminancji) niż na szczegóły koloru (chrominancji). JPEG może przetwarzać oba rodzaje składowych z różną dokładnością. W plikach zgodnych z JFIF stosuje się przestrzeń YCbCr oraz określa próbki poszczególnych komponentów w nagłówkach i strukturze ramki. Współczynniki próbkowania zapisuje się osobno dla każdego komponentu, aby dekoder mógł odtworzyć poszczególne płaszczyzny.
Krok 2: Podpróbkowanie chrominancji (downsampling)
Po oddzieleniu koloru od jasności algorytm może zmniejszyć rozdzielczość kanałów Cb i Cr. oznacza zapis próbek koloru współdzielonych przez małe grupy pikseli zamiast osobnej próbki dla każdego piksela.
Jest to często opisywane za pomocą trójczłonowego stosunku, takiego jak , , lub . Dla bloku 4 poziomych pikseli:
- : Brak podpróbkowania. Każdy z 4 pikseli ma swoją odrębną wartość Y, Cb i Cr. Zachowuje to maksymalną jakość koloru.
- : Podpróbkowanie poziome. Każda para dwóch poziomych pikseli dzieli tę samą wartość Cb i Cr, podczas gdy każdy ma swoją własną wartość Y. Rozdzielczość koloru jest zmniejszona o połowę w poziomie.
- : Jest to często spotykany schemat w wideo konsumenckim i plikach JPEG. Pozioma i pionowa rozdzielczość koloru jest zmniejszona o połowę. Blok pikseli dzieli jedną wartość Cb i Cr.
Ten krok zmniejsza liczbę próbek przed dalszym kodowaniem. Oznaczenie opisuje względne częstotliwości próbkowania komponentów. Nie jest bezpośrednim współczynnikiem rozmiaru pliku. Widoczność zmiany zależy od obrazu, schematu próbkowania i parametrów kodera.
Krok 3: Dyskretna transformata kosinusowa (DCT)
Po transformacji kolorów i podpróbkowaniu każdy kanał (Y, Cb i Cr) jest dzielony na bloki pikseli . Każdy blok jest przetwarzany przez .
Zamiast 64 wartości pikseli DCT daje 64 współczynniki częstotliwości. Współczynniki opisują udział fal kosinusowych o różnych częstotliwościach. Wynikiem jest kolejny blok , którego wartości opisują częstotliwości:
- Współczynnik DC: Wartość w lewym górnym rogu bloku () to współczynnik DC. Odpowiada średniej wartości 64 próbek po przeskalowaniu przyjętym w definicji DCT, czyli ogólnemu poziomowi bloku.
- Współczynniki AC: Pozostałe 63 współczynniki to współczynniki AC (prądu zmiennego). Reprezentują one szczegóły, tekstury i krawędzie w bloku. Współczynniki blisko lewego górnego rogu reprezentują zmiany o niskiej częstotliwości (łagodne gradienty), podczas gdy współczynniki w prawym dolnym rogu reprezentują zmiany o wysokiej częstotliwości (drobne szczegóły i ostre krawędzie).
W typowym bloku z fotografii duża część energii jest skupiona we współczynniku DC i kilku niskoczęstotliwościowych współczynnikach AC. Współczynniki wysokoczęstotliwościowe często mają małe wartości, co ułatwia kwantyzację i kodowanie. Sama transformacja DCT jest odwracalna w modelu matematycznym. W implementacji mogą wystąpić niewielkie błędy zaokrągleń, a zasadniczą utratę informacji wprowadza kolejny etap.
Krok 4: Kwantyzacja, etap stratny
W kwantyzacji informacje są trwale upraszczane. Każdy z 64 współczynników bloku DCT jest dzielony przez odpowiednią wartość z 64-elementowej , a wynik jest zaokrąglany do liczby całkowitej.
Ta tablica wynika z zasad psychowizualnych i charakterystyki obrazu.
- Wartość w lewym górnym rogu tablicy kwantyzacji (dla współczynnika DC) jest zazwyczaj mała, zachowując kluczowe informacje o średnim kolorze z dużą precyzją.
- Wartości stają się stopniowo większe dla współczynników o wyższych częstotliwościach. Oznacza to, że drobne szczegóły (współczynniki AC o wysokiej częstotliwości) są dzielone przez duże liczby, co powoduje, że ich wynikowe wartości są zaokrąglane do zera lub bardzo małych liczb całkowitych.
Parametr "jakości" w popularnych implementacjach, takich jak IJG lub libjpeg, bywa podawany w skali od 1 do 100 i skaluje tablicę kwantyzacji. Wysoka jakość, na przykład 95, używa mniejszych wartości, zachowuje więcej szczegółów i tworzy większy plik. Niska jakość, na przykład 20, używa większych wartości, upraszcza więcej szczegółów i tworzy mniejszy plik. Skala 1 do 100 jest konwencją kodera. Nie stanowi części samego standardu JPEG. Dla współczynnika i elementu tabeli koder zapisuje w uproszczeniu . Po tym kroku wiele z 63 współczynników AC może przyjąć zero.
Krok 5: Kodowanie entropijne
Po kwantyzacji blok współczynników zawiera wiele zer. Ostatnim krokiem jest uporządkowanie i zakodowanie danych metodami bezstratnymi.
- Skanowanie zygzakowate: 64 skwantyzowane współczynniki są odczytywane w porządku zygzakowatym, zaczynając od współczynnika DC w lewym górnym rogu i przesuwając się w kierunku prawego dolnego rogu. Celem tego skanowania jest zgrupowanie wielu zerowych współczynników wysokoczęstotliwościowych w długie, kolejne serie.
- Kodowanie długości serii (RLE): Długie serie zer są następnie efektywnie kodowane. Zamiast pisać "0, 0, 0, 0, 0", RLE zapisuje kod oznaczający "pięć zer".
- Kodowanie Huffmana: W bazowym procesie wynikowy strumień kodów RLE i niezerowych współczynników AC, wraz z osobno kodowanymi współczynnikami DC, jest kompresowany kodami Huffmana. Współczynniki DC są zwykle kodowane różnicowo względem poprzedniego bloku, a znacznik końca bloku opisuje pozostałe zera. Standard JPEG definiuje także procesy z kodowaniem arytmetycznym. Kody krótsze dla częstszych wartości pakują dane do strumienia bitów.
Dekodowanie JPEG
Aby wyświetlić obraz JPEG, dekoder wykonuje opisane etapy w odwrotnej kolejności. Odczytuje strumień bitów i:
- Dekodowanie entropijne: Dekompresuje kody Huffmana i odtwarza dane zakodowane RLE, aby uzyskać z powrotem zygzakowatą sekwencję skwantyzowanych współczynników DCT.
- Dekwantyzacja: Porządkuje sekwencję z powrotem w blok i mnoży każdy współczynnik przez odpowiednią wartość z tej samej tablicy kwantyzacji użytej podczas kodowania. Przywraca to przybliżoną wielkość współczynników DCT, ale informacja utracona podczas zaokrąglania jest stracona na zawsze.
- Odwrotna dyskretna transformata kosinusowa (IDCT): Stosuje odwrotną DCT do zdekwantyzowanego bloku współczynników, przekształcając dane z domeny częstotliwości z powrotem do domeny przestrzennej, co daje blok wartości pikseli .
- Rekonstrukcja: Składa wszystkie bloki , powiększa kanały kolorów, jeśli użyto podpróbkowania chrominancji, i na koniec konwertuje obraz z YCbCr z powrotem na RGB, aby można go było wyświetlić na ekranie.
Wynikiem jest przybliżenie obrazu źródłowego zapisane w krótszym strumieniu danych. Dekoder korzysta z informacji o komponentach i tabelach zapisanych w strumieniu, a następnie odtwarza próbki obrazu. Ogranicza też wartości próbek do zakresu wyjściowego albo konwertuje je do reprezentacji wymaganej przez obraz. Stopień podobieństwa zależy od próbkowania i kwantyzacji.