Wykład 12 - Zastosowanie transformaty falkowej w grafice:
Dekompozycja Haara w dwóch wymiarach
JPEG2000 Standard
przygotowała Klaudia Wrzask

Grafika w Mathematice - import, pobieranie danych

Poniżej import obrazka z podaną ścieżką:

lenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg"]
datalenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg","Data"];
pixellenna=datalenna[[All,All,1]];
Dimensions[datalenna]

Image[datalenna/255,ColorSpace->"RGB"]

DEKOMPOZYCJA HAARA W DWÓCH WYMIARACH

Transformata Haara

Procedura na transformatę Haara

DHWT[input_List]:=Module[{ output={}},
x=input;
yLP[x_List,n_]:=0.5 (x[[n-1]]+x[[n]]);
yHP[x_List,n_]:=0.5 (x[[n-1]]-x[[n]]);
While[1≤Length[x],
x=PrependTo[x,0];
y0=Table[yLP[x,n],{n,2,Length[x]}];
y0=Take[y0,{2,Length[y0],2}];
y1=Table[yHP[x,n],{n,2,Length[x]}];
y1=Take[y1,{2,Length[y1],2}];
x=y0;
If[Length[y0]==1,y1=Join[y0,y1]];
output=Flatten[AppendTo[y1,output]];
];
output];

A tutaj dużo szybsza, można też sobie dobrać poziom rozdzielczości

FastDHWT[x_List,i_]:=
Module[
{y,g,h,j,n,whatisleft},
h={1,1};g={1,-1}; 
y=x;
n=Length[y];
For[
j=1,j≤i,
whatisleft=If[j==1,{},Take[y,{n/2^(j-1)+1,n}]];
y=Take[y,n/2^(j-1)];
y=Partition[y,2];
y=Flatten[Join[y.h/2,y.g/2,whatisleft]];
j++
];
Return[N[y]]
];

dane=Table[N[Sin[2 Pi 440 n/8000]],{n,1,2^15}]

Różnice w czasie

DHWT[dane]
FastDHWT[dane,8]

Timing[DHWT[dane];]

Timing[FastDHWT[dane,15];]

Poniżej "jeden pozoim rozdzielczości" transformaty odwrotnej

IDHWT[y_]:=Module[{z,g,h},h={1,1};g={1,-1};z=Transpose[Partition[y,Length[y]/2]];Return[Flatten[Transpose[{z.h,z.g}]]]];

Ćwiczenie:
Napisać jeszcze szybszą prodedurę na transformatę falkową Haara i odwrotną tranfrormatę falkową - w sumie nie musi być w mathematice

Przykład procedur transformaty falkowej Haara w 2D:

DownSample[x_List]:=Module[{i=1,y={}},While[i≤Length[x],If[Mod[i,2]==0,AppendTo[y,x[[i]]];i=++i,i=++i]];y];

LP[input_List]:=Module[{ output={}},
x=input;
yLP[n_]:=x[[n-1]]/2+x[[n]]/2;
x=PrependTo[x,0];
y=Table[yLP[n],{n,2,Length[x]}];
y=DownSample[y];
output=y
;output];

HP[input_List]:=Module[{ output={}},
x=input;
yHP[n_]:=x[[n-1]]/2-x[[n]]/2;
x=PrependTo[x,0];
y=Table[yHP[n],{n,2,Length[x]}];
y=DownSample[y];
output=y
;output];

LPCol[input_List]:=Module[{ output={}},
{imax,jmax}=Dimensions[input];
output=Table[LP[input[[i,All]]],{i,imax}]
;output];

HPCol[input_List]:=Module[{ output={}},
{imax,jmax}=Dimensions[input];
output=Table[HP[input[[i,All]]],{i,imax}]
;output];

Dekompozycja obrazu:

Wykonujemy transformatę low-pass w wierszach i kolumnach

ll=LPCol[pixellenna];
ll=Transpose[ll];
ll=LPCol[ll];
ll=Transpose[ll];
LLplot=Image[ll/255]

Dimensions[ll]

Wykonujemy transformatę low-pass na wierszach i high-pass na kolumnach (w danym wierszu wykonujemy high-pass, w danej kolumnie low-pass):

hl=HPCol[pixellenna];
hl=Transpose[hl];
hl=LPCol[hl];
hl=Transpose[hl];
HLplot=Image[1-hl/Max[hl]]

Wykonujemy transformatę high-pass na wierszach i low-pass na kolumnach (w danym wierszu wykonujemy low-pass, w danej kolumnie high-pass):

lh=LPCol[pixellenna];
lh=Transpose[lh];
lh=HPCol[lh];
lh=Transpose[lh];
LHplot=Image[1-lh/Max[lh]]

Wykonujemy transformatę high-pass na wierszach i high-pass na kolumnach:

hh=HPCol[pixellenna];
hh=Transpose[hh];
hh=HPCol[hh];
hh=Transpose[hh];
HHplot=Image[1-hh/Max[hh]]

Komentarz:
W lewym górnym rogu obraz powstaje przez przepuszczenie wiesrzy i kolumn macierzy przez filtry dolnoprzepustowe;
W prawym górnym wiersze przepuszczamy przez filtr dolnoprzepustowy, kolumny przez filtr górnoprzepustowy;
W lewnym dolnym rogu obraz powstaje przez przepuszczenie wierszy przez filtr górnoprzepustowy, a kolumn przez dolnoprzepustowy;
W prawym dolnym i wiersze i kolumny zostają przepuszczone przez filtry.
Zastanów się:
Dlaczego w obrazie w prawym górnym rogu nie widać konturów wertykalnych,
a w lewym dolnym nie widać konturów horyzontalnych?

GraphicsGrid[{{LLplot,LHplot},{HLplot,HHplot}}]

Możemy w analogiczny sposób przeprowadzić analizę Haara na kolejnych poziomach rozdzielczości:

llll=LPCol[ll];
llll=Transpose[llll];
llll=LPCol[llll];
llll=Transpose[llll];
LLLLplot=Image[llll/255];

llhl=HPCol[ll];
llhl=Transpose[llhl];
llhl=LPCol[llhl];
llhl=Transpose[llhl];
LLHLplot=Image[1-llhl/Max[llhl]];

lllh=LPCol[ll];
lllh=Transpose[lllh];
lllh=HPCol[lllh];
lllh=Transpose[lllh];
LLLHplot=Image[1-lllh/Max[lllh]];

llhh=HPCol[ll];
llhh=Transpose[llhh];
llhh=HPCol[llhh];
llhh=Transpose[llhh];
LLHHplot=Image[1-llhh/Max[llhh]];

LLLL=GraphicsGrid[{{LLLLplot,LLLHplot},{LLHLplot,LLHHplot}}]

GraphicsGrid[{{LLLL,LHplot},{HLplot,HHplot}}]

Ćwiczenie: 
Wyznaczanie konkurów w grafice - za pomocą filtrów górnoprzepustowych. Tutaj nie musimy używać downsample. Sqrt[LH^2+HL^2] daje "ładne" kontury.

Ćwiczenie:
Napisać procedurę na transformatę falkową Haara i odwrotną transformatę falkową w 2D - może być na zasadzie procedur falkowych ze standardu jpeg2000 - niekoniecznie w Mathematice.

Falki Haara w Mathematice

Dyskretną transformatę falkowa możemy wyznaczyć w Mathematice przy pomocy DiscreteWaveletTransform[] - domyślnie używana jest właśnie transformata Haara.
Opniżej operacje wykonane na grafice, aby wświetlić dekompozycję falkową używamy WaveletImagePlot[]

dwtImage=DiscreteWaveletTransform[lenna,Automatic,5]

dwtImage[All,"Image"]

WaveletImagePlot[dwtImage,ImageSize->Large]

Poniżej operacje wykonane na danych, wtedy wyświetlamy WaveletMatrixPlot[]

dwtData=DiscreteWaveletTransform[pixellenna,Automatic,3]

WaveletMatrixPlot[dwtData,ImageSize->Large]

JPEG2000
Cechy algorytmu

- Algorytm stratnej i bezstratnej kompresji obrazów barwnych oraz w stopniach szarości jest oparty o transformatę falkową.
- Dla kompresji stratnej i bezstratnej dostępne są możliwości kodowania progresywnego, piramidowego oraz kodowania progresywnego względem ROI (region of interests). Swobodny jest zatem dostęp do fragmentów obrazu.
- Dla kompresji stratnej otrzymujemy lepszą jakość w porównaniu z JPEG przy tym samym współczynniku bpp (bit per pixel). Dla współczynników poniżej 0.25 bpp jakość jest znacznie lepsza.
- JPEG2000 ma także lepsza odporność na błędy w transmiji w porównaniu z JPEG.
- W dalszym ciągu taka kompresja jest stratna przedewszystkim ze względu na kwantyzację i odrzucanie pakietów wyższych warstw jakości.
- W dalszym ciągu jest nieodwracalną ze względu na transformację przestrzeni barw i DWT.
- plik o rozserzeniu .jp2 można otworzyć w: 
    Apple QuickTime Player
    Adobe Photoshop CS5
    Adobe Photoshop Elements 9
    ACD Systems Canvas 12
    ACDSee Photo Manager 12
    CorelDRAW Graphics Suite X5
    Corel PaintShop Photo Pro X3
    Mozilla Firefox
    Google Chrome
    IvanView

Kroki algorytmu

1. Color Components - Przestrzeń barw

Kolor obrazu składa się z trzech przestrzeni barw. Pierwszym krokiem w JPEG2000 jest transformacja kolorów transformatą ICT (irreversible color transform) lub RCT (reversible color transform).

ICT

ICT czyli RGB->YCbCr stosuje się tylko z nieodwracalną transformatą falkową.

YCbCr (lub inaczej YUV) to sposób zapisu kolorów za pomocą trzech wartości liczbowych opisujących dany kolor, podobnie jak w przypadku RGB – zapisu kolorów powszechnie stosowanego w informatyce (R – jak bardzo czerwony jest kolor,G – jak bardzo zielony,B – jak bardzo niebieski). Jednak w przypadku YCbCr odbywa się to w troszkę inny sposób.
Tutaj wartość Y oznacza jasność danego koloru i nazywana jest „luminancją” jaskrawością, natomiast wartości Cb i Cr oznaczają odpowiednio jak bardzo niebieski i czerwony jest dany kolor i nazywane są wspólnie „chrominancją”- odcieniem. 

Ludzkie oko, a szczególnie siatkówka, zawiera dwa rodzaje komórek wzrokowych: komórki służące do widzenia w nocy, które wykrywają tylko odcienie szarości od jaskrawo białego do czarnego, oraz komórki widzenia dziennego, które odbierają odcienie poszczególnych kolorów. 

Pierwsze komórki reagując na kolor odbierają go w skali szarości podobnie jak poprzez wartość luminancji. 

Drugie komórki, odpowiedzialne za wykrywanie kolorów, odbierają wartość podobną do chrominancji. Standard JPEG2000 bierze pod uwagę fakt, że ludzkie oko wydaje się być bardziej wrażliwe na jaskrawość koloru niż na jego odcień. Kompresje wyknuje się na kążdej z przestrzeni barw z osobna i dlatego możliwa jest większa kompresja na przestrzeni odcieni, przy niezauważalnej wizualnie stracie obrazu.

Transformacja ICT jest zdefiniowana jako:
Y=0.299R+0.587G+0.144B
Cb=-0.16875R-0.33126G+0.5B
Cr=0.5R-0.41867G-0.08131B

Transformacja odwrotna ICT jest zdefiniowana:
R=Y+1.402Cr
G=Y-0.34413Cb-0.71414Cr
B=Y+0.772Cb

ict={{0.299,0.587,0.144},{-0.16875,-0.33126,0.5},{0.5,-0.41867,-0.08131}};
ict//MatrixForm

Inverse[ict]//MatrixForm

RCT

RCT czyli RGB -> YC1C2. 
Może być używana dla obu transformat falkowych Cohen-Daubechies-Feauveau  9/7 i transformaty 5/3.

Transformacja RCT jest zdefiniowana jako:
Y=0.25R+0.5G+0.25B
C1=R-G
C2=B-G

Transformacja odwrotna RCT jest zdefiniowana jako:
G=Y-0.25C1-0.25C2
R=C1+G
B=C2+G

Możliwe ćwiczenie do wykonania:
Dla transformacji koloru RCT zbadać w jakim paśmie najbardziej opłaca się wykonanie kompresji (Y, C1, C2) na przykładzie Lenny i innych grafik.

DC level Shifting

Transformacja kolorów jest opcjonalna. Jednak w ten sposób można uzyskać lepsze współczynniki kompresji przy mniejszym pogorszeniu obrazu.
W poniższym przykładzie nie dokonamy transformacji kolorów i będziemy operować na paśmie R:

Image[pixellenna/255]

Proces DC level Shifting transformuje wszystkie wartości pixeli z ich oryginalnych wartości [0,(2^s)-1] na [-(2^(s-1)),(2^(s-1))-1] czyli (prawie)symetryczne. W naszym wypadku z [0,255] na [-128,127].

pixellennaRDC=pixellenna-128;
ListDensityPlot[pixellennaRDC,Mesh->False]

2. Tiling - Dzielenie obrazu na "kafelki"

Każdy z trzech komponentów koloru jest podzielony na prostokątne "kafelki" (tiles). Skoro komponenty kolorów mają różną rozdzielczość, "kafelki" różnych kolorów mogą także być różnej wielkości. "Kafelki" mogą mieć każda, nawet wielkość całego obrazu.  Każdy "kafelek" jest skompresowany idywidualnie.
Główny powód dla którego blokuje się obraz jest taki, by użytkownik mógł swobodnie odkodować tą część obrazu, która go interesuje. Dekoder używany w JPEG2000 jest w stanie zidentifikowac każdy "kafelek" i odkompresowac tylko te pixele w nim zawarte. Typowy rozmiar "kafelka" to 256X256 pikseli.

pixellennaRDCTile=datalenna[[Range[128,383],Range[128,383],1]]-128;

ListDensityPlot[pixellennaRDCTile]

3. The Wavelet Transform

W standardzie JPEG2000 używane są dwie transformaty falkowe:
Cohen-Daubechies-Feauveau 9/7 i transformata 5/3.

Cohen-Daubechies-Feauveau 9/7 transform  *procedury autorstwa Aleksa Jakulin

Jest transformatą nieodwracalną i stosuje się ją przy kompresji stratnej.
Jest wykonywana w sześciu krokach.

α=-1.586134342;
β=-0.052980118;
γ=0.882911075;
δ=0.443506852;
K=1.230174105;
DWT97 =Compile[{{X,_Real,1}}, Module[{n,N=Length[X]},Y=X;
For[n=0,2n+3<=N,Y[[2n+2]]=X[[2n+2]]+α(X[[2n+1]]+X[[2n+3]]);n++];
For[n=1,2n+2<=N,Y[[2n+1]]=X[[2n+1]]+β(Y[[2n]]+Y[[2n+2]]);n++];
For[n=0,2n+3<=N,Y[[2n+2]]=Y[[2n+2]]+γ(Y[[2n+1]]+Y[[2n+3]]);n++];
For[n=1,2n+2<=N,Y[[2n+1]]=Y[[2n+1]]+δ(Y[[2n]]+Y[[2n+2]]);n++];
For[n=0,2n+2<=N,Y[[2n+2]]=-K  Y[[2n+2]];n++];
For[n=0,2n+1<=N,Y[[2n+1]]=(1/K)Y[[2n+1]];n++];
Return[Y]]];
IDWT97 =Compile[{{Y,_Real,1}}, Module[{n,N=Length[Y]},X=Y;
For[n=0,2n+1<=N,X[[2n+1]]=K Y[[2n+1]];n++];
For[n=0,2n+2<=N,X[[2n+2]]=-(1/K) Y[[2n+2]];n++];
For[n=1,2n+2<=N,X[[2n+1]]=X[[2n+1]]-δ(X[[2n]]+X[[2n+2]]);n++];
For[n=0,2n+3<=N,X[[2n+2]]=X[[2n+2]]-γ(X[[2n+1]]+X[[2n+3]]);n++];
For[n=1,2n+2<=N,X[[2n+1]]=X[[2n+1]]-β(X[[2n]]+X[[2n+2]]);n++];
For[n=0,2n+3<=N,X[[2n+2]]=X[[2n+2]]-α(X[[2n+1]]+X[[2n+3]]);n++];
Return[X]]];

Poniżej przykład zastosowania transformaty falkowej:

DWT97[{1,2,3,4,5,6,7,8,9,10}]
IDWT97[DWT97[{1,2,3,4,5,6,7,8,9,10}]]

Przed transformatą ekstrapolujemy wiersze wg. metody periodyc symmetryc expansion. Np. jezeli musimy ekstrapolować ciąg A B C D E F G:
... E D C B  | A B C D E F G |  F E D C...

VectorExtend =Compile[{{X,_Real,1}}, Join[Join[Reverse[Drop[Take[X,5],1]],X],Reverse[Drop[Take[X,-5],-1]]]];
VectorShrink =Compile[{{X,_Real,1}}, Drop[Drop[X,4],-4]];
ExtDWT[X_]:=VectorShrink[DWT97[VectorExtend[X]]];
ExtIDWT[X_]:=VectorShrink[IDWT97[VectorExtend[X]]];

VectorExtend[{1,2,3,4,5,6,7,8,9,10}]

VectorShrink[%]

Poniżej widać, że transformata falkowa teraz różni się o krańcowe punkty:

ExtDWT[{1,2,3,4,5,6,7,8,9,10}]
ExtIDWT[ExtDWT[{1,2,3,4,5,6,7,8,9,10}]]

ImgDWT=Compile[{{X,_Real,2}},ExtDWT /@ Transpose[ExtDWT /@ Transpose[X]]];
ImgIDWT=Compile[{{X,_Real,2}},ExtIDWT/@Transpose[ExtIDWT/@X]];

W tej transformacie filtry H i L są przemieszane dlatego dla analizy warto je poprzekładać:

DeInterleave2[X_]:= 
Table[
Table[
Table[
X[[2a-i,2b-j]],
{a,1,Dimensions[X][[1]]/2},
{b,1,Dimensions[X][[2]]/2}],
{i,1,0,-1}],
{j,1,0,-1}];

Interleave2[X_]:=
Flatten[
Table[
{
Flatten[Table[{X[[1,1,a,b]],X[[1,2,a,b]]},{a,1,Dimensions[X][[3]]}]],
Flatten[Table[{X[[2,1,a,b]],X[[2,2,a,b]]},{a,1,Dimensions[X][[3]]}]]
},
{b,1,Dimensions[X][[4]]}],
1]

Poniżej pokazałam na czym polega "przekładanie macierzy" - z jednej macierzy otrzymujemy cztery o wymiarach o połowę mniejszych: 
Górny lewy róg - nr rzędu i kolumny macierzy test nieparzysty - LL (ogół obrazu)
Górny prawy róg - nr rzędu parzysty, kolumny nieparzysty  - HL (szczegóły horyzontalne)
Dolny lewy róg - nr rzędu nieparzysty, kolumny parzysty  - LH (szczegóły wertykalne)
Dolny prawy róg - nr rzędu i kolumny macierzy test parzysty - HH (szczegóły na diagonaliach)

test={{1,2,3,4},{1,2,3,4},{5,6,7,8},{5,6,7,8}};
test//MatrixForm
Dimensions[test]
dec=DeInterleave2[test];
dec//MatrixForm
Dimensions[dec]

isub = ImgDWT[pixellennaRDCTile];
Dimensions[isub]
decomp = DeInterleave2[isub];
Dimensions[decomp]

GraphicsGrid[Map[Image[(#+128)/255]&,decomp,{2}]]

Powyżej - nie wiem na ile to widać - mamy krawędzie wertykalne w lewym dolnym rogu (włosy), horyzontalne w prawym górnym (usta, brwi) i diagonalne w prawym dolnym rogu.

Daubechies 5/3 transform  *procedury autorstwa Aleksa Jakulin

Ta transformata jest odwracalna i stosuje się ją dla kompresji stratnej i bezstratnej.
Pytanie: dlaczego transformata Daubechies 5/3 jest odwracalna a Daubechies 9/7 nie?
Jest wykonywana tylko w dwóch krokach.

DWT53 =Compile[{{X,_Real,1}}, Module[{n,N=Length[X]},Y=X;
For[n=0,2n+3<=N,Y[[2n+2]]=X[[2n+2]]-1/2 (X[[2n+1]]+X[[2n+3]]);n++];
For[n=1,2n+2<=N,Y[[2n+1]]=X[[2n+1]]+1/4 (Y[[2n]]+Y[[2n+2]]+2);n++];
Return[Y]]];
IDWT53 =Compile[{{Y,_Real,1}}, Module[{n,N=Length[Y]},X=Y;
For[n=1,2n+2<=N,X[[2n+1]]=Y[[2n+1]]-1/4 (Y[[2n]]+X[[2n+2]]+2);n++];
For[n=0,2n+3<=N,X[[2n+2]]=Y[[2n+2]]+1/2 (X[[2n+1]]+X[[2n+3]]);n++];
Return[X]]];

DWT53[{1,2,3,4,5,6,7,8,9,10}]
IDWT53[DWT53[{1,2,3,4,5,6,7,8,9,10}]]

X - są to piksele przed transformacją, Y - po. Pasmo L dolnoprzepustowe tworzą Y nieparzyste, pasmo H górnoprzepustowe - parzyste. Tak jak w poprzedniej transformacie należy dane najpierw ekstrapolować:

VectorExtend =Compile[{{X,_Real,1}}, Join[Join[Reverse[Drop[Take[X,3],1]],X],Reverse[Drop[Take[X,-3],-1]]]];
VectorShrink =Compile[{{X,_Real,1}}, Drop[Drop[X,2],-2]];
ExtDWT[X_]:=VectorShrink[DWT53[VectorExtend[X]]];
ExtIDWT[X_]:=VectorShrink[IDWT53[VectorExtend[X]]];

ImgDWT=Compile[{{X,_Real,2}},ExtDWT /@ Transpose[ExtDWT /@ Transpose[X]]];
ImgIDWT=Compile[{{X,_Real,2}},ExtIDWT/@Transpose[ExtIDWT/@X]];

I porozdzielać filtry L i H:

DeInterleave2[X_] := Table[Table[Table[X[[2a-i,2b-j]],{a,1,Dimensions[X][[1]]/2},{b,1,Dimensions[X][[2]]/2}],{i,1,0,-1}],{j,1,0,-1}];
Interleave2[X_]:=Flatten[Table[{Flatten[Table[{X[[1,1,a,b]],X[[1,2,a,b]]},{a,1,Dimensions[X][[3]]}]],Flatten[Table[{X[[2,1,a,b]],X[[2,2,a,b]]},{a,1,Dimensions[X][[3]]}]]},{b,1,Dimensions[X][[4]]}],1]

isub = ImgDWT[pixellennaRDCTile];
decomp = DeInterleave2[isub];

GraphicsGrid[Map[Image[(#+128)/255]&,decomp,{2}]]

4. Quantization - Kwantyzacja współczynników transformaty *procedury autorstwa Aleksa Jakulin

Krok kwantyzacji dobierany jest do każdego podpasma HL LH i HH z osobna. Gdy chcemy uzyskać kompresję bezstratną krokiem kwantyzacji jest poprostu N=1.

Quantize[N_]:= X_?NumberQ:>(Round[X/N])*N;
qdecomp = decomp;
qdecomp[[2,2]] = decomp[[2,2]]/.Quantize[128];  (* pasmo HH *)
qdecomp[[1,2]] = decomp[[1,2]]/.Quantize[32]; (* pasmo HL *)
qdecomp[[2,1]] = decomp[[2,1]]/.Quantize[1] ; (* pasmo LH *)
GraphicsRow[{
Image[(ImgIDWT[Interleave2[qdecomp]]+128)/255],
Image[(pixellennaRDCTile+128)/255]}]

Dla kompresji stratnej współczynnik po kwantyzacji V=[X/N], gdzie X jest współczynnikiem przed kwantyzacją, a N-krokiem kwatyzacji. Wartość kroku N dołączona jest do zakodowanego obrazu.

GraphicsGrid[Map[Image[(#+128)/255]&,qdecomp,{2}]]

Zwróć uwagę, że w podpaśmie HH (prawy dolny róg),
 gdzie kwantyzacja była zrobiona z największym krokiem kompresja jest największa - właściwie jest to wyzerowanie wszystkich współczynników.

Ćwiczenie: 
Przeprowadzić kwantyzację na wszystkich trzech pasmach: LH, HL, HH ze współczynnikiem N=128 (właściwie jest to sytuacja w krórej zerujemy 3/4 współczynników transformaty) - czy widać dużą różnicę w pogorszeniu jakości obrazu? Ćwiczenie można wykonać na różnych grafikach lub porównać metodę z transformatą Cohen-Daubechies-Feauveau 9/7 lub transformatą Haara

Ćwiczenie: 
Przeprowadzić transformatę na kolejnym poziomie rozdzielczości (całą procedurę powtarzamy na LL), wykonać kompresję na LL-LH, LL-HL, LL-HH, LH, HL, HH, odtworzyć obraz - czy zauważamy znaczne pogorszenie obrazu? Procedurę można przeprowadzić jeszcze raz na LL-LL.

Ćwiczenie: 
Przeprowadzić kompresję w trzech pasmach kolorów (niekoniecznie na każdym taką samą), a najlepiej także wykonać wcześniej transformatę na kolorach.

Literatura

Charilaos Christopolous, Athanassios Skodras - The JPEG2000 Still Image Coding System: Am Overview; Nov 2000
David Salomon - Data Compression
*Aleks Jakulin - Introduction to Wavelets for Image Compression; notebook (stąd pochodą procedury DWT97 i IDWT97 i kwantyzacji) 
http://www.stat.columbia.edu/~jakulin/Wavelets/index.html

Pytania na kolokwium

1. Na czym polega dekompozycja falkowa obrazu? p.p 
2. Jakie są główne kroki algorytmu Jpeg2000? - opisz jeden z nich p.p 
3. Na czym polegają transformacje w przestrzeni barw w standardzie Jpeg2000, dlaczego kompresja w takich przestrzeniach barw jest bardziej skuteczna niż w przestrzeni RGB? p.r.
4. Transformaty falkowe w standardzie Jpeg2000 p.r.
5. Na czym polega procedura kwantyzacji w standardzie Jpeg2000? p.r.