Wykład nr 1
Wstęp do grafiki w Mathematice

Grafika w Mathematice - import, pobieranie danych, export

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

lenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg"]
datalenna=ImageData[lenna];
Dimensions[datalenna]

lub

datalenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg","Data"];
Dimensions[datalenna]
{Min[datalenna],Max[datalenna]}

lenna - grafika, wyświetlamy przy użyciu Show[]
datalenna - dane, dwuwymiarowa tablica 512 na 512 o trzech pasmach RGB, wyswietlamy przy użyciu Image[]
Otrzymujemy dane z przedziału 0-255, jednak funkcja Image[] interpretuje dane z przedziału 0-1, stąd poniżej dzielimy dane przez 255. Możecie sprawdzić co się stanie gdy tego nie zrobimy :)

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

Możemy takze rozdzielić trzy pasma grafiki funkcją ColorSeparate[]

ColorSeparate[lenna]

Poniżej miejscu wybieramy 128x128 pikseli:
pix - operując na danych przy użyciu Range[]
pix2 - operując na obrazie ImageTake[]

pix=datalenna[[Range[173,300],Range[173,300]]];
Dimensions[pix]
pix2=ImageTake[lenna,{173,300},{173,300}];
Dimensions[pix2]

eyelenna=Image[pix/255,ColorSpace->"RGB"]
eyelenna2=Show[pix2]

Poniżej eksportujemy grafikę do formatu jpg:

Export["c:/Users/wrzask/Desktop/PO/eyelenna.jpg",eyelenna]

Export["c:/Users/wrzask/Desktop/PO/eyelenna2.jpg",eyelenna2]

Poniżej eksportujemy grafikę do formatu gif:

Export["c:/Users/wrzask/Desktop/PO/eyelenna.gif",eyelenna]

Manipulacje danymi na przestrzeni barw

Poniżej do manipulacji na przestrzeni barw trzech kanałów RGB użyłam /. ReplaceAll[]

bluelenna=datalenna/.{R_,G_,B_}->{0,0,B};
Image[bluelenna/255,ColorSpace->"RGB"]

nobluelenna=datalenna/.{R_,G_,B_}->{R,G,0};
Image[nobluelenna/255,ColorSpace->"RGB"]

yellowlenna=datalenna/.{R_,G_,B_}->{R,R,0};
Image[yellowlenna/255,ColorSpace->"RGB"]

greylenna=datalenna/.{R_,G_,B_}->{B,B,B};
Image[greylenna/255,ColorSpace->"RGB"]

Transformacja na przestrzeni barw ICT

ICT czyli RGB->YCbCr to nieodwracalna transformacja na przestrzeni barw

✔  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). 
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. Ludzkie oko wydaje się być bardziej wrażliwe na jaskrawość koloru niż na jego odcień. Kompresje grafiki często wykonuje się na każdej z przestrzeni barw z osobna, stąd 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

Poniżej wykonałam ICT i odwrotną ICT na grafice - w rezultacie otrzymałam tą samą grafikę - z małymi błędami wynikającymi z nieodwracalności transformaty...

lennaICT=datalenna/.{R_,G_,B_}->{0.299 R+0.587 G+0.144 B,-0.16875 R-0.33126 G+0.5 B,0.5 R-0.41867 G-0.08131 B};
datalenna2=lennaICT/.{Y_,Cb_,Cr_}->{Y+1.402Cr,Y-0.34413Cb-0.71414Cr,Y+0.772Cb};
Image[datalenna2/255,ColorSpace->"RGB"]

Poniżej zlikwidowałam kolor "bardzo niebieski" - tzn. wykonałam 100% kompresję na paśmie Cb:

lennaICT=datalenna/.{R_,G_,B_}->{0.299 R+0.587 G+0.144 B,0,0.5 R-0.41867 G-0.08131 B};
datalenna3=lennaICT/.{Y_,Cb_,Cr_}->{Y+1.402Cr,Y-0.34413Cb-0.71414Cr,Y+0.772Cb};
{Image[datalenna/255,ColorSpace->"RGB"],
Image[datalenna3/255,ColorSpace->"RGB"]}

Ćwiczenia na laboratorium

Ćwiczenie nr 1 - 3p.
Należy:
1. Zaimportować dowolną grafikę RGB.
2. Wyciąć fragment grafiki np. 128 na 128 pixeli.
3. Wyciąć jedno pasmo koloru np. czerwone.
4. Exportować tak przygotowaną grafikę.

Ćwiczenie nr 2 - 5p.
Należy:
1. Zaimportować dowolną grafikę RGB (może być z ćwiczenia 1).
2. Wykonać transformację ICT (przejść do przestrzeni YCbCr).
3. Wykonać kompresję 100% (wyzerować) na paśmie Y.
4. Wykonać transformację odwrotną (przejść spowrotem do RGB) z punktu 3.
5. Wykonać kompresję 100% (wyzerować) na paśmie Cb.
6. Wykonać transformację odwrotną (przejść spowrotem do RGB) z punktu 5.
7. Wykonać kompresję 100% (wyzerować) na paśmie Cr.
8. Wykonać transformację odwrotną (przejść spowrotem do RGB) z punktu 7.
9. Porównać otrzymane trzy grafiki z obrazem oryginalnym.
10. Na którym paśmie Y, Cb czy Cr najbardziej opłaca się robić kompresję?

Pytania na kolokwium

Nie ma pytań do tej części wykładu.