programowanie asembler algorytmy

jpeg

Zasada działania kompresji JPEG

1. Wprowadzenie

JPEG (Joint Photographic Experts Group) to grupa ludzi zajmująca się opracowywaniem standardów kompresji obrazów. Słówko 'joint' jest dlatego, że grupa jest połączeniem zespołów ludzi z ISO i z CCIT. Na przełomie lat osiemdziesiątych i dziewięćdziesiątych opracowała ona standard, który dziś nazywamy po prostu JPEG. Standard ten określał sposób zarówno kompresji stratnej, jak i bezstratnej. My dzisiaj zajmiemy się tylko tym pierwszym, który jest najczęściej używany. Uwaga: Artykuł nie omawia szczegółów dotyczących budowy pliku JPEG, a tylko zasady jego działania. Po dalsze informacje możesz zajrzeć do strefy zrzutu.

2. Fakty, o które oparty jest standard.

Standard JPEG został zaprojektowany do kompresji przede wszystkim zdjęć. Polega on przede wszystkim na tym, że na większości powierzchni zdjęcia są wyłącznie przejścia tonalne np. niebieska bluza, ludzka twarz, mebel czy cokolwiek innego jest zazwyczaj jedengo koloru i ten kolor zajmuje stosunkowo dużą powierzchnię. Dużo gorzej radzi on sobie z ostrymi krawędziami np. szkicami, rysunkami z painta lub innego prymitywnego edytora, tekstem, wszelkiego rodzaju konturami, oraz wszelkiki innymi typami grafik, gdzie mamy do czynienia z dużą ilością krawędzi. Z tego względu standard JPEG spisuje się dużo gorzej od np. formatu PNG (bardzo dobry format bezstratnej kompresji grafiki - także na strony internetowe) w przypadku zrzutów ekranu z aplikacji biurowych, czy innych okienkowych (badrzo duże zniekształcenia tekstu - w takich przypadkach format PNG oferuje idealną jakość i najczęściej lepszą kompresję). Podsumowując - kompresja JPEG opiera się na wykorzystywaniu cech występujących w zdjęciach. Omówię je w następnych punktach.

3. Transformacja kolorów.

Jest to pierwszy krok kompresji JPEG. Polega on na przekształceniu składowych R (czerwony), G (zielony) i B (niebieski) z których składają się obrazki w formatach typu BMP czy TGA, na luminancję oraz chrominacnje: czerwoną i niebieską. Transformacja umożliwia wykorzystanie faktu, że oko ludzkie jest wielokrotnie bardziej czułe na luminancję (jasność) niż na chrominancję (odcień). Związane jest to z budową ludzkiego oka. Jak wiemy z lekcji biologii (nie? ;-) oko postrzega swiatło dwoma rodzajami komórek: do widzenia nocnego (jasność) i dziennego (odcień i kolor). Te pierwsze są wielokrotnie bardziej czułe. Możemy się o tym przekonać wychodząc gdzieś późną nocą. Widzimy wtedy jasność i kształty poszczególnych elementów, ale kolorów praktycznie nie odróżiamy. Luminancja i chraminancje mogą teraz być skompresowane w różnym stopniu polepszając współczynnik jakość/ rozmiar.

4. Próbkowanie.

Jest to kolejna metoda wykorzystująca niedoskonałe postrzeganie kolorów. Polega ona na skalowaniu (czyli zmniejszeniu rozmiaru) warstwy chrominancji w celu zwiększenia kompresji. W większości przypadków jest ona bardzo mało odczuwalna lecz w przypadku mocniej skompresowanych zdjęć możemy zauważych rozmazane krawędzie większych jednokolorowych obszarów (szczególnie czerwonych).

5. Nieciągłe przekształcenie kosinusowe (DCT).

Jest to kluczowy krok kompresji JPEG. Wykorzystuje on fakt, że obrazy są danymi analogowymi, tzn. mogą być przedstawione w postaci fali (aby zobaczyć jak to mniej więcej wygląda włączcie sobie oscyloskop w winampie i puścię jakąś muzykę - dźwięk też jest informacją analogową). Jest to fala złożona - nie jest równomierna, tzn. nie jest podobna do fali kosinusowej. Składa się z wielu takich fal. Fale te można oddzielić i zapisać oddzielnie (zobaczie analizator widma w wianmpie) ich natężenia. Powoduje to znaczny spadek ilości danych przy falach, które są zbliżone do fal kosinusowych (cykliczna ciągła zmiana natężenia np. przejścia tonalne) i zwięszenie ilości danych przy falach kompletnie niepodobnych do kosinusowych (np. podobnych do islamskich ornamentów ;-) , a tak na poważnie to np. w przypadku ostrych krawędzi). Powoduje to, żeby zapisać z dobrą jakością tekst należy zużyć znacznie więcej miejsca, aniżeli w przypadzku zdjęcia z wakacji (szczególnie wykonanym aparatem z biedronki ;-).

6. Kwantyzacja.

Jest to w zasadzie jedyny krok w którym następuje strata jakości. Polega ona na dzieleniu natężeń poszczególnych fal przez określone wartości. Strata jest dlatego, że dzielenie jest całkowite np: 12/5=2 i zazwyczaj nie da się idealnie odwrócić - w naszym przypadku 2*5=10. Dzielniki można dowolnie zmieniać dostosowując jakość i rozmiar pliku.

7. Kodowanie ciągów zer.

Po kwantyzacji wiele współczynników (natężeń fal) będzie równe zero. Zamiast zapisywać je oddzielnie zapisujemy znaczniki informujące ile w danym miejscu wystąpiło zer.

8. Kodowanie strumienia bitów.

Dane powstałe w wyniku poprzednich kroków zawierają dużo wpółczynników o niewielkich wartościach i małą ich ilość o dużych wartościach. W tym kroku dane ze stałej wielkości współczynnika (16 bit) zamieniane są na wartości o zmiennej długości bitowej, tzn. współczynniki o mniejszych wartościach zapisywane są w mniejszej ilości bitów.

9. Inne cechy standardu JPEG.

Standard JPEG został zaprojektowany tak, żeby obrazki szybko się otwierały. W tym celu obraz dzielony jest na wiele kawałków o wielkości 8x8 (w przypadku chrominancji zwykle 16x16), które są kompresowane oddzielnie. W przypadzku słabszej kompresji nie ma to wielkiego znaczenia, lecz w przypadku mocniejszej kompresji może objawiać się to powstawaniem tzw. makrobloków. Wygląda to tak jakby obraz był podzielony na wiele niespójnych kwadracików o wielkośi właśnie 8x8 (możecie zobaczyć pod tzw. lupą w jakiejś przeglądarce grafiki).

10. Uwagi końcowe.

Myślę, że przybliżyłem ci zasady działania kompresji JPEG. Nie omówiłem wszystkich kroków, gdyż jest to tylko dokument pobieżny. Jeżeli jesteś ciekaw szczegółów działania idź do strefy zrzutu.