#U savremenim sistemima za obradu slike se veoma često javljaju različite nelinearne transformacije koje dovode
#do degradacije slike po pitanju osvetljaja, čime se dobijaju slike niskog kvaliteta (ove ne linearnosti se javljaju
#kao posledica različitih fizičkih procesa u uređajima za akviziciju slike). U tu svrhu se primenjuje tzv. gama
#korekcija - nelinearna transformacija koja u zavisnosti od prosleđenih parametara vrši adaptaciju vrednosti piksela
#u dobijenoj slici koja za cilj ima poništavanje ovih efekata.
#Gama korekcija je korekcija koja uzima piksel čija je vrednost osvetljaja data sa r i njegovu vrednost slika u
#vrednost A * r ^ (gama). Za vrednost parametra gama jednakoj 1 vrši se linearno skaliranje intenziteta piksela sa
#konstantom A. Interesantniji slučajevi su nam kada je parametar gama strogo veci ili strogo manji od broja 1.
#Kada je parametar gamma strogo manji od 1, tada se visoke vrednosti osvetljaja piksela približno očuvaju u toku
#transformacije, dok se nižim vrednostima intenziteta piksela dodeljuju više vrednosti (posmatra se slučaj kada su
#vrednosti intenziteta piksela skalirane na opseg od 0 do 1), i što je gama parametar bliži nuli, to je ovaj efekat
#sve izraženiji i izraženiji.
#Kada je parametar gamma strogo veći od 1, tada se jedino vrši očuvanje izuzetno visokih vrednosti osvetljaja
#piksela, dok za ostatak vrednosti dolazi do opadanja vrednosti
using Images, TestImages, Colors, ImageContrastAdjustment, LinearAlgebra, FileIO, ImageView
my_img = testimage("house");
mosaicview(my_img)
#Ispitajmo zaista šta se dešava u slučaju A = 1, gamma = 0.5
gamma_img = adjust_histogram(Gray.(my_img), GammaCorrection(gamma = 0.5));
mosaicview(gamma_img)
#Kao što možemo videti, zaista, došlo je do očuvanja visokih vrednosti osvetljaja piksela, dok su niske vrednosti
#osvetljaja drastično povećane. Ovaj efekat biće još izraženiji ako uzmemo još manju vrednost gama npr. 0.25
gamma_img = adjust_histogram(Gray.(my_img), GammaCorrection(gamma = 0.25));
mosaicview(gamma_img)
#Pokušajmo sada da vidimo kakve ćemo rezultate dobiti ukoliko uzmemo gama veće od 1.
gamma_img = adjust_histogram(Gray.(my_img), GammaCorrection(gamma = 5));
mosaicview(gamma_img)
#Zaista, očuvane su izuzetno velike vrednosti piksela, dok su one koje nisu ekstremno pri vrhu skale značajno opale.
#Ovaj efekat biće još izraženiji ako se uzme neko veće gama npr. 20
gamma_img = adjust_histogram(Gray.(my_img), GammaCorrection(gamma = 20));
mosaicview(gamma_img)
my_img = testimage("mandrill");
mosaicview(my_img)
hsv_img = HSV.(my_img); #HSV kolor sistem sastoji se sastoji iz tri komponente - govori o tome kako se slika ponaša
# pod svetlom
channels = channelview(float.(hsv_img));
hue_ch = channels[1,:,:]; #komponenta koja govori o nivou nijansiranja piksela osvetljajem
val_ch = channels[3,:,:]; #komponenta koja predstavlja maksimum intenziteta piksela po R, G i B komponentama slike
sat_ch = channels[2,:,:]; #komponenta koja govori o zasićenosti piksela
imshow(hue_ch)
imshow(val_ch)
imshow(sat_ch)
#Još jedan značajan kolor sistem predstavlja YCbCr kolorsistem - on takođe sadrži tri komponente:
#Y - komponenta osvetljaja
#Cb - komponenta razlike plave i Y komponente
#Cr - komponenta razlika crvene i Y komponente
yCbCr_img = YCbCr.(my_img);
channels = channelview(float.(yCbCr_img));
y_ch = channels[1,:,:];
cb_ch = channels[3,:,:];
cr_ch = channels[2,:,:];
imshow(y_ch)
imshow(cb_ch)
imshow(cr_ch)
#ostali koordinatni sistemi mogu se dobiti na analogni način