% Otsu kuszobolo algoritmus
% im: szurkearnyalatos uint8 kep
% imres: binaris eredmenykep
% thresh: az algoritmus altal meghatarozott optimalis kuszobertek
function [result, thresh] = myOtsu(im)

% L: az intenzitasok szama; uint8 tipus eseten ez 256
L = 256;

% px: a normalizalt hisztogram minden x szurkeertekhez megadja a
% az elofordulasi gyakorisagat (valoszinuseget)
hist = imhist(im);
px = (hist/sum(hist));

% minden T lehetseges kuszobertekre kiszamoljuk majd sigmaT-t,
% ebben a vektorban fogjuk tarolni
T_vec = zeros(1,L);

% minden T-re kiszamoljuk sigmaT-t
for T = 1:256
    
    %B(T): A hatter pixelek gyakorisaga 
    BT = 0;
    for x = 1:T
        BT = BT + px(x);
    end
    
    % u(T)
    uT = 0;
    for x = 1:T
        uT = uT + x*px(x);
    end
    
    % u: A teljes kep közeperteke; kulon szamoljuk a szamlalot...
    u_szamlalo = 0;
    for x = 1:L
        u_szamlalo = u_szamlalo + x*px(x);
    end
    
    % ...es kulon a nevezot
    u_nevezo = 0;
    for x = 1:L
        u_nevezo = u_nevezo + px(x);
    end
    
    % u: a teljes kep közeperteke
    u = u_szamlalo / u_nevezo;

    % sigma(T): a teljes szoras
    sigmaT = (uT - u*BT)^2 / (BT *(1-BT));
    
    % eltaroljuk sigma(T)-t
    T_vec(T) = sigmaT;
    
end

% megkeressuk T_vec-ben a maximumot
[~,thresh] = max(T_vec);

% ahol T_vec maximalis, az az optimalis kuszobertek
result = im > thresh;

end