background image

Multimedia

Dr hab. inż.  Ewa Świercz

background image

Kompresja danych multimedialnych

Co to jest kompresja?

W jakim celu dokonujemy kompresji danych?

Z czym związana jest kompresja – co zyskujemy a co 
tracimy?

Jakie mechanizmy są podstawą algorytmów kompresji 
danych?

Jakie algorytmy są wykorzystywane do kompresji 
obrazu, dźwięku i wideo? Jak działają? Jakie są ich 
wady i zalety? Gdzie znajdują zastosowanie?

background image

Kompresja danych multimedialnych

Co zyskujemy a co tracimy?

Zmniejszenie zajmowanej powierzchni na nośniku lub 

oszczędność przepustowości łącza. Szczególnie ważne przy 

materiale wideo, zajmującym najwięcej zasobów spośród 

wszystkich składników systemu multimedialnego. 

Konieczność dekompresji przed końcowym wykorzystaniem, a 

więc niezbędne jest poświęcenie czasu i części mocy 
obliczeniowych maszyny 

– co może stanowić problem, 

zwłaszcza, jeżeli potrzebne jest odtwarzanie „w locie”.

Kompresja stratna i bezstratna. Czy możemy sobie 

pozwolić na utratę części informacji? Jak bardzo będzie 

to zauważalne? Jak wpłynie na przydatność 

skompresowanego zbioru do naszych celów?

background image

Dlaczego kompresja jest tak istotna?

Nieskompresowany obraz kolorowy w trybie „true color” – 24 bity na 
piksel:

Nieskompresowana sekwencja wideo, 25 klatek/s, w jakości 

telewizyjnej (PAL 704x576, po 12 bitów/piksel):

121 651 kbit/s (121,6 Mbit/s)

Dwugodzinny film PAL, 25 klatek/s, 12 bitów/piksel:

Blisko 120 GB!

wymiary

352x288 CIF

Common

Intermediate

Format

704x576 PAL

Phase 

Alternating Line 

1600x1200 

BMP

Format plików 
z grafiką 
bitmapową

rozmiar

297 kB

1,16 MB

5,5 MB

background image

Przykład obrazu w formacie BMP , wymiar 549X601, 967.29 kB

background image

Dlaczego można cokolwiek skompresować?

Redundancja (nadmiarowość)

Informacje w danych powtarzają się, jest ich więcej, niż to absolutnie 
konieczne 

– np. w dowodzie osobistym jest zarówno PESEL jak i data 

urodzenia, chociaż PESEL ją zawiera, w formularzach często należy 

wpisać adres zameldowania i zamieszkania, chociaż mogą być takie 

same, itd…

Różne sposoby reprezentacji

np.reprezentacja grafiki: rastrowa i wektorowa. Często można coś 

krócej opisać za pomocą wzoru lub metody postępowania, niż 

dosłownej listy. „Kwadrat o boku 500 i górnym-lewym wierzchołku w 

punkcie (0,0) ” jest krótszym zapisem niż lista współrzędnych 

wszystkich pikseli składających się na ten kwadrat.

Ograniczenia percepcji

wzrokowej 

– nie jesteśmy w stanie dostrzec niektórych szczegółów, 

więc nie zauważymy różnicy, jeżeli zostaną wycięte z obrazu.

słuchowej – nie jesteśmy w stanie usłyszeć niektórych częstotliwości 

występujących w sygnale dźwiękowym, więc nie zauważymy, jeżeli 

zostaną wycięte. 

background image

Czy każde dane można skompresować

?

Nie zawsze!! 

Możliwe, że używając danej metody kompresji 

dla specyficznego tekstu nie osiągniemy 
żadnego zysku!

background image

Kompresja danych multimedialnych

Podstaw teoretyczne

Podstawowe definicje:

Kompresja 

– proces zmiany sposobu zapisu 

informacji, mający na celu zmniejszenie zajmowanej 

przez nie przestrzeni w nośniku (nośnik fizyczny, 

kanał transmisyjny, itd…)

Koder 

– implementacja algorytmu kodowania i 

kompresji.

Dekoder 

– implementacja algorytmu dekodowania i 

dekompresji.

Kodek 

– koder + dekoder, w kontekście multimediów 

rozumiane jako kompletna implementacja kompresji i 

dekompresji danych określonego formatu

.

background image

Kompresja danych multimedialnych

Podstaw teoretyczne c.d.

Podstawowe definicje:

Symbol 

– w kontekście kodowania: unikalny, 

niepodzielny i jednoznacznie odróżnialny składnik 
strumienia danych, niosący informację. Przykłady: 
litera w tekście, bit w pliku binarnym. 

Alfabet 

– zbiór wszystkich symboli, z których może 

być złożona wiadomość.

Kodowanie 

– przyporządkowanie każdemu 

symbolowi z alfabetu A unikalnego ciągu symboli z 
alfabetu B.

background image

Kompresja danych multimedialnych

Miary jakości algorytmu kompresji

Współczynnik kompresji:

Jest to stosunek liczby bitów po kompresji do liczby bitów przed 

kompresją. 

Bitrate

Średnia liczba bitów na symbol w skompresowanej wiadomości.

Czas kompresji i dekompresji

Średni czas wykonania operacji dla określonej porcji danych 

(np. 1kB)

Zapotrzebowanie na dodatkowe zasoby-

np. dodatkową 

pamięć na buforowanie danych.

Subiektywna ocena odbiorcy 

– nie zawsze parametry 

liczbowe algorytmu dobrze opisują postrzeganą jakość 

zbioru wynikowego! Można wskazać obraz subiektywnie 

„lepszy”, „wyraźniejszy” , „ostrzejszy”.

background image

Kompresja bezstratna

Kompresja bezstratna wykorzystuje redundancję 
(nadmiarowość) danych w strumieniu i pozwala 
ograniczyć ich rozmiar bez jakiejkolwiek straty informacji. 
Skompresowany zbiór danych po dekompresji jest w 
100% zgodny z oryginałem- identyczność bitowa!

Algorytmy kompresji mogą być zatem wykorzystane do 
dowolnego typu danych, także np. plików 
wykonywalnych czy danych pomiarowych.

Kompresja bezstratna jest całkowicie odwracalna!

background image

Kompresja bezstratna

Wydajność algorytmów kompresji bezstratnej zależy od 
stopnia redundancji strumienia wejściowego – od ilości 
nadmiarowych informacji w nim zawartych.

Strumień o wysokim stopniu redundancji danych:

AAAA

BBB

CCCCC

DD

AAAA

BBBBBBB

Strumień o niskim stopniu redundancji danych:

A

BB

C

D

A

B

C

B

C

A

DD

B

A

C

A

B

D

A

C

background image

Kompresja bezstratna

Przykłady zbiorów danych o wysokim stopniu 
redundancji:

Tekst w języku naturalnym

Zdjęcia

Sekwencje wideo, film

Mowa, muzyka

Takie zbiory dadzą się zwykle silnie skompresować! 

background image

Kompresja bezstratna

Przykłady zbiorów danych o niskiej redundancji:

Ciągi liczb pseudolosowych

Szum

Dane skompresowane innym algorytmem 

bezstratnym

Takie zbiory nie dadzą się silnie skompresować! 

background image

Kompresja bezstratna

Klasy algorytmów kompresji bezstratnej:

Algorytmy proste 

– nie dokonują analizy strumienia 

wejściowego przed kompresją, wykorzystują podobieństwo 

sąsiedztwa.

Algorytmy statystyczne 

– przed kompresją cały strumień jest 

buforowany i analizowany pod kątem częstości występowania 

poszczególnych elementów, na podstawie wyników dobierana 
jest odpowiednia strategia kompresji

Algorytmy słownikowe 

– kompresja oparta jest na stworzeniu 

słownika podciągów w strumieniu danych i zastąpieniu ich 

krótszymi „numerami” swojej pozycji w słowniku. 

background image

Algorytmy proste

Najmniej wydajne, ale szybkie i łatwe w 
implementacji, mają bardzo małe wymagania 
pamięciowe – nie potrzebują bufora.

Przykłady algorytmów należących do grupy 
algorytmów prostych:

ByteRun

RLE (Run Length Encoding)

background image

Algorytm ByteRun

Operuje na pojedynczych bajtach (symbol ma reprezentację bajtową), 

opiera się na eliminacji redundancji lokalnej. Zasada działania:

Grupa bajtów ze strumienia wejściowego może zostać 

zakodowana na jeden z dwóch sposobów:

Sposób pierwszy: oznaczamy 

n

następnych bajtów, które mają 

zostać skopiowane bez zmian i umieszczamy tę liczbę wraz z 

bajtami, których dotyczy w strumieniu wyjściowym, czyli:

A

B

C

D   =>  4

A

B

C

D

n musi się zawierać w przedziale <1, 127>

Sposób drugi: jeżeli znajdziemy powtarzające się, sąsiednie 

symbole, zastępujemy je symbolem 
K [ -n+1, A

x

], gdzie: n -

liczba powtórzeń, A

x

- powtarzany symbol, 

czyli:

AAAA

=> -3

A

, ponieważ:  - (-3) +1 = 4*

AAAA

n musi się zawierać w przedziale <1, 127>

background image

Algorytm ByteRun

Przykład:

Strumień oryginalny

:

AAAA

BBB

C

D

A

BBBBBB    

– 16 bajtów

Strumień skompresowany

:

-3

A

-2

B

3

C

D

A

-5

B    

– 10 bajtów

Dekodowanie jest bardzo proste, sprawdzamy znak pierwszego 

bajtu, rozpoznajemy rodzaj sekwencji, a później albo powielamy 

albo kopiujemy określoną liczbę bajtów.

Wady:

w najbardziej pesymistycznym przypadku 

– brak grup 

powtarzających się symboli skompresowany strumień będzie 

dłuższy niż strumień oryginalny!

background image

Algorytm Run Length Encoding

Podobny do algorytmu ByteRun, ale zawiera 
dodatkowe sekwencje sterujące.

Kopiowanie oznaczane jest symbolem [0, n, A

1

, A

2

, …, A

], gdzie 

n -

liczba kolejnych bajtów do skopiowania bez zmian. 

Przykład:

A

B

C

D

=> 04

A

B

C

D

Powielanie oznaczane jest symbolem [n, A] , gdzie n 

– liczba 

powtórzeń, A – powtarzany symbol

AAAA

=> 4

A

n może zawierać się w przedziale <1, 255> , zysk przy długich 

sekwencjach w porównaniu do ByteRun

background image

Algorytmy proste 

– podsumowanie

Szybkie w działaniu, nie zajmujące zasobów, 
umiarkowanie wydajne.

Wykorzystywane między innymi w formatach grafiki  
PCX, wariantach formatu GIFF, Truevision TGA (format 
grafiki rastrowej), PackBits, czy  ILBM. 

Mogą w niekorzystnych warunkach generować 
strumienie dłuższe niż oryginalny.

background image

Algorytmy statystyczne

Dokonują analizy strumienia wejściowego pod kątem 
częstości występowania poszczególnych symboli i 
przyporządkowują najczęściej występującym najkrótsze 
słowa kodowe.

Jest to grupa algorytmów o zmiennej długości słowa 
kodowego.

Zysk w kodowaniu statystycznym polega na tym, że 
symbole występujące częściej niż średnia otrzymują 
słowa kodowe krótsze niż średnia długość słowa 
kodowego dla symbolu. Część symboli otrzymuje co 
prawda słowa kodowe dłuższe niż średnia, ale ponieważ 
występują rzadziej – całość strumienia jest krótsza!

background image

Kodowanie Huffmana najczęściej wykorzystywany 

statystyczny algorytm kompresji bezstratnej  

Opracowany przez Davida Huffmana w Massachusetts 
Institute of Technology, ogłoszony w 1952 roku, prosty, 
efektywny jest jednym z najbardziej 
rozpowszechnionych algorytmów kompresji bezstratnej. 

Podstawą jego działania jest analiza statystyczna danej 
wiadomości pod kątem częstotliwości występowania w 
niej poszczególnych symboli. Każda wiadomość musi 
być indywidualnie analizowana!

Stosowany także jako jeden z etapów wielu algorytmów 
kompresji stratnej 

– np. JPEG czy MP3.

background image

Kodowanie Huffmana

Zasada działania:

Etap 1:

Analiza częstości występowania symboli (liter) w wiadomości 

(tekście) i uszeregowanie ich od najrzadziej do najczęściej 

występujących,

HELLO  WORLD

– 3 wystąpienia

– 2 wystąpienia

– 1 wystąpienie

– 1 wystąpienie

– 1 wystąpienie

– 1 wystąpienie

D -

1 wystąpienie

Kolejność: L, O, H, E, W, R, D

Każdy tekst ma swój charakterystyczny rozkład częstości występowania znaków, 
dlatego przy kodowaniu algorytmem Huffmana konieczna jest indywidualna 

analiza każdej wiadomości! 

background image

Kodowanie Huffmana

Etap 2:

Budowa drzewa binarnego, w którym liśćmi będą litery pojawiające 

się w tekście. Każdemu węzłowi przyporządkowywana jest waga – na 

początku węzłami są występujące w tekście litery a ich wagami-

częstość ich wystąpienia. Drzewo budowane jest przez łączenie 

dwóch węzłów o najmniejszych wagach w jeden węzeł- rodzic, i 

przypisanie mu wagi będącej sumą jego potomków

.

R(1)

E(1)

W(1)

H(1)

O(2)

L(3)

(2)

D(1)

R(1)

(2)

D(1)

E(1)

W(1)

H(1)

background image

Kodowanie Huffmana

O(2)

L(3)

R(1)

(2)

D(1)

H(1)

W(1)

(2)

E(1)

W(1)

(2)

E(1)

O(2)

L(3)

R(1)

(2)

D(1)

H(1)

background image

Kodowanie Huffmana

W(1)

(2)

E(1)

O(2)

L(3)

R(1)

(2)

D(1)

(3)

H(1)

W(1)

(2)

E(1)

(3)

H(1)

O(2)

L(3)

R(1)

(2)

D(1)

background image

Kodowanie Huffmana

W(1)

(2)

E(1)

(3)

H(1)

O(2)

L(3)

R(1)

(2)

D(1)

(4)

O(2)

R(1)

(2)

D(1)

(4)

W(1)

(2)

E(1)

(3)

H(1)

L(3)

background image

Kodowanie Huffmana

Zbudowane drzewo Huffmana dla „Hello World”

O(2)

R(1)

(2)

D(1)

(4)

W(1)

(2)

E(1)

(3)

H(1)

L(3)

(6)

(10)

background image

Kodowanie Huffmana

Etap 3:

Przypisanie gałęziom od rodzica do potomka cyfr 1 lub 0.

Gałąź lewa – 0, „idź w lewo”, gałąź prawa – 1, „idź w prawo”

Wtedy każda litera- liść może być jednoznacznie opisana 
przez sekwencję zer i jedynek opisujących drogę od korzenia 
do liścia.

A

B

(2)

(0)

C

0

1

0

1

Kod litery B: 01

background image

Kod Huffmana - podsumowanie

Optymalny wśród kodów prefiksowych

Symbolom występującym najczęściej odpowiadają 
najkrótsze słowa kodowe.

Kodowanie i dekodowanie w czasie liniowym 

– więc 

szybkie.

Konieczność przesłania informacji o drzewie znaków do 
dekodera 

– bez tego odczytanie jest niemożliwe.

Powszechnie stosowany jako samodzielny algorytm 
kompresji bezstratnej, lub jako etap w bardziej 
zaawansowanych metodach, stanowi element 
standardów JPEG, MP3, gzip, arj.

background image

Algorytmy słownikowe

Algorytmy słownikowe polegają na kolejnym czytaniu 

danych wejściowych i przeglądaniu słownika w 

poszukiwaniu dokładnie takiej samej sekwencji danych. 

Słownik może być zadany lub budowany dynamicznie w 

trakcie działania algorytmu.

Rodzina algorytmów o stałej długości słowa kodowego –

którym jest po prostu indeks pozycji danej grupy symboli 

wejściowych w słowniku.

Efektywność algorytmów słownikowych dla danej 

wiadomości zależy od częstości występowania w niej 

takich samych grup symboli. Im dłuższa sekwencja w 

słowniku, tym efektywniejsza kompresja.

background image

Algorytmy słownikowe

Algorytm LZ77, opracowany przez pp. Jacoba Ziva i 
Abrahama Lempela w 1977 roku. Podobnie jak 
kodowanie Huffmana, jest wykorzystywany w szeregu 

popularnych standardów kompresji, np. RAR, czy 
formacie graficznym PNG.

W tej metodzie słownik budowany jest na bieżąco, 

spośród pewnej liczby ostatnio przeanalizowanych 

bajtów strumienia. Jeżeli jakaś grupa wystąpiła w 
ostatnich n bajtach strumienia-

mamy ją w słowniku.

Słownik nie jest w tej metodzie stały!

background image

Algorytm LZ77

Zasada działania:

Kompresor, czytając kolejne dane ze strumienia 
sprawdza, czy nie natrafił ostatnio na podobny ciąg, a 
jeżeli tak, to zamiast całego ciągu zapisuje tylko 
długość powtórzonego ciągu i przesunięcie do tyłu.

Hej, 20 bajtów wcześniej widziałem taki sam ciąg o 
długości 4 bajtów !

W praktycznych implementacjach śledzone „okno 
słownikowe” jest dosyć duże – kilka, kilkanaście kB.

background image

Algorytm LZ77

LZ77 - kodowanie

Przesuwanie okna wzdłuż czytanego strumienia danych 

wejściowych.

Szukanie najdłuższego łańcucha danych w buforze „patrz w 

przód”, który ma swój dokładny odpowiednik w słowniku.

Tworzenie sekwencji kodowej tego łańcucha (start, ile, następny 
znak).

Przesuwanie okna o długość zakodowanej frazy.

Powtarzanie kroków 2, 3 i 4 aż do zakodowania ostatniego 

symbolu z danych wejściowych.

Format słowa kodowego: [(o ile wstecz, jak długi ciąg) 

następny znak]

background image

Algorytm LZ77

Przykład:

Okno=(8-

słownik

,4-

Bufor „patrz w przód”

Wiadomość: ABRAKADABRA_CZARY_MARY

Tekst w oknie: 

ABRAKADA

BRA_

CZARY_MARY

Zatem po zakodowaniu:

(0,0)A

(0,0)B

(0,0)R

(3,1)K

(2,1)D

(7,4)_

(0,0)C

(0,0)Z

(4,1)R

(0,0)Y

(6,1)M

(5,3)EOF

background image

Inny przykład

Kodujemy ciąg zakładając długość słownika równą  - 7.
długość bufora kodowania równą - 6

k a b r a k a d a b r a r r a r r a d

Zakładamy, że podciąg 

k a b r a k a

jest już zakodowany

Dopasowanie musi

zaczynać się w buforze słownikowym a może kończyć się w 

buforze kodowania

background image

Dekodowanie algorytmu LZ77

Startujemy z odkodowanego podącigu 

k a b r a k a

Odkodowujemy (0,0,C(d)) 

– czyli C(d)

Odkodowujemy (7,4,C(r)) tzn. przesuwamy o 7 i kopiujemy 4 kolejne 
znaki słownika

background image

Odkodowanie trójki liczb (3,5,C(d))

d

d

d

d

d

d

background image

Algorytm LZ77

LZ77 -

efektywność

Zależy silnie od długości fraz w słowniku – im 
dłuższe, tym lepsze.

Skuteczna do kompresji tekstu języka naturalnego, 
fotografii (ze względu na często występujące, 
jednolite kolorystycznie regiony)

Szybki obliczeniowo