Julia - Obrada slike - Gama korekcija, Kolor sistemi

In [1]:
#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.
In [2]:
#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
In [37]:
using Images, TestImages, Colors, ImageContrastAdjustment, LinearAlgebra, FileIO, ImageView
Gtk-Message: 01:16:20.700: Failed to load module "canberra-gtk-module"
Gtk-Message: 01:16:20.701: Failed to load module "canberra-gtk-module"
In [6]:
my_img = testimage("house");
mosaicview(my_img)
Out[6]:
In [10]:
#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)
Out[10]:
In [11]:
#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)
Out[11]:
In [12]:
#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)
Out[12]:
In [13]:
#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)
Out[13]:
In [14]:
my_img = testimage("mandrill");
mosaicview(my_img)
Out[14]:
In [38]:
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
In [39]:
imshow(hue_ch)
Out[39]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>37: "map(clim-mapped image, input…
  "annotations" => 3: "input-2" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 2: "CLim" = CLim{Float32}(0.0, 359.684) CLim{Float32} 
In [40]:
imshow(val_ch)
Out[40]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>74: "map(clim-mapped image, input…
  "annotations" => 40: "input-14" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 39: "CLim" = CLim{Float32}(0.0, 1.0) CLim{Float32} 
In [41]:
imshow(sat_ch)
Out[41]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>111: "map(clim-mapped image, inpu…
  "annotations" => 77: "input-26" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 76: "CLim" = CLim{Float32}(0.0, 1.0) CLim{Float32} 
In [ ]:

In [43]:
#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,:,:];
In [44]:
imshow(y_ch)
Out[44]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>185: "map(clim-mapped image, inpu…
  "annotations" => 151: "input-50" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 150: "CLim" = CLim{Float32}(16.0, 213.996) CLim{Float32} 
In [45]:
imshow(cb_ch)
Out[45]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>222: "map(clim-mapped image, inpu…
  "annotations" => 188: "input-62" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 187: "CLim" = CLim{Float32}(68.0768, 217.647) CLim{Float32} 
In [46]:
imshow(cr_ch)
Out[46]:
Dict{String,Any} with 4 entries:
  "gui"         => Dict{String,Any}("window"=>GtkWindowLeaf(name="", parent, wi…
  "roi"         => Dict{String,Any}("redraw"=>259: "map(clim-mapped image, inpu…
  "annotations" => 225: "input-74" = Dict{UInt64,Any}() Dict{UInt64,Any} 
  "clim"        => 224: "CLim" = CLim{Float32}(48.9476, 177.01) CLim{Float32} 
In [47]:
#ostali koordinatni sistemi mogu se dobiti na analogni način
In [ ]: