Geometria obrazu Wykład 3 Jak oszczędzać przestrzeń i czas ? 1.Przerzedzanie triangulacji – modelowanie terenu, – kompresja danych. 2.Kompresja stratna i bezstratna. 3.Formaty plików graficznych. 4.Kodowanie
Przerzedzanie triangulacji. Niech X = {x 1, x 2,..., x N } R 2 będzie danym zbiorem na płaszczyźnie, a f X = (f(x 1 ), f(x 2 ),..., f(x N )) R N oznacza odpowiadający X ciąg wartości nieznanej funkcji f : R 2 R. Algorytm przerzedzania triangulacji polega na rekurencyjnym usuwaniu punktów ze zbioru X zgodnie z ustalonymi wcześniej kryteriami. Niech n oznacza liczbę usuwanych elementów. Wtedy algorytm przyjmuje następującą ogólną postać: X N :=X; for k:=1 to n do begin zlokalizuj usuwalny punkt x X N-k+1 ; X N-k := X N-k+1 \ x ; end
W wyniku działania tego algorytmu otrzymujemy ciąg zbiorów punktów wyznaczających kolejne triangulacje: X N-n ... X N-1 X N = X. Po usunięciu punktu powstały w ten sposób wielokąt ponownie triangulujemy tak, aby ponownie otrzymać triangulację Delaunay. Ponieważ zaburzenie triangulacji Delaunay ma tylko charakter lokalny, wystarczy tylko striangulować wielokąt wyznaczany przez sąsiadów usuwanego punktu.
Głównym problemem jest zdefiniowanie kryteriów określających usuwalność punktów. Modelowaną powierzchnię przybliżamy funkcjami sklejanymi (spline) będącymi funkcjami liniowymi na każdym trójkącie triangulacji. Dla każdego podzbioru zbioru Y X możemy zdefiniować taką funkcję S Y = {s: s C(CH(Y)) oraz s |T jest liniowa na każdym T DT(Y)}. Fakt. Dla każdego wektora f Y liniowy spline L(Y,f) taki, że L(Y,f)(y) = f(y) dla każdego y Y, jest jednoznacznie określony.
Definicja. Dla danej normy || || w R N błędem aproksymacji funkcji f na zbiorze X przez spline określony na zbiorze Y = X r X nazywamy wartość (Y,X) = ||L(Y,f) |X – f X ||. W zależności od rozpatrywanej normy otrzymujemy np. (Y,X) = max x X |L(Y,f)(x) – f(x)| lub 2 (Y,X) = ( x X |L(Y,f)(x) – f(x)| 2 ) 1/2. Chcielibyśmy dla N-n < k < N znaleźć zbiór Y* X taki, że |Y*| = k oraz (Y*,X) = min Y X, |Y| = k (Y,X).
Niestety tak sformułowany problem jest NP-trudny. Dlatego wykorzystując metodę zachłanną będziemy poszukiwać jak najlepszego rozwiązania. Kryterium usuwalności AT. Dla Y X punkt y* Y jest usuwalny z Y wtedy i tylko wtedy, gdy (Y \ y*,X) = min y Y (Y \ y,X). Wartość e(y) = (Y \ y,X) nazywamy przewidywanym błędem. W zależności od zastosowania stosuje się różne kryteria usuwalności, które wpływają na postać przewidywanych błędów.
Modelowanie terenu. Kryterium usuwalności AT . Dla Y X punkt y* Y jest usuwalny z Y wtedy i tylko wtedy, gdy (Y \ y*,X) = min y Y (Y \ y,X) (określamy minimalne odchylenie). Niech C(y) określa obszar wyznaczany przez sąsiadów punktu y oraz e 1 (y) = (Y \ y,X C(y)). Kryterium usuwalności AT 1. Dla Y X punkt y* Y jest usuwalny z Y wtedy i tylko wtedy, gdy e 1 (y*) = min y Y e 1 (y).
Aby przyspieszyć obliczenia możemy nieco uprościć powyższą definicję. Niech e’(y) = (Y \ y,Y). Wtedy możemy zdefiniować kryterium usuwalności AT 2 w następujący sposób: Dla Y X punkt y* Y jest usuwalny z Y wtedy i tylko wtedy, gdy e’(y*) = min y Y e’(y). Powyższe kryteria odnoszą się do algorytmów przerzedzania dopasowa- nego, tzn. uwzględniającego wartości funkcji f. Można też upraszczać model terenu stosując metody niedopasowane, tzn. bazujące tylko na danych dotyczących zbioru punktów X. Jednym z tego typu kryteriów jest NAT, w którym priorytet wyboru punktów usuwalnych określany jest przez stosunek min y X \ x d(x, y) / min d(x, ), gdzie d( ) jest funkcją odległości a oznacza brzeg obszaru zawiera- jącego X.
Przykład. Modele gór Hurrungane (Norwegia) w NAT i AT 1 i odpowiadające im siatki. [L. Demaret et al. „Adaptive thinning for terrain modeling and image compression”]
Jeszcze inny sposób przerzedzania. Dzielimy przestrzeń na prostopadłościany o zadanych rozmiarach krawędzi. Łączymy w jeden wszystkie wierzchołki znajdujące się w tym samym prostopadłościanie wyznaczając środek ciężkości danego układu. Triangulujemy obszar pokrywany przez trójkąty o wierzchołkach w eliminowanych punktach. Zamiast triangulować obszar od nowa możemy sklejać wierzchołki wzdłuż krawędzi, nadając im odpowiednie wagi. Wybór kolejnej grupy wierzchołków zależy od jakości przybliżenia.
Kompresja obrazu. Jako funkcję f możemy też rozpatrywać jasność obrazu. Wtedy możemy przerzedzać raster. W tym przypadku będziemy starać się minimalizować błąd średnio- kwadratowy (( 2 (Y,X)) 2 /N), gdzie N jest rozmiarem obrazu. Niech e(y) = ( 2 (Y \ y,X)) 2 dla y Y. Minimalizacja e(y) jest równoważna minimalizacji e (y) = ( 2 (Y \y,X C(y))) 2 – ( 2 (Y,X C(y))) 2 dla y Y. Zdefiniujmy kryterium usuwalności AT 2 : Dla Y X punkt y* Y jest usuwalny z Y wtedy i tylko wtedy, gdy e (y*) = min y Y e (y). Postępując podobnie jak poprzednio obliczamy aproksymację L*(Y,F) S Y, gdzie F = f |Y, spełniającą warunek (i,j) X |L*(Y,F)(i,j) – f(i,j)| 2 = min s (i,j) X |s(i,j) – f(i,j)| 2, gdzie s S Y.
Przykład. Porównanie kompresji i dekompresji wykonanych z pomocą algorytmu kompresji SPIHT (b) i AT 2 (d) oraz triangulacja najbardziej znaczących punktów obrazu (c). [L. Demaret et al. „Adaptive thinning for terrain modeling and image compression”]
Kompresja obrazu. Kompresja bezstratna –metoda kompresji informacji do postaci zawierającej zmniejszoną liczbę bitów, pod warunkiem że metoda ta gwarantuje możliwość odtworzenia informacji z postaci skompresowanej do identycznej postaci pierwotnej. Kompresja stratna — metoda zmniejszania liczby bitów potrzebnych do wyrażenia danej informacji, która nie daje gwarancji, że odtworzona informacja będzie identyczna z oryginałem. Dla niektórych danych algorytm kompresji stratnej może odtworzyć informację w sposób identyczny. Algorytmy kompresji stratnej zazwyczaj posługują się modelami psychozmysłowymi.
Formaty plików graficznych JPEG – format kompresji statycznych obrazów rastrowych, charakteryzujący się płynnymi przejściami barw oraz brakiem lub małą ilością ostrych krawędzi i drobnych detali. Został określony na początku lat dziewięćdziesiątych. Wielką innowacją algorytmu JPEG była możliwość kontroli stopnia kompresji w jej trakcie, co umożliwia dobranie jego stopnia do danego obrazka, tak aby uzyskać jak najmniejszy plik, ale o zadowalającej jakości. Umożliwia uzyskanie dużej kompresji obrazu, rzędu 20:1 kosztem pewnej utraty szczegółów, na ogół niezauważalnej. Dyskretna transformata cosinusowa (DCT) przekształca ciąg liczb rzeczywistych g(0), …, g(N-1) na dla k = 1, …, N-1 oraz IDCT ma postać dla m = 0, …, N-1.
Algorytm działa następująco: Obraz jest przetwarzany (opcjonalnie) z kanałów RGB na jasność (luminancję) i 2 kanały barwy (chrominancje). Redukowana jest część pikseli kanałów barwy. Można nie redukować wcale, redukować 2 do 1 lub 4 do 1. Kanały są dzielone na bloki 8 × 8 pikseli. W przypadku kanałów kolorów, jest to 8 × 8 danych po redukcji rozdzielczości, tzn. zazwyczaj16 × 16 pikseli obrazu początkowego. Na blokach wykonywana jest dyskretna transformata cosinusowa (DCT). Zamiast wartości pikseli otrzymujemy średnią wartość wewnątrz bloku oraz częstotliwości zmian wewnątrz bloku. Zastąpienie średnich wartości bloków przez różnice wobec wartości poprzedniej poprawia nieco współczynnik kompresji. Kwantyzacja, czyli zastąpienie danych zmiennoprzecinkowych przez liczby całkowite powoduje straty danych. Większą dokładność stosuje się do danych dotyczących niskich częstotliwości niż wysokich. Współczynniki DCT są uporządkowywane zygzakowato, aby zera leżały obok siebie. Niezerowe współczynniki są kompresowane algorytmem Huffmana. Dla ciągów zer stosuje się inne kody..
Oprócz sekwencyjnego trybu kompresji stratnej zawiera również rozszerzenia: 1.Tryb progresywny kompresji, oparty na DCT, przewidziany do wyświetlania obrazów w trakcie przesyłania danych. Efekt płynnie wyostrzającego się obrazu jest szczególnie dobrze widoczny przy użyciu szybkiego dekompresora i wolnej transmisji danych. Tryb ten zyskał rozpowszechnienie wraz z rozwojem Internetu. 2.Tryb hierarchiczny, pozwalający na zapis w jednym pliku tego samego obrazu jako sekwencji kadrów o różnych rozdzielczościach. Kolejne kadry są kodowane jako różnice względem kadrów poprzednich, o niższej rozdzielczości, a nie jako oddzielne obrazy, co zmniejsza rozmiar pliku. Tryb ten nie definiuje, która z metod kompresji ma zostać użyta. Tryb hierarchiczny umożliwia szybki podgląd obrazów bez czasochłonnej dekompresji obrazów o wysokiej rozdzielczości, co ma zastosowanie np. w fotografii cyfrowej.
TIFF (Tagged Image File Format) – format plików graficznych służący do zapisywania obrazów rastrowych. Został opracowany w 1986 przez grupę firm (m.in. Microsoft i Hewlett- Packard) do drukowania postscriptowego. Format TIFF pozwala na zapisywanie obrazów stworzonych w trybie kreskowym, skali szarości oraz w wielu trybach koloru i wielu głębiach bitowych koloru. Przechowuje ścieżki i kanały alfa, profile koloru, komentarze tekstowe. TIFF umożliwia stosowanie kompresji bezstratnej typu LZW oraz CCITT Group 4.
GIF (Graphics Interchange Format) – format plików graficznych z kompresją bezstratną. Został stworzony w 1987 r. przez firmę CompuServe. Zaletą tego formatu jest niewielki rozmiar plików. Pomimo deklarowanej bezstratności zawęża trochę gamę barw. Ze względu na to, iż do kompresji w formacie GIF może być używany algorytm LZW, na którym ciążą patenty w kilku krajach świata, w 1995 został opracowany konkurencyjny format PNG używający do kompresji algorytmu deflate (oparty na algorytmie LZ77 i kodowaniu Huffmana).
Format PNG (Portable Network Graphics) zapisuje tylko pojedyncze pliki graficzne (nie ma animacji). Kompresja polega na dokonaniu jednej z transformacji każdej z linii obrazu, po czym wynik jest kompresowany za pomocą algorytmu deflate. Numer transformacji jest zapisywany przed linią. Transformacje mają na celu przystosowanie danych do łatwiejszej kompresji. Zapisują one różnicę między wartością rzeczywistą piksela a wartością obliczoną na podstawie funkcji przewidującej, działającej w oparciu o bity już odkodowane. Zwykle różnica ta jest niewielka. Funkcje przewidujące to m.in.: wartość piksela po lewej, średnia wartości pikseli po lewej i na górze, suma wartości pikseli po lewej i na górze minus piksel po lewej górnej przekątnej.
Kodowanie. Entropia – średnia ilość informacji przypadająca na znak, któremu przypisane jest prawdopodobieństwo wystąpienia. Entropię definiujemy jako : H(x) = - n i=1 p(i) log r p(i), gdzie p(i) – prawdopodobieństwo wystąpienia i-tego znaku, a n – liczba wszystkich znaków. Niech L(x) oznacza średnią długość kodu. Efektywność kodowania określamy licząc 100% H(x)/L(x).
Kodowanie arytmetyczne – metoda kodowania dyskretnych źródeł sygnałów, stosowana jako jeden z systemów w bezstratnej kompresji danych. Została wynaleziona przez Petera Eliasa w latach sześćdziesiątych. Dany jest zbiór symboli oraz stowarzyszony z nim zbiór prawdopodobieństw. Wyróżniamy symbol oznaczający koniec komunikatu. Na początku dany jest przedział P = [0,1), który dzielony jest na podprzedziały o szerokościach równych kolejnym prawdopodobieństwom p i. Kolejnym podprzedziałom (ozn. R i ) odpowiadają symbole ze zbioru S. Algorytm kodowania: Dla kolejnych symboli c: 1.Określ, który podprzedział bieżącego przedziału P odpowiada literze c – wynikiem jest R i. 2.Weź nowy przedział P: = R i. 3.Podziel ten przedział P na podprzedziały w sposób analogiczny do tego, jak to miało miejsce na początku. Zwróć liczbę jednoznacznie wskazującą przedział P (najczęściej dolne ograniczenie, albo średnia dolnego i górnego ograniczenia).
Metoda LZ77 korzysta z bufora, który jest podzielony na dwie części: bufor słownikowy (słownik), przechowujący k ostatnio przetwarzanych symboli; bufor wejściowy (bufor kodowania), przechowujący n symboli do zakodowania. Bufor słownikowy obejmuje indeksy 0...k-1, bufor wejściowy k…k+n-1. n i k mogą być dowolne, w praktyce dobiera się je tak, aby były całkowitą potęgą dwójki, dzięki czemu w pełni wykorzystywane są słowa bitowe przeznaczone do ich zapamiętania. Algorytm przebiega następująco: Do bufora wejściowego wstawiane jest n pierwszych symboli wejściowych. Słownik zapamiętuje pierwszy symbol wejściowy i zapisuje go na wyjście. Dopóki w buforze wejściowym są jakieś dane: - W słowniku wyszukiwany jest najdłuższy podciąg równy prefiksowi bufora wejściowego. Wynikiem wyszukiwania jest indeks P wyszukanego podciągu w słowniku oraz jego długość C, ograniczona z góry przez n-1. Jeśli podciągu nie uda się znaleźć, to P może mieć dowolną wartość, natomiast C=0. - Na wyjście wyprowadzana jest trójka (P, C, symbol z bufora wejściowego następujący po dopasowanym podciągu). - W buforze wejściowym przesuwamy się o C+1 pozycji, a na końcu bufora dopisujemy C+1 kolejnych symboli wejściowych.
Kodowanie Shannona Dany jest alfabet i stowarzyszone z nim prawdopodobieństwa. Prawdopodobieństwa (a wraz z nimi symbole) są sortowane w porządku nierosnącym. Dla tak uporządkowanych danych oblicza się niepełne prawdopodobieństwo komulatywne P i, tzn. sumę prawdopodobieństw elementów od 1 do i-1. P 1 =0. Kodowanie Shannona polega na wzięciu –log 2 P i (długość Shannona) pierwszych bitów binarnego rozwinięcia liczby P i (brane są bity po przecinku). Średnia długość kodów mieści się w przedziale [H(S),H(S) + 1), gdzie H(S) to entropia źródła (średnia liczba bitów na symbol).
Kodowanie Shannona-Fano – metoda kompresji bezstratnej autorstwa Roberta Fano. Kodowanie to dla dyskretnego źródła danych znajduje kod prefiksowy (żadne słowo nie jest prefiksem innego), który charakteryzuje się dość dobrą efektywnością – lepszą od kodowania Shannona, nie tworzy jednak optymalnych kodów. Kodowanie Shannona-Fano jest używane np. w kompresorze ZIP. Algorytm kodowania jest następujący: s – ciąg symboli ze zbioru posortowanych wg prawdopodobieństw Funkcja Shannon-Fano(s): 1.Jeśli s zawiera dwa symbole, do słowa kodu pierwszej litery dodaj 0, do słowa kodu drugiej litery – 1. 2.W przeciwnym razie (s zawiera więcej niż dwa symbole) podziel s na dwa podciągi s1 i s2 tak, żeby różnica między sumą prawdopodobieństw liter z s1 i s2 była najmniejsza. Do słów kodu symboli z s1 dodaj 0, do kodów symboli z s2 – 1. Wywołaj rekurencyjnie funkcje: Shannon-Fano(s1) oraz Shannon-Fano(s2).
Kodowanie Huffmana –metoda kompresji bezstratnej. Została opracowana w 1952 r. przez Davida Huffmana. Z uwagi na jego prostotę i efektywność często wykorzystuje się go jako ostatni etap w różnych systemach kompresji, zarówno bezstratnej, jak i stratnej, np. MP3 lub JPEG. Dany jest alfabet źródłowy (zbiór symboli) oraz zbiór stowarzyszonych z nim prawdopodobieństw. Prawdopodobieństwa mogą zostać z góry określone bądź wyznaczone indywidualnie dla każdego zestawu danych. Własności kodu Huffmana : Jest kodem prefiksowym. Średnia długość słowa kodowego jest najmniejsza spośród kodów prefiksowych; Jeśli prawdopodobieństwa są różne, tzn. p i > p j,to długość kodu dla symbolu x i jest niewiększa od kodu dla symbolu x j ; Słowa kodu dwóch najmniej prawdopodobnych symboli mają równą długość. Kompresja polega na zastąpieniu symboli otrzymanymi kodami.
Algorytm Huffmana: Określ prawdopodobieństwo (lub częstość występowania) dla każdego symbolu ze zbioru S. Utwórz listę drzew binarnych, które w węzłach przechowują pary: symbol, prawdopodobieństwo. Na początku drzewa składają się wyłącznie z korzenia. Dopóki na liście jest więcej niż jedno drzewo, powtarzaj: –Usuń z listy dwa drzewa o najmniejszym prawdopodobieństwie zapisanym w korzeniu. –Wstaw nowe drzewo, w którego korzeniu jest suma prawdopodobieństw usuniętych drzew, natomiast one same stają się jego lewym i prawym poddrzewem. Korzeń drzewa nie przechowuje symbolu. Drzewo, które pozostanie na liście, jest nazywane drzewem Huffmana – prawdopodobieństwo zapisane w korzeniu jest równe 1, natomiast w liściach drzewa zapisane są symbole. Algorytm jest niedeterministyczny (dowolny wybór drzew o takim samym prawdopodobieństwie i kolejności poddrzew). Jednak niezależnie od sposobu wyborów średnia długość kodu pozostaje taka sama. Na podstawie drzewa Huffmana tworzone są słowa kodowe w następujący sposób: Każdej lewej krawędzi drzewa przypisz 0, prawej 1. Przejdź w głąb drzewa od korzenia do każdego liścia (symbolu). Przy skręcie w prawo, dopisz do kodu bit o wartości 1, w przeciwnym razie dopisz 0. Długość słowa kodowego jest równa głębokości symbolu w drzewie.
Przykład, że kodowanie Shannona-Fano różni się od kodowania Huffmana. Niech dane symbole występują z odpowiednim prawdopodobieństwem: A – 14/36, B – 7/36, C – 6/36, D – 5/36 i E – 4/36. Wtedy kod Shannona-Fano ma postać: A – 00, B – 01, C – 10, D – 110, E – 111, natomiast kod Huffmana jest następujący: A – 0, B – 100, C – 101, D – 110, E – 111.
Dziękuję za uwagę.