Kompresja stratna (ang. lossy compression) – nieodwracalna metoda zmniejszenia objętości danych poprzez usunięcie przez kodek informacji mniej istotnych dla zmysłów człowieka[1]. Dopuszcza przy odtwarzaniu (dekompresji) skompresowanego sygnału takie zniekształcenie sygnału w porównaniu do sygnału pierwotnego, że jego percepcja przez człowieka (słuch, wzrok) będzie identyczna lub zbliżona do oryginału, ewentualnie będzie od niego odbiegać, lecz za świadomą zgodą użytkownika[1]. Zaletą kompresji stratnej jest uzyskiwanie wysokiego stopnia kompresji, znacznie wyższego niż przy zastosowaniu kompresji bezstratnej[1].
Kompresja stratna jest możliwa ze względu na sposób działania ludzkich zmysłów, czyli większą ważność dla zmysłów odbiorcy pewnych zakresów danych z ich całości. Algorytmy kompresji stratnej posługują się modelami psychoakustycznymi i modelami psychowizualnymi, aby odrzucić najmniej istotne dla zmysłów odbiorcy dane akustyczne czy wizualne, pozostawiając dane o wyższej ważności dla percepcji informacji przez zmysły. Ilość odrzucanych danych jest określana przez stopień kompresji, im stopień kompresji jest większy, tym więcej danych jest usuwanych z oryginalnego materiału w procesie kompresji stratnej i wzrasta prawdopodobieństwo rozpoznania przez odbiorcę danych stratnie skompresowanych jako materiału nieoryginalnego w trakcie przeprowadzania podwójnie ślepej próby. Kompresja stratna dźwięku wykorzystuje zjawisko maskowania dźwięków, percepcji wysokości dźwięków oraz dyskryminacji bodźców dźwiękowych. Nauką zajmującą się percepcją słuchową człowieka jest psychoakustyka. Kompresja stratna obrazu wykorzystuje m.in. zjawisko znacznie niższej rozdzielczości barwowej ludzkiego oka od jego rozdzielczości jasności.
Nie istnieją algorytmy kompresji stratnej, które można stosować do dowolnego typu danych. Kompresja stratna np. plików wykonywalnych jest niemożliwa do zastosowania, ponieważ nie jest to informacja odczytywana przez ludzkie zmysły, lecz przez maszynę.
Zwykle kompresję stratną stosuje się do:
- dźwięków;
- obrazów;
- ruchomych obrazów, jak np. film.
Przy danych audiowizualnych dźwięk i obraz kompresowane są osobno.
Prostym przykładem kompresji stratnej obrazu jest np. zachowanie tylko co drugiego piksela, lub odrzucenie dwóch najmniej istotnych bitów. Takie metody nie dają jednak zadowalających rezultatów w porównaniu do metod opartych na modelach psychozmysłowych badanych w psychofizyce.
Najpopularniejsze algorytmy kompresji
[edytuj | edytuj kod]Obraz
[edytuj | edytuj kod]- JPEG, podstawa algorytmu MPEG, oparty na DCT;
- JPEG2000, oparty na falkach;
- JPEG XL;
- PNG[2];
- WEBP;
- HEIF/HEIC;
- AVIF, wywodzący się z video AV1.
Wideo
[edytuj | edytuj kod]- DivX/Xvid;
- MPEG-2, stosowany do kompresji filmów na DVD;
- RealVideo, dawniej wykorzystywany do transmisji na żywo;
- H.264 (MPEG-4 AVC);
- H.265 (HEVC);
- VP9;
- AV1.
Dźwięk
[edytuj | edytuj kod]- MP3, oparty na MDCT, stosuje model psychoakustyczny Instytutu Fraunhoffera i firmy Thomson;
- Ogg Vorbis, oparty na MDCT;
- RealAudio, stosowany głównie do transmisji na żywo;
- OPUS.
Kompresja grafiki
[edytuj | edytuj kod]JPEG
[edytuj | edytuj kod]Najbardziej powszechnym algorytmem kompresji obrazów jest JPEG. Wiele rozwiązań użytych w JPEG jest używanych także w innych algorytmach, więc warto je tutaj omówić. Kolejne kroki algorytmu JPEG to:
- zamiana przestrzeni kolorów z RGB na kanał jasności i dwa kanały koloru. Ludzie znacznie dokładniej postrzegają drobne różnice jasności od drobnych różnic barwy, a więc użyteczne jest tutaj użycie różnych parametrów kompresji. Krok nie jest obowiązkowy.
- obniżenie rozdzielczości kanałów koloru (podpróbkowanie chrominancji), zwykle brana jest co druga wartość wzdłuż osi poziomej i każda na pionowej, choć możliwe są też inne ustawienia. Tak radykalne cięcie danych nieznacznie wpływa na jakość, ponieważ rozdzielczość postrzegania kolorów przez ludzkie oko jest słaba. Krok nie jest obowiązkowy.
- podzielenie każdego kanału obrazka na bloki 8×8. W przypadku kanałów kolorów, jest to 8×8 rzeczywistych danych, a więc zwykle 16×8.
- transformata kosinusowa każdego z bloków. Zamiast wartości pikseli mamy teraz średnią wartość wewnątrz bloku oraz częstotliwości zmian wewnątrz bloku, obie wyrażone przez liczby zmiennoprzecinkowe. Transformata DCT jest odwracalna, więc na razie nie tracimy żadnych danych.
- Zastąpienie średnich wartości bloków przez różnice wobec wartości poprzedniej. Poprawia to w pewnym stopniu współczynnik kompresji.
- Kwantyzacja, czyli zastąpienie danych zmiennoprzecinkowych przez liczby całkowite. Tutaj właśnie następuje utrata precyzji danych. Zależnie od parametrów kompresora, odrzuca się mniej lub więcej danych. Zasadniczo większa dokładność jest stosowana do danych dotyczących niskich częstotliwości niż wysokich, kodowanych algorytmem Huffmana.
Użyta transformata powoduje efekty blokowe w przypadku mocno skompresowanych obrazków.
Inne metody
[edytuj | edytuj kod]Inne algorytmy kompresji obrazków opierają się głównie na:
- użyciu innej transformaty:
- zmodyfikowanej transformaty kosinusowej, która nie powoduje efektu bloków, a więc jest korzystniejsza w przypadku mocno skompresowanych obrazków. Nie odbiega ona wynikami znacząco od DCT w przypadku obrazów o średniej i niskiej kompresji;
- transformat falkowych – mogą one dać znacznie lepsze wyniki. Zazwyczaj nie powodują efektu bloków;
- użyciu innego algorytmu kompresji bezstratnej;
- kompresji wszystkich kanałów naraz, w szczególności ich wspólnej kwantyzacji. Daje lepsze wyniki jeśli wartości w różnych kanałach są mocno skorelowane.
Kompresja fraktalna
[edytuj | edytuj kod]Zupełnie inną metodą jest kompresja fraktalna. Opisuje ona obraz w postaci parametrów funkcji fraktalnej, która daje w efekcie przybliżoną postać obrazu. Dotychczas kompresja fraktalna daje znacznie słabszą jakość w przypadku obrazów o niskim i średnim stopniu kompresji. Dla obrazów silnie skompresowanych może dawać lepsze rezultaty niż JPEG, przede wszystkim nie powoduje efektu bloków, jednak są one słabsze od znacznie prostszych metod opartych na MDCT czy falkach. Nic nie wskazuje na to, że kompresja fraktalna znajdzie szersze zastosowanie.
Kompresja ruchomych obrazów
[edytuj | edytuj kod]Najprostsze systemy kompresji ruchomych obrazów po prostu kompresują każdą klatkę osobno. Jest to bardzo nieefektywne, ponieważ kolejne klatki są zazwyczaj do siebie bardzo podobne.
Zwykle używa się zestawu klatek kluczowych, które kompresuje się tak samo, jak samodzielne obrazki. Pozostałe klatki kompresuje się natomiast, korzystając z danych z klatek poprzednich. Lepsze wyniki dałoby wykorzystanie danych o poprzednich klatkach przy kompresji każdej klatki, jednak utrudniałoby to znacznie przewijanie.
Prostym sposobem wykorzystania danych o poprzednich klatkach jest kodowanie różnicy wartości pikseli o tym samym położeniu, zamiast samych wartości. Tym sposobem można dobrze skompresować sceny, w których kamera jest nieruchoma, jednak nie da to znaczących efektów w scenach z kamerą ruchomą. Zwykle wykorzystuje się więc różne rodzaje kompensacji ruchu. Np. dla każdego bloku podaje się niewielki wektor przesunięcia, np. [2, –1], czyli zamiast tego samego bloku klatki poprzedniej używamy bloku o dwa piksele w prawo i jeden w górę (czy też w lewo i w dół).
Inną ważną techniką wykorzystywaną przy kompresji obrazów ruchomych jest zmienna przepływność (variable bitrate), czyli używanie różnej dokładności dla różnych klatek. Jest wiele sposobów dobierania takich różnic; algorytmy wyboru jakości zwykle są cechą bardziej enkodera, niż formatu. Często enkodery stosują metody dwuprzebiegowe. Pierwszy przebieg po danych zbiera informacje potrzebne algorytmowi zmiennej przepływności, a dopiero drugi kompresuje dane.
Ruchome obrazy są zazwyczaj mocno skompresowane, a więc dla kodeka MPEG, który używa podobnie jak JPEG transformaty kosinusowej, efekty blokowe mogą być bardzo uciążliwe.
Kompresja dźwięku
[edytuj | edytuj kod]Dwa najpopularniejsze publicznie dostępne algorytmy – MP3 i Vorbis – używają podobnych technik. Warto tu omówić algorytm Vorbis, ponieważ używa on bardziej efektywnych rozwiązań.
- Strumień jest dzielony na okna. Okna występują w dwóch rozmiarach – duże (zwykle 2048 próbek) i małe (zwykle 256 próbek). Małe służą do przedstawienia szybko zmieniającego się dźwięku oraz nagłego wzrostu intensywności dźwięku w danej częstotliwości. Nie używa się ich w przypadku spadków intensywności, ponieważ ludzkie ucho jest na nie znacznie mniej czułe. Okna nie są po prostu grupą kolejnych wartości natężenia dźwięku. Okna częściowo się nakrywają i jedna wartość należy w tych obszarach częściowo do kilku okien. Dla obszarów zachodzenia na siebie okien, dana wartość należy do lewego okna w stopniu sin(π/2 ⋅ sin2(π/2 ⋅ t)), gdzie t=0 dla początku obszaru i t=1 dla jego końca.
- Na każdym oknie jest przeprowadzana zmodyfikowana transformata kosinusowa. Zamiast poszczególnych wartości mamy teraz w bloku widmo parametrów MDCT, czyli (pomijając szczegóły) częstotliwości.
- Dane z MDCT są upraszczane zależnie od parametrów kompresji, zgodnie z modelem psychoakustycznym.
- Dane o energii, przypadającej na daną częstotliwość, są skalowane, co umożliwia równie dobrą kompresję dźwięków głośnych i cichych.
- Dane są kwantyfikowane i kompresowane bezstratnie.
Zobacz też
[edytuj | edytuj kod]Linki zewnętrzne
[edytuj | edytuj kod]- Materiały dydaktyczne DSP AGH. dsp.agh.edu.pl. [zarchiwizowane z tego adresu (2013-12-17)].
Przypisy
[edytuj | edytuj kod]- ↑ a b c Leszek Grad. Kompresja stratna dźwięku. „Zeszyty Naukowe Warszawskiej Wyższej Szkoły informatyki”. 2, s. 39–58, 2007. ISSN 1896-396X.
- ↑ PNG can be a lossy format [online], ImageAlpha [dostęp 2024-05-17] (ang.).