function J = region_growing(I,x,y,ut,max_dist)
%Funkce region growing. Vstup je obraz (I), souřadnice počátečního semínka (x,y),
%globální práh (ut) na základě něhož se má testovat kritérium podobnosti. A
%také maximální možná odchylka podobnosti (max_dist). Výstup představuje
%binární obraz velikosti vstupního se segmentovanou oblasti.

Isizes = size(I); %velikost obrazu
J = zeros(Isizes); %deklarace výstupního obrazu
reg_size = 1; %velikost regionu (ze začátku 1px)
%alokace paměti
neg_free = 1000;
neg_pos = 0;
neg_list = zeros(neg_free,3); %ukládá se vždy ve formátu [x y vzdálenost]
pixdist = 0; % vzdálenost od podobnostního kritéria
neigb = [-1 0; 1 0; 0 -1;0 1]; %4-okolí bodu

while(pixdist<=max_dist && reg_size<numel(I(I>0))) %pokud je pixdist menší než je povoleno a zároveň velikost regionu je menší než vstupní obraz
    %pridani 4-okoli
    for j=1:4 %pro všechny 4-okolní pixely
        xn = x +neigb(j,1); %nová x souřadnice
        yn = y +neigb(j,2); %nová y souřadnice
        %podmínka jestli je uvnitř obrazu
        ins=(xn>=1) && (yn>=1) && (xn<=Isizes(1)) && (yn<=Isizes(2));
        %přidání pokud je uvnitř a není části segmentované oblasti
        if(ins && (J(xn,yn)==0))
            neg_pos = neg_pos+1;
            neg_list(neg_pos,:) = [xn yn I(xn,yn)];
            J(xn,yn) = 1;
        end
    end
    %přidání paměti
    if(neg_pos+10>neg_free)
        neg_free = neg_free+1000;
        neg_list((neg_pos+1):neg_free,:) = 0;
    end
    %přidání pixelu s nejmenším vzdáleností od podobnostní kritéria
    dist = ut-neg_list(1:neg_pos,3);
    [pixdist, index] = min(dist);
    J(x,y) = 2;
    reg_size = reg_size+1;
    %uložení souřadnic pixelu
    x = neg_list(index,1);
    y = neg_list(index,2);
    %odebrání pixelu ze 4-okolí
    neg_list(index,:) = neg_list(neg_pos,:);
    neg_pos = neg_pos-1;
end
J = J>1; %binarní obraz segmentované oblasti
end
