function [ obr_seg ] = segincreasearea( obr_r, cxy, prah,adapt_krit_vaha, koef_prevz)
% Funkce provadi segmentaci obrazu pomoci algoritmu narustani oblasti
% Vstupy:
% *obr_r - matice hodnot reprezentujici sedotonovy obrazek, nebo jednu slozku barevneho prostoru 
% *cxy - souradnice stredu dlane - vektor [x,y]
% *prah - znaci rozhodovaci prah, kdy lze pixel zaradit k narustajici
% oblasti
% *adapt_krit_vaha - kombinuje staticke a adaptivni kriterium, hodnota udava
% vyznam adaptivniho kriteria (0...1), 1 - pouze adaptivni kriterium, 0 - pouze
% staticke kriterium, staticke kriterium je pocitano z okoli zvoleneho
% stredu dlane
% *koef_prevz - pro rychlejsi beh algoritmu lze vyuzit prevzorkovani obrazu
% aliasing vyznamne neovlivnuje segmentaci, proto se antialiasingoveho 
% filtru nepouziva - hodnoty (0...1), mensi hodnota, vyssi rychlost a horsi spolehlivost
% Vystup: obr_seg - vysegmentovana ruka
% Autor: Jan Netopil
obr=obr_r;
[obr_vel_x, obr_vel_y]=size(obr_r); %zjisteni velikosti obrazku
pozicex=cxy(1); %pozice stredu dlane
pozicey=cxy(2); %pozice stredu dlane

if koef_prevz~=1 %pokud je prevzorkovani 1 neni treba prevzorkovavat
    orez=3; %o kolik se oreze obrazek
    obr_o=obr_r(orez:(end-orez-1),orez:(end-orez-1));%orez, kvuli prevzorkovani a stejne vysledne velikosti k puvodnimu obrazku
    obr=imresize(obr_o,koef_prevz);
    pozicex=fix(pozicex*koef_prevz);
    pozicey=fix(pozicey*koef_prevz);

%     figure;
%     obr(pozicex,pozicey)=1.5;
%     imshow(obr,[]);
end
%nutne vytvoreni okraju kvuli ochrane pred pretecenim pri narustani oblasti
obr(1,:)=1;obr(end,:)=1;
obr(:,1)=1;obr(:,end)=1;
obr(2,2:end-1)=0;obr(end-1,2:end-1)=0;
obr(2:end-1,2)=0;obr(2:end-1,end-1)=0;

% figure;
% imshow(obr);

[x,y]=size(obr);


all=zeros(x,y); %cely doposud vysegmentovany prostor
last=zeros(x,y); %posledni vysledek vysegmentovaneho prostoru

neadaptivni_prah=sum(sum(obr((pozicex-2):(pozicex+2),(pozicey-2):(pozicey+2))))/25;%dle vymezene oblasti (stredu dlane) nemenna hodnota

pom=1; % iterace cislo

nove_pozicex=pozicex;
nove_pozicey=pozicey;
%% samotny algoritmus narustani oblasti
while isempty(nove_pozicex)==0
    last(:,:)=0;
        %prohledani okoli kolem aktualnich bodu
        for f=1:length(nove_pozicex); %prochazim vsechny pozice seminek
            pozicex=nove_pozicex(f);
            pozicey=nove_pozicey(f);
            %--16 smer testovani okoli aktualniho seminka
            hodnota_seminko_adapt=obr(pozicex,pozicey); %matice s hodnotami aktualniho seminka pro srovnani
            hodnota_seminko=(hodnota_seminko_adapt*adapt_krit_vaha)+(neadaptivni_prah*(1-adapt_krit_vaha));
            matice_okoli_seminko=obr((pozicex-1):(pozicex+1),(pozicey-1):(pozicey+1)); %matice s hodnotami kolem seminka
            %porovnani
            matice_rozdil=abs(matice_okoli_seminko-hodnota_seminko); 
            matice_rozdil(matice_rozdil>prah)=1;
            matice_rozdil(matice_rozdil<=prah)=0;matice_rozdil=1-matice_rozdil;
            %--konec testovani okoli kolem aktualniho seminka
            last((pozicex-1):(pozicex+1),(pozicey-1):(pozicey+1))=matice_rozdil; %ulozi vsechny seminka matice
        end
    actual=last-all; %jen zbyla seminka pro dalsi iteraci
    actual(actual<0)=0;%osetreni - nove seminka - vznikaji minusove hodnoty
    all=actual+all; %veskera prosla seminka
    [nove_pozicex,nove_pozicey]=find(actual==1);
    
%     figure(11); %vykresleni postupneho narustu oblasti s aktivnimi seminky
% subplot(131);imshow(all);
% % subplot(132);imshow(last);
% subplot(133);imshow(actual);
%     pom=pom+1;disp(pom); %iterace cislo
end
%%
all_fill=imfill(all); %vyplneni der

if koef_prevz~=1 %pokud je prevzorkovani 1 neni treba prevzorkovavat
    obr_all_fill=imresize(all_fill,1/koef_prevz);
    [obr_vel_resx, obr_vel_resy]=size(obr_all_fill);
    obr_all_fill(obr_all_fill>0.8)=1;obr_all_fill(obr_all_fill<=0.8)=0;
        % obr_all=imresize(all,1/koef_prevz);
        % obr_all(obr_all>0.8)=1;obr_all(obr_all<=0.8)=0;
    %spravne umisteni prevzorkovaneho obrazku do puvodni velikosti
        % all=zeros(obr_vel_x,obr_vel_y);
    all_fill=zeros(obr_vel_x,obr_vel_y);
    umisteni_x=round((obr_vel_x-obr_vel_resx)/2);
    korekcex=1-mod(obr_vel_x-obr_vel_resx,2);
    umisteni_y=round((obr_vel_y-obr_vel_resy)/2);
    korekcey=1-mod(obr_vel_y-obr_vel_resy,2);
        % all(umisteni_x:end-umisteni_x-korekcex,umisteni_y:end-umisteni_y-korekcey)=obr_all;
    all_fill(umisteni_x:end-umisteni_x-korekcex,umisteni_y:end-umisteni_y-korekcey)=obr_all_fill;
end
obr_seg=all_fill;
end

