• Nie Znaleziono Wyników

Metody kompresji grafiki komputerowej

N/A
N/A
Protected

Academic year: 2021

Share "Metody kompresji grafiki komputerowej"

Copied!
16
0
0

Pełen tekst

(1)

Katedra Systemów Multimedialnych

Laboratorium

Technologie

PulWimHdiDlnH

Ćwiczenie 5

Metody kompresji grafiki komputerowej

Opracował: dr inż. Grzegorz Szwoch

1. Wprowadzenie

Grafiką rastrową lub mapami bitowymi (bitmapami, ang. bitmap) nazywamy obrazy reprezentowane w komputerze za pomocą liczb opisujących barwę każdego z pikseli obrazu. Inny rodzaj grafiki to grafika wektorowa, w której obraz jest opisywany matematycznie (np. dla linii prostej podaje się współrzędne początku i końca linii). Mapy bitowe wymagają znacznej ilości danych do zapisania ich zawartości w pamięci lub w pliku. Im więcej pikseli w obrazie (im większy rozmiar obrazu), tym większy rozmiar mapy bitowej. Każdy piksel jest opisywany przez określoną liczbę bitów. W przypadku obrazów w skali szarości każdy piksel może być, w zależności od formatu, reprezentowany przez 1, 4, 8 lub więcej bitów. W przypadku obrazu kolorowego należy zapisać osobno dane dla trzech kanałów barwnych RGB – dla barwy czerwonej, zielonej i niebieskiej. Rozdzielczość bitowa 24 bity na piksel (24 bpp) oznacza więc, że na każdy kanał RGB przeznaczamy 8 pikseli. Zatem np. obraz kolorowy uzyskany z przetwornika aparatu cyfrowego o rozdzielczości 10 megapikseli, a więc o rozmiarach 3648 na 2736 pikseli, przy rozdzielczości 8 bitów na piksel dla jednego kanału, wymaga 3648 × 2736 × 3 = 28,5 MB (w praktyce, ze względu na sposób zapisu map bitowych, rozmiar ten jest rzędu 29,5 MB). Nawet jeżeli posługujemy się znacznie mniejszymi plikami, chcąc zapisać większą liczbę obrazów na nośniku lub umieścić je na stronie internetowej musimy zmniejszyć rozmiar pliku. Z pomocą przychodzi nam kompresja danych. Kompresja bezstratna (PNG) pozwala zmniejszyć rozmiar pliku do ok. 6,2 MB, a kompresja stratna – do ok. 1,1 MB (JPG, wsp. jakości 90%) [1].

Kompresja obrazu rastrowego polega na zmniejszeniu rozmiaru pliku poprzez „upakowanie” danych, przy czym obraz wczytywany do pamięci komputera musi być w każdym przypadku poddany dekompresji (komputer przechowuje w pamięci zawsze wersję nieskompresowaną). Kompresja pozwala jednak zmniejszyć ilość danych zapisywanych na nośniku lub przesyłanych przez sieć. Algorytmy kompresji map bitowych można podzielić na bezstratne i stratne. W przypadku kompresji bezstratnej dane po dekompresji są identyczne z danymi oryginalnymi. Kompresja bezstratna wykorzystuje redundancję (nadmiarowość) danych, czyli to że te same dane można zapisać w bardziej zwięzły sposób. Np. jeżeli mamy czarną, poziomą linię na białym tle, zamiast zapisywać barwę każdego piksela, można napisać „biały razy 50, czarny razy 10, biały razy 50”. Grafika tworzona w komputerze charakteryzuje się zwykle wysoką redundancją, podczas gdy obrazy uzyskiwane z przetwornika aparatu fotograficznego mają bardzo małą redundancję.

(2)

Istnieją trzy główne metody kompresji bezstratnej. Najprostsza to metoda run length encoding (RLE), w której zastępuje się wielokrotne, kolejne wystąpienia tej samej wartości formą „wartość i liczba wystąpień” (np. „50 zer, 10 jedynek, 50 zer, ...). Kompresja słownikowa zastępuje dłuższe ciągi danych krótszymi kodami (np. algorytm LZW). Trzecia grupa to metody wykorzystujące entropię danych (np. kodowanie Huffmana), zastępują one ciągi danych tzw. kodami prefiksowymi, na podstawie analizy prawdopodobieństwa ich występowania w kodowanych danych (częściej występujące słowo to krótszy kod).

Wadą kompresji bezstratnej jest to, że maksymalny stopień kompresji możliwy do uzyskania jest dość ograniczony. Aby uzyskać większy stopień kompresji należy sięgnąć po metody stratne. Kompresja stratna usuwa bezpowrotnie część informacji, tak że wynik dekompresji nie jest już identyczny z oryginałem. Jeżeli jednak wyznaczy się te dane, które są najmniej istotne dla zachowania jakości obrazu, można te dane usunąć, zwiększając stopień kompresji danych. Przykłady stratnej kompresji obrazów bitowych to algorytmy JPEG i JPEG2000.

Mnogość formatów zapisu i algorytmów kompresji sprawia, że wiele osób nie wie który format zastosować w określonym przypadku. Obserwujemy więc (np. na stronach internetowych) niepoprawne stosowanie formatów, np. konsekwentne stosowanie kompresji JPEG „do wszystkiego”, podczas gdy dla niektórych obrazów kompresja bezstratna byłaby lepsza. Niniejsze ćwiczenie składa się z dwóch części. Pierwsza część zapoznaje studentów z najpopularniejszymi formatami map bitowych i algorytmami kompresji stosowanymi na co dzień. Badany będzie wynik kompresji dla różnych algorytmów i ich parametrów, dla różnych typów obrazu. Druga część ćwiczenia zapoznaje studentów bardziej szczegółowo z działaniem algorytmu JPEG, najpopularniejszego algorytmu stratnej kompresji obrazu rastrowego. Po wykonaniu ćwiczenia student powinien wiedzieć jaki format zapisu i kompresji powinien zastosować w danym przypadku i jak dobrać parametry kompresji.

2. Formaty zapisu i algorytmy kompresji

Format zapisu (zwykle utożsamiany z rozszerzeniem pliku) określa sposób zapisu danych:

nagłówka (informacje o rozmiarze obrazu, liczbie kanałów barwnych, algorytmie kompresji, itp.), metadanych (opcjonalnych „danych o danych”, np. znaczniki EXIF w zdjęciu z aparatu fotograficznego) oraz samych danych opisujących zawartość mapy bitowej. Algorytm kompresji określa metodę zmniejszania objętości danych [2]. Poniżej opisano najczęściej stosowane formaty zapisu grafiki rastrowej i krótko omówiono stosowany w nich algorytm kompresji.

Windows Bitmap (BMP)

Format BMP stosuje zapis map bitowych wprost, bez kompresji. Jest to format stosowany wewnętrznie przez system Microsoft Windows i w zasadzie nie powinien być stosowany do innych celów niż wykorzystanie w programach pisanych dla tego systemu. Format przechowywania danych jest przez Microsoft określany jako mapa bitowa niezależna od urządzenia (Device Independent Bitmap, DIB), ze względów historycznych obraz jest zapisywany „do góry nogami” (od najniższej linii do najwyższej). Istnieje odmiana formatu BMP wykorzystująca kompresję RLE, ale nie jest ona standardowa i wiele programów nie obsługuje tego typu. Rozmiar obrazów BMP można zmniejszyć kompresując je „ręcznie” za pomocą algorytmów takich jak ZIP lub RAR.

(3)

Tagged Image File Format (TIFF)

Format TIFF został zaprojektowany w taki sposób, aby można było w jednym pliku zapisać obraz lub wiele obrazów oraz powiązane z nimi metadane („tagi”). Jest to format obsługiwany przez niemal wszystkie programy graficzne we wszystkich systemach operacyjnych. Dane są typowo zapisywane na jeden z dwóch sposobów: bez kompresji albo z kompresją LZW – jest to bezstratna kompresja słownikowa. Możliwe są również inne algorytmy kompresji (np. ZIP, a nawet JPEG), ale taki format zapisu nie jest kompatybilny z niektórymi programami. Format TIFF jest szeroko stosowany do zapisywania skanowanych dokumentów, w medycynie do zapisu wyników badań obrazowych i w niektórych aparatach fotograficznych do zapisu danych z przetwornika. Format TIFF z kompresją LZW jest polecany do zapisu obrazów bitowych na etapie pośrednim, jeżeli obraz będzie dalej przetwarzany (np. skanujemy dokument i przenosimy go na inny komputer w celu dalszej obróbki).

Graphics Interchange Format (GIF)

Format GIF (wymawiany jako [gif] lub [dżif]) był szeroko stosowany w początkach Internetu do umieszczania grafiki na stronach WWW i nadal jest do tego celu używany. Kompresja w standardzie GIF wykorzystuje algorytm LZW i jest w zasadzie bezstratna, ale pod pewnymi warunkami [3]. Format GIF wykorzystuje paletę kolorów: paleta zawiera maksymalnie 256 indeksów opisujących kolory (zatem 24-bitowy opis koloru zastępujemy 8-bitowym indeksem). Problem powstaje gdy obraz zawiera więcej niż 256 kolorów. W takim przypadku w palecie zapisywane są najczęściej występujące kolory, a pozostałe są zastępowane najbliższym kolorem albo jest stosowany dithering (szachownica z dwóch kolorów), dający wrażenie zmiany odcienia. W obu przypadkach kompresja przestaje być bezstratna. W czasach wczesnego Internetu karty graficzne i tak nie obsługiwały większej liczby kolorów, a pierwsze wersje przeglądarek internetowych obsługiwały tylko paletę ustalonych 216 kolorów, zatem ograniczenie to nie było szczególnie uciążliwe. Obecnie format GIF wciąż nadaje się do kompresji prostej grafiki komputerowej (schematy, „zdjęcia” tekstu, elementy schematu strony internetowej), nie nadaje się za to zupełnie do kompresji obrazów fotograficznych (mają one znacznie więcej niż 256 odcieni kolorów).

Algorytm kompresji stosowany w formacie GIF nosi nazwę od nazwisk jej twórców: LZW (Lempel-Ziv-Welch). Jest to kompresja słownikowa. Obraz jest skanowany linia po linii, porównywane są kolejne pary wartości pikseli. Jeżeli dla danej pary nie istnieje jeszcze kod w słowniku, jest on do niego dodawany. Jeżeli para zostanie znaleziona w słowniku, jest ona zastępowana kodem ze słownika i porównywana z kolejną wartością piksela. Te operacje są wykonywane cyklicznie, aż do przetworzenia całego pliku. W ten sposób długie, powtarzające się ciągi danych są zastępowane krótkimi kodami. Słownik może zawierać 4096 kodów, z czego pierwsze 256 jest używane do zapisywania wartości kolorów (według palety), pozostałe – do zapisywania kodów. Uzyskane w wyniku kompresji kody są zapisywane w sposób oszczędny, przy użyciu słów o zmiennej długości. Nie ma potrzeby zapisywania słownika w pliku skompresowanym. W procesie dekompresji analizowany jest zakodowany plik, słownik jest odbudowywany i kody są zastępowane wartościami pikseli. Dokładniejszy opis kompresji i dekompresji algorytmem LZW zająłby zbyt wiele miejsca w instrukcji, szczegółowe opisy z przykładami można znaleźć w Internecie [3] i w literaturze [2].

Format GIF posiada dodatkowo trzy użyteczne cechy. Dowolny kolor w palecie może być oznaczony jako przezroczysty (zwykle używa się do tego celu koloru różowego). Kolor ten jest usuwany przy wyświetlaniu pliku, co pozwala wtapiać obraz w tło. Ponadto można w jednym pliku GIF zapisać kilka obrazów i zdefiniować prędkość ich kolejnego odtwarzania, przez co

(4)

powstaje animacja. Klatki animacji są zapisywane w sposób oszczędny – pomijane są niezmienne fragmenty obrazu. Był to popularny sposób tworzenia animacji na stronach internetowych, obecnie wyparty przez technologię Flash. Trzecia cecha to możliwość zapisu pliku z przeplotem (interlaced), co pozwala oglądać częściowo pobrane i zdekodowane obrazy (w miarę pobierania pliku pokazywanych jest coraz więcej szczegółów). Cecha ta nie ma obecnie większego znaczenia.

Algorytm kompresji LZW stosowany w formacie GIF był objęty ochroną patentową, wskutek czego firma Unisys zaczęła żądać opłat licencyjnych od twórców oprogramowania zapisujących i odczytujących pliki GIF. Patenty wygasły w latach 2003-2006, obecnie można swobodnie wykorzystywać ten algorytm we własnych programach.

Portable Network Graphics (PNG)

Konieczność wnoszenia opłat za korzystanie z formatu GIF uderzyła w twórców darmowego oprogramowania, z tego powodu opracowano nowy format, nazwany PNG (wymawiane jako [ping]) [4]. Format PNG obsługuje obrazy w skali szarości, obrazy używające palety 256 kolorów (tak jak GIF) oraz obrazy 24-bitowe RGB (pozwala więc kompresować obrazy BMP). Kompresja jest w pełni bezstratna. W pierwszym etapie stosowana jest predykcja danych: przewiduje się wartość danego piksela na podstawie pewnej liczby poprzednich pikseli. Metoda predykcji jest dobierana adaptacyjnie, w zależności od charakteru obrazu (algorytm sam decyduje ile wartości pikseli najlepiej użyć do predykcji). Następnie obliczana jest różnica między przewidywaną a rzeczywistą wartością piksela (błąd predykcji), a ciąg obliczonych w ten sposób różnic jest poddawany kompresji używając algorytmu Deflate, który jest odmianą kompresji słownikowej (używają go darmowe kompresory, np. gzip czy biblioteka zlib). Ponieważ błędy predykcji są zwykle małe, więc do ich zapisania potrzeba mniejszej liczby bitów, a ponadto wartości te często się powtarzają, zatem łatwiej jest poddać je kompresji. Kompresja Deflate wykorzystuje algorytm słownikowy LZ77, zastępujący powtarzające się ciągi danych indeksami ich poprzedniego wystąpienia (mniej skuteczna, ale nie opatentowana odmiana metody LZW) oraz dodatkowo kodowanie Huffmana (szerzej omówione w punkcie dotyczącym kompresji JPEG). Dekompresja polega na wykonaniu odwrotnego ciągu operacji: odbudowania strumienia błędów predykcji (algorytm Inflate) oraz obliczeniu wartości pikseli poprzez dodawanie i odejmowanie błędów predykcji.

Format PNG obsługuje przezroczystość, w trybie z paletą koloru jest ona taka jak w formacie GIF, natomiast w trybie RGB możliwe jest dodanie kanału alfa, który pozwala określić jeden z 256 poziomów przezroczystości dla każdego piksela (kosztem zwiększenia rozmiaru pliku). Nie ma możliwości tworzenia animacji w formacie PNG (powstały do tego celu specjalne formaty MNG i APNG, ale się nie upowszechniły wobec wprowadzenia technologii Flash). Format PNG jest szeroko stosowany w systemach linuksowych. W Internecie wciąż format PNG nie wyparł GIF, częściowo z powodu przyzwyczajeń twórców stron, częściowo dlatego że możliwości formatu GIF są często wystarczające. Ponadto niektóre przeglądarki internetowe przez pewien czas nie obsługiwały poprawnie niektórych cech formatu PNG (problemy sprawiała zwłaszcza obsługa przezroczystości). Do kompresji grafiki komputerowej (schematy, zrzuty ekranu) format PNG nadaje się bardzo dobrze, w przypadku obrazów fotograficznych stopień kompresji jest zwykle zbyt mały.

(5)

Format JPEG

Skrót JPEG (wymawiany [dżejpeg]) pochodzi od nazwy organizacji Joint Photographic Experts Group, ale powszechnie jest rozumiany jako nazwa algorytmu kompresji oraz formatu zapisu map bitowych [5]. Szczegółowy opis algorytmu kompresji JPEG zawarto w kolejnym rozdziale instrukcji. Algorytm kompresji JPEG jest stratny (istnieje format JPEG-loseless, ale używa on innego algorytmu kompresji, opartego na predykcji).

Format JPEG definiuje sposób zapisu w pliku samych skompresowanych danych, informacji dotyczących obrazu i parametrów kompresji (tzw. markery), a także metadanych. Do pliku JPEG może być również dołączony profil kolorów (ważne dla osób obrabiających zdjęcia cyfrowe). Metadane mogą zawierać miniaturki obrazu (thumbnail), znaczniki (np. EXIF – informacje o parametrach zdjęcia, dodawane przez aparat fotograficzny), komentarze tekstowe, itp. Metadane zwiększają rozmiar plików, zatem zaleca się ich usuwanie jeżeli nie są potrzebne (np. przy umieszczaniu na stronach internetowych).

Zastosowanie kompresji stratnej wiąże się z faktem, że po dekompresji wynik różni się od oryginału – część danych została jest usunięta, a ponadto mogą pojawić się zniekształcenia (artefakty) kompresji. Zniekształcenia te kumulują się przy kolejnych kompresjach, dlatego nie powinno się stosować JPEG jako formatu pośredniego, a tylko jako format docelowy. Pewne operacje mogą być wykonywane bezstratnie: obrót o 90 stopni, odbicia oraz przycinanie obrazu (wynikowa szerokość i wysokość obrazu musi być wielokrotnością liczby 16). Ponadto kompresja JPEG oferuje tryb progresywny (progressive), w którym obraz jest wyświetlany na bieżąco przy pobieraniu i dekodowaniu, ukazując coraz więcej szczegółów (powoduje to jednak zwiększenie rozmiaru pliku).

Kompresja JPEG najlepiej nadaje się do obrazów fotograficznych, charakteryzujących się płynnymi przejściami pomiędzy kolorami. Dla tego typu map bitowych zapewnia znacznie lepszy stopień kompresji niż metody bezstratne. W przypadku typowej grafiki komputerowej (wyraźne krawędzie, gwałtowne zmiany kolorów) kompresja JPEG może spowodować powstanie zniekształceń, które w tego typu obrazach są szczególnie widoczne.

Format JPEG2000

Format JPEG2000 został zaprojektowany jako następca formatu JPEG. Wykorzystuje on transformację falkową (wavelet). W wyniku kompresji powstaje struktura hierarchiczna nazywana piramidą: kolejne piętra piramidy reprezentują bardziej szczegółowe informacje o obrazie. Współczynniki uzyskane na podstawie analizy falkowej są poddawane kwantyzacji i kodowaniu. Główną zaletą formatu JPEG2000 jest elastyczność procesu dekodowania: możliwe jest pomijanie zbyt szczegółowych informacji i przez to dostosowanie jakości obrazu do potrzeb. Skuteczność kompresji jest podobna jak w JPEG, natomiast sam proces kodowania i dekodowania jest znacznie bardziej złożony. Ponadto algorytm JPEG 2000 może wprowadzać do obrazu zniekształcenia w postaci obwódek wokół konturów.

Jak dotąd format JPEG2000 nie zdobył popularności, jego zalety nie są na tyle silne aby zastąpić upowszechniony format JPEG. Kompresja falkowa obrazów i format JPEG2000 będą tematem odrębnego ćwiczenia w ramach jednego z przedmiotów prowadzonych w Katedrze Systemów Multimedialnych.

(6)

3. Algorytm kompresji JPEG

W rozdziale tym zostanie przedstawiony dość ogólny opis algorytmu kompresji w standardzie JPEG. Bardziej szczegółowe omówienie tematu można znaleźć w Internecie [5,8] i w literaturze [2].

Konwersja przestrzeni barwnej

Kolorowe mapy bitowe są zwykle zapisywane w trybie RGB (dla każdego piksela wartość barwy: czerwonej, zielonej i niebieskiej). Taki sposób zapisu jest wygodny do wyświetlania na ekranie, ale utrudnia dokonywanie operacji na obrazie. Z tego względu w algorytmie JPEG wykonuje się konwersję do przestrzeni YCbCr. Kanał Y opisuje luminancję – jasność piksela, kanały Cb i Cr – odpowiednio chrominancję (barwę) koloru niebieskiego i czerwonego. Nazwy te nie odpowiadają ścisłym definicjom luminancji i chrominancji, dlatego też czasami używa się innych terminów: luma i chroma. Kanały chrominancji są komplementarne, nie ma potrzeby zapisywania chrominancji Cg dla koloru zielonego (Cb + Cr + Cg = 1). Operacja konwersji jest w zasadzie bezstratna, można powrócić do przestrzeni RGB bez zmian w obrazie (mogą jednak wystąpić błędy z powodu zaokrągleń liczb do wartości całkowitych).

Podpróbkowanie chrominancji

W tym etapie kompresji wykorzystywany jest fakt że ludzki wzrok jest znacznie mniej czuły na niewielkie zmiany barwy niż na podobne zmiany jasności. Z tego powodu do opisania chrominancji obrazu wystarczy mniej danych – dokonuje się podpróbkowania (subsampling) kanałów chrominancji. Stopień podpróbkowania jest opisany symbolem w postaci J:A:b, w kompresji JPEG stosuje się najczęściej następujące typy podpróbkowania:

 4:4:4 – brak podpróbkowania, wszystkie wartości chrominancji są używane w dalszych etapach kodowania;

 4:2:2 – dwukrotne zmniejszenie liczby próbek chrominancji w wymiarze poziomym;  4:2:0 – dwukrotne zmniejszenie liczby próbek chrominancji w wymiarze poziomym

oraz dwukrotne zmniejszenie w wymiarze pionowym.

Znaczenie symboli J:a:b nie jest oczywiste (nie odnoszą się one do kanałów YCbCr), można je opisać następująco. Dzielimy obraz na bloki 2 × J pikseli (w naszym przypadku J = 4, a więc bloki mają rozmiar 2 rzędy na 4 kolumny). Druga liczba (a) określa ile próbek chrominancji jest branych z pierwszego rzędu, trzecia (b) – analogicznie z drugiego rzędu (rys. 1) [6]. Oba kanały chrominancji są podpróbkowane w jednakowy sposób. Zastosowanie podpróbkowania 4:2:2 lub 4:2:0 wprowadza straty w kompresji.

(7)

Proste programy graficzne stosują zwykle podpróbkowanie 4:2:2 lub 4:2:0. Bardziej zaawansowane programy graficzne (np. Photoshop) pozwalają wybrać sposób podpróbkowania. Aparaty fotograficzne najczęściej stosują podpróbkowanie 4:2:2.

Podział na bloki

W kolejnym kroku kanały luminancji i (podpróbkowanej) chrominancji są dzielone na bloki (MCU – minimum compression unit) o rozmiarze 8 na 8 pikseli. Jeżeli wymiar obrazu nie jest wielokrotnością liczby 8, uzupełnia się obraz powielając krawędź obrazu lub dopisując zera (oba sposoby mogą powodować powstawanie zniekształceń). Przetwarzanie obrazu w blokach może, w przypadku bardzo silnej kompresji, spowodować efekt zblokowania pikseli (widać wyraźne krawędzie pomiędzy kwadratowymi blokami).

Obliczanie współczynników DCT

Dla każdego bloku pikseli i dla każdego kanału wykonywana jest dwuwymiarowa dyskretna

transformacja kosinusowa (DCT – Discrete Cosine Transform). Jest to odmiana

transformacji Fouriera, reprezentująca sygnał jako sumę składowych harmonicznych, przy czym wynik ma tylko część rzeczywistą. Przed obliczeniem DCT wartości pikseli są normalizowane – zmniejszane w taki sposób, że środkowa wartość przyjmuje zero (jeżeli piksel może mieć wartości od 0 do 255, odejmujemy 128, w rezultacie wartości mieszczą się w zakresie od –128 do 127).

W wyniku transformacji DCT blok 8 × 8 pikseli jest zamieniany na macierz 8 × 8 współczynników DCT (są to liczby zmiennoprzecinkowe). Przykładowy wynik transformacji pokazano na rys. 2 (współczynniki zostały zaokrąglone do liczb całkowitych). Współczynnik w lewym górnym rogu określa składową stałą, współczynniki w jego pobliżu – niskie

częstotliwości, współczynniki w prawym dolnym rogu – wysokie częstotliwości (zatem

częstotliwość rośnie w kierunku w prawo i w dół). Jak widać, wyższe częstotliwości opisane są współczynnikami o mniejszej bezwzględnej wartości i tak jest w przypadku większości kompresowanych obrazów. 52 55 61 66 70 61 64 73 -415 -30 -61 27 56 -20 -2 0 63 59 55 90 109 85 69 72 4 -22 -61 10 13 -7 -9 5 62 59 68 113 144 104 66 73 -47 7 77 -25 -29 10 5 -6 63 58 71 122 154 106 70 69 -49 12 34 -15 -10 6 2 2 67 61 68 104 126 88 68 70 12 -7 -13 -4 -2 2 -3 3 79 65 60 70 77 68 58 75 -8 3 2 -6 -2 1 4 2 85 71 64 59 55 61 65 83 -1 0 0 -2 -1 -3 4 -1 87 79 69 68 65 76 78 94 0 0 -1 -4 -1 0 1 2

Rys. 2. Wartości pikseli (przed unormowaniem) po lewej stronie oraz obliczone współczynniki DCT (po zaokrągleniu) po prawej stronie [5]

(8)

Kwantyzacja współczynników DCT

Oko ludzkie rozróżnia nawet małe zmiany jasności na większym obszarze obrazu, ale nie wychwytuje zmian jasności o wysokiej częstotliwości [5]. Zatem współczynniki DCT dla wysokich częstotliwości (prawy dolny róg macierzy) są mniej istotne. Liczbę bitów potrzebnych do zapisania współczynników DCT można zmniejszyć za pomocą kwantyzacji. Jako przykład, załóżmy dla uproszczenia że współczynnik DCT może przyjmować wartości od 0 do 255. Jeżeli tylko zaokrąglimy współczynniki, jasność piksela będzie reprezentowana przez jeden z 256 poziomów. Natomiast jeżeli współczynnik DCT podzielimy przez 8, będziemy mieli do dyspozycji 256 / 8 = 32 poziomy kwantyzacji (wartości od 0 do 31), więc współczynnik możemy zapisać za pomocą 5 bitów (25 = 32), zamiast 8 bitów.

W algorytmie JPEG każdy ze współczynników DCT, w zależności od położenia w bloku danych, jest dzielony przez własny współczynnik kwantyzacji. Współczynniki te są zapisane w macierzy kwantyzacji (rys. 3). Każdy współczynnik DCT jest dzielony przez odpowiadający mu współczynnik kwantyzacji i zaokrąglany do najbliższej liczby całkowitej. Zwykle współczynniki kwantyzacji są większe dla wyższych częstotliwości (które są mniej istotne dla jakości obrazu). Macierz pokazana na rys. 3 pochodzi ze specyfikacji standardu JPEG, jednak w praktyce program kompresujący do formatu JPEG stosuje własne macierze kwantyzacji (przeskalowując macierz zdefiniowaną w standardzie). Zwykle parametrem kompresji JPEG, regulowanym w programie, jest współczynnik jakości, przyjmujący wartości od 1 do 100 (Photoshop wyłamuje się z tej konwencji i używa własnej skali jakości, od 1 do 12) [8]. Dla współczynnika 100 wszystkie współczynniki kwantyzacji są równe 1 (jest to najmniej stratna kompresja). Gdy współczynnik jakości maleje, rosną współczynniki kwantyzacji. W praktyce każdy program może obliczać macierze kwantyzacji w różny sposób, tak że te same współczynniki jakości w różnych programach mogą dawać różny stopień kompresji. Wiele programów wykorzystuje jednak standardową bibliotekę libjpeg, dzięki czemu współczynnik jakości ma w tych programach zawsze takie samo znaczenie.

16 11 10 16 24 40 51 61 -26 -3 -6 2 2 -1 0 0 12 12 14 19 26 58 60 55 0 -2 -4 1 1 0 0 0 14 13 16 24 40 57 69 56 -3 1 5 -1 -1 0 0 0 14 17 22 29 51 87 80 62 -4 1 2 -1 0 0 0 0 18 22 37 56 68 109 103 77 1 0 0 0 0 0 0 0 24 35 55 64 81 104 113 92 0 0 0 0 0 0 0 0 49 64 78 87 103 121 120 101 0 0 0 0 0 0 0 0 72 92 95 98 112 100 103 99 0 0 0 0 0 0 0 0

Rys. 3. Przykładowa macierz kwantyzacji po lewej stronie oraz współczynniki DCT z rys. 2 po kwantyzacji – po prawej stronie [5]

Kwantyzacja współczynników DCT powoduje największą utratę danych w procesie kompresji stratnej, na skutek zmniejszania liczby poziomów kwantyzacji i zaokrąglania liczb do wartości całkowitych. Współczynniki kwantyzacji równe 1 (wsp. jakości 100) dają najmniejszą stratę informacji, choć nie zapewniają bezstratności kompresji (błędy zaokrąglania współczynników). Macierz kwantyzacji musi być zapisana w pliku JPEG aby możliwa była późniejsza dekompresja danych.

(9)

Kodowanie Huffmana

Ostatni etap kompresji to bezstratne kodowanie współczynników DCT po kwantyzacji). Analizując rys. 3 widać, że większość skwantowanych współczynników DCT jest zerowa, zatem dane te łatwo poddadzą się kompresji bezstratnej. Trzeba jedynie uszeregować współczynniki w kolejności od składowej stałej do najwyższych częstotliwości. Robi się to w sposób pokazany na rys. 4 (tzw. zygzak, ang. zigzag). Dzięki temu zerowe współczynniki dla wysokich częstotliwości są uszeregowane na końcu sekwencji. Szereg zer na końcu sekwencji jest zastępowany specjalnym symbolem EOB (koniec bloku). Do bezstratnego kodowania współczynników stosuje się kodowanie Huffmana. Wyszukiwane są powtarzające się ciągi współczynników, które są zastępowane kodami o zmiennej długości, wyznaczanymi poprzez analizę częstości występowania ciągów (częściej występujące ciągi są kodowane krótszymi słowami kodowymi). Kody i odpowiadające im ciągi są zapisane w tablicy kodowej w postaci drzewa binarnego. Program dokonujący kompresji może używać tablicy kodowej zdefiniowanej w standardzie JPEG, może również wyznaczyć optymalną tablicę dla danego obrazu (tryb optimized JPEG). Szersze omówienie kodowania Huffmana z przykładami można znaleźć w Internecie [7].

Rys. 4. Sposób uszeregowania skwantowanych współczynników DCT do celów kodowania bezstratnego [5]

Największą wartość ma zwykle współczynnik określający składową stałą. Z drugiej strony, składowa stała nie zmienia się znacząco pomiędzy kolejnymi blokami pikseli, zatem współczynniki dla składowej stałej w kolejnych blokach pikseli kodowane są różnicowo (zmiana w porównaniu z poprzednim blokiem).

Dekodowanie JPEG

Dekoder JPEG wykonuje operacje odwrotne do kodowania. W pliku JPEG muszą być zapisane: macierz kwantyzacji oraz tablice kodów Huffmana. Dla każdego bliku pikseli, najpierw dokonywane jest rozkodowanie bezstratnie zapisanych danych, następnie dane są mnożone przez odpowiednie współczynniki kwantyzacji, po czym na każdym bloku pikseli wykonywana jest odwrotna transformacja cosinusowa (IDCT). Po dodaniu do wyniku wartości normującej (typowo 127) i po nadpróbkowaniu kanałów chrominancji otrzymuje się wartości pikseli obrazu.

(10)

4. Zadania do wykonania i opracowania w sprawozdaniu

UWAGA: przed przyjściem na zajęcia należy wydrukować pozostałe strony instrukcji (od następnej strony do końca). Wydruk jest formularzem sprawozdania, który należy wypełnić wykonując zadania opisane w formularzu. Wypełniony formularz należy oddać prowadzącemu na zakończenie zajęć.

Pliki wykorzystywane w ćwiczeniu znajdują się w katalogu D:\Technologie

Multimedialne\!cw05 (lub na dysku C, jeżeli komputer nie ma partycji D). Własne pliki

należy umieszczać w innym katalogu roboczym.

5. Bibliografia

[1] Megapixel calculator: http://web.forret.com/tools/megapixel.asp

[2] Przelaskowski A. Kompresja danych. Podstawy, metody bezstratne, kodery obrazów. Wyd. btc, 2005.

[3] Wikipedia: Graphics Interchange Format.

http://en.wikipedia.org/wiki/Graphics_Interchange_Format [4] Wikipedia: Portable Network Graphics.

http://en.wikipedia.org/wiki/Portable_Network_Graphics [5] Wikipedia: JPEG. http://en.wikipedia.org/wiki/JPEG [6] Kerr D.A. Chrominance Subsampling in Digital Images.

http://doug.kerr.home.att.net/pumpkin/Subsampling.pdf [7] JPEG Huffman Coding Tutorial:

http://www.impulseadventure.com/photo/jpeg-huffman-coding.html [8] JPEG Compression and JPEG Quality:

http://www.impulseadventure.com/photo/jpeg-compression.html

Oprogramowanie

RIOT – Radical Image Optimization Tool (freeware) http://luci.criosweb.ro/riot/

JPEGSnoop (freeware)

(11)

LABORATORIUM TECHNOLOGII MULTIMEDIALNYCH

Ćw. 5 Metody kompresji grafiki komputerowej

Wykonujący:

Grupa:

Ocena:

Data i godzina wykonania ćwiczenia:

Zadanie 1

Zadanie dotyczy kompresji JPEG zdjęcia z aparatu fotograficznego. Otworzyć program RIOT i wczytać do niego plik obraz.bmp. Zmieniając suwakiem Quality stopień kompresji zaobserwować (w skali 1:1) jak zmienia się rozmiar pliku oraz jakie powstają zniekształcenia (jak duże, jaki mają charakter, w jakich fragmentach obrazu powstają, itp). Naciskanie i puszczanie najniższego przycisku na środkowym pasku ( ) pozwala ocenić różnice między plikiem oryginalnym a zakodowanym. Wypełnić poniższą tabelkę.

Quality Rozmiar Opis zniekształceń

100 85 50 30

5

Rozmiar pliku oryginalnego wynosi: ...

Znaleźć współczynnik jakości, dla którego obraz nie ma wyraźnie widocznych zniekształceń w skali 1:1. Współczynnik ten wynosi: ...

Powiększyć obraz (przycisk + na środkowym pasku) tak aby uwidocznić głowę żółto-niebieskiej papugi. Ustawić Quality na 40%. Jaki charakter mają zniekształcenia?

(12)

Zniekształcenia powierzchni o jednolitym kolorze (np. pióra na szyi)

Przywrócić powiększenie 1:1, ustawić Quality na 5%.

Dlaczego zniekształcenia mają charakter jednobarwnych kwadratów? (Podpowiedź można znaleźć w instrukcji w opisie kompresji JPEG.)

Ustawić Quality na 50%. Zmieniać parametr Chroma i zanotować rozmiary plików w poniższej tabelce. Subsampling Rozmiar None (4:4:4) Low (4:2:2) Medium (4:2:0) High (4:1:1)

Czy widoczne są jakiekolwiek zniekształcenia koloru przy zmianie z None na High (w skali 1:1 i dużym powiększeniu)? Jeśli tak, opisać je.

Zadanie 2

Dla pliku obraz.bmp zbadać rozmiar zakodowanych plików przy kompresji JPEG, PNG i GIF:

Kompresja Rozmiar

JPEG (Q 85%, ChS Low)

JPEG (optymalne Q znalezione w zad. 1, ChS Low) GIF (Optimal 256 Color Palette)

PNG (Optimal 256 Color Palette, wyłączone Best compression) PNG (True Color, wyłączone Best compression)

(13)

Powiększyć obraz (ok. 5 razy) i ustawić kompresję GIF. Jaki charakter mają zniekształcenia? Z czego wynikają?

Ocenić i skomentować stopień kompresji uzyskiwany w badanych formatach, w odniesieniu do jakości obrazu. Który z badanych trybów daje najlepszy stosunek jakości do rozmiaru i dlaczego?

Zadanie 3

W programie RIOT zapisać dwie kopie pliku obraz.bmp w formacie JPG, ze współczynnikiem jakości odpowiednio 80% i 50%. Następnie wczytać plik zapisany z jakością 50% i zapisać go z jakością 80%. Zanotować w tabeli rozmiary plików.

Plik Rozmiar

80% 50%

50% > 80%

Czy pliki 80% i 50%>80% różnią się jakością? Dlaczego? Czy jest sens dokonywać rekompresji JPEG z wyższym współczynnikiem? Uzasadnić odpowiedź.

(14)

Zadanie 4

Otworzyć program Total Commander. Wykonać zrzut okna programu (klawisze Alt+PrintScreen). Wkleić zrzut do programu RIOT (Edit > Paste from clipboard).

Jaki charakter mają zniekształcenia kompresji JPEG dla Q 80% i 50% (obserwowane w skali 1:1 i na powiększeniu)? Z czego wynikają?

Zanotować w tabeli rozmiar pliku:

Kompresja Rozmiar

Brak (plik oryginalny) JPEG (Q 85%, ChS Low) JPEG (Q 50%, ChS Low)

GIF (Optimal 256 Color Palette)

PNG (True Color, WŁĄCZONE Best compression)

Dlaczego w tym przypadku PNG daje dobry współczynnik kompresji?

Który z formatów kompresji daje w tym przypadku najlepszy wynik, biorąc pod uwagę jakość i rozmiar pliku? Uzasadnić odpowiedź.

Zadanie 5

W tym zadaniu zajrzymy do wnętrza plików JPEG. Do wykonania tego zadania potrzebna jest wiedza na temat algorytmu kompresji JPEG, zawarta w rozdziale 3 tej instrukcji.

Wczytać do programu RIOT plik obraz.bmp. Zapisać jego dwie kopie ze współczynnikiem jakości odpowiednio 100% i 80%, ustawiając Chroma subsampling na None.

(15)

Uruchomić program JPEGSnoop, wczytać plik JPG zapisany ze wsp. 100%. Włączyć wyświetlanie siatki (Ctrl+G). Powiększyć obraz (kombinacja klawiszy Ctrl i = lub menu View > Image zoom). Kliknąć myszką na prostokąt zawierający oko lewej papugi, zapisać współrzędne (MCU): [... , ...].

Upewnić się że w menu Options > Scan Segment zaznaczone są opcje Decode Image oraz FULL IDCT. Wybrać Options > Scan Segment > Detailed Decode. Wpisać współrzędne bloku pikseli (MCU X, MCU Y). Ustawić MCU # na 1, zaznaczyć Enable detailed scan decode. Zatwierdzić (OK). Następnie wybrać z menu File > Reprocess File (Ctrl+R).

Uruchomić drugą kopię programu JPEGSnoop. Wczytać plik JPG zapisany ze współczynnikiem 80%. Powtórzyć wcześniejsze operacje dla tych samych współrzędnych MCU.

W oknach programu znaleźć (blisko początku) macierz kwantyzacji dla kanału luminancji: Define a Quantization Table, Destination ID=0 (Luminance). Porównać macierze kwantyzacji dla obu plików.

Jak zmienia się macierz kwantyzacji dla malejącej jakości? Które współczynniki kwantyzacji reprezentują niskie, a które wysokie częstotliwości? Dlaczego jedne z nich są wyższe od drugich? Odpowiedzi można znaleźć w części teoretycznej instrukcji.

Przewinąć okna programu JPEGSnoop i znaleźć współczynniki DCT dla luminancji (sekcja Decoding SCAN Data, Lum (Tbl #0) i niżej: DCT Matrix, można użyć funkcji Edit > Find aby znaleźć pierwsze wystąpienie ciągu DCT Matrix). Porównać macierze wsp. DCT obu plików. Jak zmiana współczynnika jakości kompresji JPEG wpływa na współczynniki DCT dla składowej stałej, dla niskich i dla wysokich częstotliwości? Które współczynniki zostały w pliku 80% wyzerowane i dlaczego? W jaki sposób wpływa to na stopień kompresji?

(16)

Wykonać następujące operacje, zanotować wyniki w tabeli.

Operacja Wynik

Wybrać i odczytać dowolną (poza składową stałą) wartość z macierzy współczynników DCT dla jakości 100%.

A = Oczytać odpowiadający mu współczynnik z macierzy kwantyzacji dla jakości 80%.

B =

Podzielić te liczby: C = A / B C =

Zaokrąglić wynik do najbliższej liczby całkowitej D = Przemnożyć przez współczynnik kwantyzacji: E = D * B E = Odczytać współczynnik DCT odpowiadający B dla jakości 80% F = Czy E == F?

Obliczenia A-D zachodzą w procesie kompresji JPEG (A jest wartością współczynnika DCT, D jest wartością zapisywaną w pliku JPG), obliczenie E zachodzi w procesie dekompresji.

Zadanie 6

Podsumować wyniki ćwiczenia.

Jaki format kompresji jest najbardziej odpowiedni (pod kątem jakości i rozmiaru pliku) dla zdjęć? Dlaczego?

Jaki format kompresji jest najbardziej odpowiedni (pod kątem jakości i rozmiaru pliku) dla grafiki komputerowej? Dlaczego?

Czy zasadne jest stosowanie JPEG jako formatu pośredniego przy wielokrotnej edycji i zapisywaniu pliku? Dlaczego?

Cytaty

Powiązane dokumenty

Omawiana książka składa się z dwóch, mniej w ięcej rów nych objętościowo części. 9— 119) zawiera analizę stosunków społeczno-politycznych okresu archaicznego

Wspominaliśmy już, że pierwszy okres aktywnego śledztwa zakoń­ czył się w końcu 1949 r. Potem jakby zastanawiano się, co z tym dalej zrobić. Areszto­ wanie

451 By resorting to political publicistics, the belles lettres and guidebooks, the author depicts the confrontation in the course of the nineteenth century and

Owe daty uogólnione (częstotliwość w danym roku inicjacji lub wystąpień) sygnalizują zmiany nastrojów oraz postaw światopoglądowych czy poli­ tycznych. Niekiedy

[r]

[r]

System Pantone standaryzuje kolory bazowe procesów CMYK Większość z 1114 podstawowych barw Pantone nie daje się wiernie reprezentować w procesie CMYK. Wymagają one użycia do

Wczesne obrazy srebrowe łatwo ulegały chemicznej degradacji (utlenianie) Tonowanie — przeprowadzanie srebra metalicznego do trwalszych, brązowawych siarczków srebra..