Uvod u programski jezik Julia - Obrada slike - Histogram, ekvalizacija histograma

In [1]:
# U obradi slike često se javlja potreba za takozvanim histogramom slike. Histogram slike predstavlja grafički 
# prikaz koliko je piksela naše slike određenog intenziteta (bilo da se radi o RGB slikama, crno-belim slikama, 
# slikama u intenzitetima sive boje itd.). Histogram kao takav često predstavlja gradivni element algoritama za 
# segmentaciju slike, izdvajanje objekata na slici (npr. izdvajanje teksta od pozadine), popravku kvaliteta slike itd.
In [2]:
#Pre svega, potrebno je izvršiti instaliranje odgovarajućeg paketa za rad sa histogramom slike
import Pkg;
Pkg.add("ImageContrastAdjustment");
   Updating registry at `~/.julia/registries/General`
    
   Updating git-repo `https://github.com/JuliaRegistries/General.git`
[1mFetching: [========================================>]  100.0 %[36mFetching: [=====>                                   ]  11.0 %Fetching: [=====>                                   ]  12.1 %Fetching: [======>                                  ]  13.8 %Fetching: [=======>                                 ]  15.2 %Fetching: [=======>                                 ]  16.4 %Fetching: [========>                                ]  18.5 % [===========>                             ]  26.1 %.9 %Fetching: [=============>                           ]  32.1 %Fetching: [==============>                          ]  34.2 %Fetching: [===============>                         ]  36.2 %Fetching: [================>                        ]  38.5 % [====================>                    ]  49.2 %Fetching: [========================>                ]  58.0 %Fetching: [=============================>           ]  70.8 %Fetching: [=============================>           ]  71.5 %Fetching: [==============================>          ]  73.0 %Fetching: [==============================>          ]  73.6 %Fetching: [==============================>          ]  74.3 %Fetching: [==============================>          ]  74.8 %Fetching: [===============================>         ]  75.4 %Fetching: [===============================>         ]  75.8 %Fetching: [===============================>         ]  76.3 %Fetching: [===============================>         ]  76.7 %Fetching: [===============================>         ]  77.2 %Fetching: [================================>        ]  77.7 %Fetching: [================================>        ]  78.3 %Fetching: [================================>        ]  78.9 %Fetching: [================================>        ]  79.5 % [====================================>    ]  88.4 %Fetching: [======================================>  ]  92.9 %Fetching: [=======================================> ]  96.1 %
  Resolving package versions...
   Updating `~/.julia/environments/v1.4/Project.toml`
  [f332f351] + ImageContrastAdjustment v0.3.7
   Updating `~/.julia/environments/v1.4/Manifest.toml`
 [no changes]
In [12]:
using ImageContrastAdjustment, TestImages, Images, Plots
In [13]:
my_img = testimage("house.tif");
mosaicview(my_img)
Out[13]:
In [21]:
#Histogram slike prikazane u nijansama sive možemo dobiti npr. na sledeći način:

#UInt8 ce predstavljati tip podataka tj. opseg vrednosti u kojem želimo da predstavimo vrednosti intenziteta 
#osvetljaja našeg piksela
histogram(vec(reinterpret(UInt8, my_img)))
Out[21]:
In [24]:
#Ukoliko radimo sa npr. slikom u RGB formatu, i želimo da vidimo kako bi izgledao njen histogram osvetljaja, to
#možemo uraditi na sledeći način:

my_img = testimage("coffee.png");
my_img2 = Gray.(my_img);

mosaicview(my_img, my_img2)
┌ Warning: `mosaicview(A1::AbstractArray, A2::AbstractArray; kwargs...)` is deprecated, use `mosaic(A1, A2; kwargs...)` instead.
│   caller = top-level scope at In[24]:6
└ @ Core In[24]:6
Out[24]:
In [25]:
histogram(vec(reinterpret(UInt8, my_img2)))
Out[25]:
In [38]:
# Ekvalizacija histograma predstavlja pokušaj da se histogram učini što
#uniformnijim po vrednosti intenziteta piksela po svim mogućim
#vrednostima piksela. Na primer, pokušajmo da izvršimo ekvalizaciju histograma 
#nad prvom slikom u ovoj svesci:

my_img = testimage("house.tif");
my_img = Gray.(my_img);
equalized_img = adjust_histogram(my_img, Equalization(nbins = 256));
mosaicview(my_img, equalized_img)
┌ Warning: `mosaicview(A1::AbstractArray, A2::AbstractArray; kwargs...)` is deprecated, use `mosaic(A1, A2; kwargs...)` instead.
│   caller = top-level scope at In[38]:9
└ @ Core In[38]:9
Out[38]:
In [39]:
#Pogledajmo sada histogram novodobijene slike
histogram(vec(reinterpret(UInt8, equalized_img)))
Out[39]:
In [40]:
#Zaista, vidimo da je histogram novodobijene slike značajno uniformniji nego što je to slučaj sa originalnom slikom.
In [41]:
#Ono gde ekvalizacija histograma ima veliku primenu jeste popravka kontrasta slike.
my_img = load("problem_kontrast.jpg")
Out[41]:
In [42]:
histogram(vec(reinterpret(UInt8, my_img)))
Out[42]:
In [43]:
#Zaista, vidimo da je opseg vrednosti intenziteta piskela od otprilike
#vrednosti 10 do otprilike vrednosti intenziteta 80, što predstavlja problem niskog kontrasta. Za rešavanje ovog
#problema sjajnu mogućnost predstavlja mogućnost ekvalizacije histograma:

equalized_img = adjust_histogram(my_img, Equalization(nbins = 256));
mosaicview(my_img, equalized_img)
┌ Warning: `mosaicview(A1::AbstractArray, A2::AbstractArray; kwargs...)` is deprecated, use `mosaic(A1, A2; kwargs...)` instead.
│   caller = top-level scope at In[43]:6
└ @ Core In[43]:6
Out[43]:
In [44]:
#Zaista, vidimo sjajno popravljanje kontrasta kod date slike. Za kraj daćemo prikaz ekvalizovanog histograma
histogram(vec(reinterpret(UInt8, equalized_img)))
Out[44]:
In [ ]: