function [ obr_vysl ] = analyza_orez( obr_seg, pr_e, orez_koef, rotace_koef, roz_hamming )
%funkce provadi orez predlokti a rotaci objektu (ruky)
%vstupy
%obr_seg - segmentovany obrazek
%pr_e - prevzorkovani objektu pro erozi
%orez_koef - koeficient orezu
%rotace_koef - koeficient rotace
%roz_hamming - rozmer pro hammingovu sit
%vystupy
%obr_vysl - zpracovany obrazek (rotovany a orezany) pro Hamming. sit
% autor: Jan Netopil
obr=obr_seg;
obr_puvodni=obr;
%% hledame, kde se nachazi predlokti
sirka_stran=4;
pr_vlevo=sum(sum(obr_puvodni(:,1:sirka_stran)));
pr_nahore=sum(sum(obr_puvodni(1:sirka_stran,:)));
pr_vpravo=sum(sum(obr_puvodni(:,end-sirka_stran:end)));
pr_dole=sum(sum(obr_puvodni(end-sirka_stran:end,:)));
pr_umisteni=[pr_vlevo,pr_nahore,pr_vpravo,pr_dole];
pr_umisteni=find(pr_umisteni==max(pr_umisteni));
pr_umisteni=pr_umisteni(1); %pokud nastanou dve maxima
%% orez - pro rychlejsi erozi
[x_orez,y_orez]=find(obr==1);
obr_puvodni_o=obr(min(x_orez):max(x_orez),min(y_orez):max(y_orez));

%% hledame, kde se nachazi predlokti znovu pokud nebylo nalezeno v neorezanem
if length(pr_umisteni)==4
    sirka_stran=10;
    pr_vlevo=sum(sum(obr_puvodni_o(:,1:sirka_stran)));
    pr_nahore=sum(sum(obr_puvodni_o(1:sirka_stran,:)));
    pr_vpravo=sum(sum(obr_puvodni_o(:,end-sirka_stran:end)));
    pr_dole=sum(sum(obr_puvodni_o(end-sirka_stran:end,:)));
    pr_umisteni=[pr_vlevo,pr_nahore,pr_vpravo,pr_dole];
    pr_umisteni=find(pr_umisteni==max(pr_umisteni));
    disp('Predlokti nenalezeno, muze byt zkresleno zpracovani');
end

%% prevzorkovani objektu pro erozi- vyrazne zrychleni nasledujicich vypoctu
obr_puvodni_o=imresize(obr_puvodni_o,pr_e);
obr_puvodni_o(obr_puvodni_o>0.5)=1;
obr_puvodni_o(obr_puvodni_o<=0.5)=0;

%% ziskani medianu sirky a delky objektu
sloupce_o=sum(obr_puvodni_o,1);sloupce_o(sloupce_o==0)=[]; %potencionalni sirka zapesti
sloupce_vyb_hodnota_o=median(sloupce_o);
radky_o=sum(obr_puvodni_o,2);radky_o(radky_o==0)=[]; %potencionalni sirka zapesti
radky_vyb_hodnota_o=median(radky_o);
median_min_o=min([sloupce_vyb_hodnota_o,radky_vyb_hodnota_o]);

%% definice objektu a eroze dle predchozich hodnot

obj1=strel('diamond',fix(median_min_o/3.5));
obr_erode_poc=imerode(obr_puvodni_o,obj1);

%% vypocet uhlu a rotace
stats = regionprops(obr_erode_poc,'Orientation');
orientace = round((cat(1, stats.Orientation)).*rotace_koef);
znamenko = orientace/abs(orientace);
if orientace==0
    znamenko=1;
end
if (pr_umisteni == 1) || (pr_umisteni == 3)
    obr_rot1 = imrotate(obr_puvodni,-orientace,'nearest');
    obr_rot2 = imrotate(obr_erode_poc,-orientace,'nearest');
else
    obr_rot1 = imrotate(obr_puvodni,znamenko*(90-abs(orientace)),'nearest'); %puvodni obrazek
    obr_rot2 = imrotate(obr_erode_poc,znamenko*(90-abs(orientace)),'nearest');
end

%% orez - pro rychlejsi erozi
[x_orez,y_orez]=find(obr_rot2==1); 
obr_rot2=obr_rot2(min(x_orez):max(x_orez),min(y_orez):max(y_orez));

%%  **************************************************
%   pokracuje presna eroze - definice objektu a eroze
%   **************************************************
obj2=strel('diamond',1);
obr_erode=obr_rot2;
rozdel_zapestim=1;
pom_pomer=1;
sum_pocatek=sum(sum(obr_erode));
%nastaveni velikosti filtrace artefaktu dle velikosti objektu
if sum_pocatek>3000
min_artefakty=50;
elseif sum_pocatek>800
        min_artefakty=20;
else
        min_artefakty=7;
end
% postupna eroze pri ktere se hleda dlan a predlokti
while 1 %ukonceni se provadi prikazem break;
    obr_erode=imerode(obr_erode,obj2);
    obr_erode_suma=sum(sum(obr_erode)); %celkova plocha pro pripadne ukonceni cyklu
    % druha varianta orezu - urcime si dosazenou sirku objektu pro vypocet orezu dle pomeru
    if pom_pomer == 1
        sloupce=sum(obr_erode,1);sloupce(sloupce==0)=[]; %potencionalni sirka zapesti
        sloupce_vyb_hodnota=median(sloupce);
        radky=sum(obr_erode,2);radky(radky==0)=[]; %potencionalni sirka zapesti
        radky_vyb_hodnota=median(radky);
        median_min=min([sloupce_vyb_hodnota,radky_vyb_hodnota]);
        if median_min<20
            median_min=20; % hodnota ktera se pouzije pro vypocet pomeru
            obr_erode_pomer=obr_erode;
            pom_pomer=0;
            %             figure(22);
            %             imshow(obr_erode_pomer);
        end
    end
    % pokracuji variantou orezu pro vypocet centroidu objektu - pro nalezeni
    % vhodneho objektu
    [objekt,pocet_objektu] = bwlabel(obr_erode);
    if pocet_objektu~=1 %vzniklo oddeleni zapestim?
        for o=1:pocet_objektu %mazani artefaktu
            objekt_aktualni=objekt(objekt==o);
            objekt_aktualni=objekt_aktualni./o;
            if sum(sum(objekt_aktualni))<min_artefakty % mazani vzniklych artefaktu
                obr_erode(objekt==o)=0;
                %                     figure(1);
                %                     imshow(obr_erode);
                %                     pause
            end
        end
    end
    [objekt,pocet_objektu] = bwlabel(obr_erode);
    if pocet_objektu~=1 && (sum(sum(obr_erode))/sum_pocatek)<0.4%nejedna se o artefakty - oddeleni vzniklo zapestim
        break; %dal neni treba erodovat
    end
    if (sum(sum(obr_erode))/sum_pocatek)<0.1 %nepodarilo se ruku rozdelit zapestim
        %         disp('Ruku nelze rozdelit zapestim');
        rozdel_zapestim=0;
        break;
    end
end

%% ruka byla rozdelena zapestim - vyber spravneho objektu dle predlokti
if rozdel_zapestim==1
    %nalezeni x a y souradnic pro spravny vyber objektu
    [y_obj1,x_obj1]=find(objekt==1);
    x_obj1=fix(mean(x_obj1));y_obj1=fix(mean(y_obj1));
    [y_obj2,x_obj2]=find(objekt==2);
    x_obj2=fix(mean(x_obj2));y_obj2=fix(mean(y_obj2));
    % nalezeni objektu dle predlokti dle toho vyber spravneho objektu
    switch pr_umisteni
        case 1
            if x_obj1<x_obj2 %vyber spravneho objektu dle souradnic a predlokti
                objekt(objekt==1)=0;
            else objekt(objekt==2)=0;
            end
        case 2
            if y_obj1<y_obj2 %vyber spravneho objektu dle souradnic a predlokti
                objekt(objekt==1)=0;
            else objekt(objekt==2)=0;
            end
        case 3
            if x_obj1>x_obj2 %vyber spravneho objektu dle souradnic a predlokti
                objekt(objekt==1)=0;
            else objekt(objekt==2)=0;
            end
        case 4
            if y_obj1>y_obj2 %vyber spravneho objektu dle souradnic a predlokti
                objekt(objekt==1)=0;
            else objekt(objekt==2)=0;
            end
            
    end
    objekt(objekt>0.5)=1; %chceme jen nuly a jednicky
end

%% kontrola zda ziskany objekt neni predloktim - eroze skoncila nalezenim predlokti
sirka_stran=4;
if sum(sum(objekt))<4
    disp('Chybny vstup ze segmentace, zpracovani obrazku nepobezi!');
%     figure(22);
%     imshow(obr_erode_poc)
    obr_vysl=zeros(roz_hamming,roz_hamming);
    return;
end
pr_objekt_vlevo=sum(sum(objekt(:,1:sirka_stran)));
pr_objekt_nahore=sum(sum(objekt(1:sirka_stran,:)));
pr_objekt_vpravo=sum(sum(objekt(:,end-sirka_stran:end)));
pr_objekt_dole=sum(sum(objekt(end-sirka_stran:end,:)));
pr_objekt_umisteni=[pr_objekt_vlevo,pr_objekt_nahore,pr_objekt_vpravo,pr_objekt_dole];
pr_objekt_umisteni=find(pr_objekt_umisteni==max(pr_objekt_umisteni));
if length(pr_objekt_umisteni)==4
    pr_objekt_umisteni=0; % okraj nebyl nalezen, v poradku
end
if rozdel_zapestim==1
    pr_objekt_umisteni = 0;
end

%% vypocet stredu dlane a stredu erodovaneho objektu
if (pr_objekt_umisteni == 0)% pokud nezustal objekt jako 'prilepene' predlokti k okraji
    stred=fix(size(objekt)/2);
    stred=[stred(2),stred(1)];
    stats = regionprops(objekt,'Centroid');
    centroid_dlan = round(cat(1, stats.Centroid));
    if isempty(centroid_dlan) %pokud neexistuje objekt
        centroid_dlan=stred;
        disp('spatny vstup do zpracovani, zkontrolujte vystup po segmentaci');
    end
    %prepocet vzdalenosti stredu obrazku ke stredu dlane na orez
    x=(abs(stred-centroid_dlan));
    orez=abs(fix(1.9884*x - 14.321)); %linearni zavislost - vyjadruje kalibracni funkce ziskana z 11 hodnot
    if pr_e~=1
        y=0.985*pr_e^-1.135; % funkce ziskana z kalibracni krivky - mocninna funkce
        orez=fix(orez*y); % uprava dle prevzorkovani erodovaneho obrazku
    end
end
%% vypocet orezu dle pomeru - pokud je objekt predlokti
if (pr_objekt_umisteni ~= 0)
    if exist('obr_erode_pomer','var')==0
        disp('Chybny vstup ze segmentace, zpracovani obrazku nepobezi (var obr_erode_pomer neexistuje)!');
        obr_vysl=zeros(roz_hamming,roz_hamming);
        return;
    end
    %orez
    [x_orez,y_orez]=find(obr_erode_pomer==1);
    obr_erode_pomer=obr_erode_pomer(min(x_orez):max(x_orez),min(y_orez):max(y_orez));
    obr_erode_pomer=max(size(obr_erode_pomer));
    orez_pomer=obr_erode_pomer/median_min;
    x=(obr_erode_pomer*orez_pomer);
    orez=abs(fix(0.0492*x + 9.5065)); %linearni zavislost - vyjadruje kalibracni funkce ziskana z 11 hodnot

    sloupce_r=sum(obr_rot1,1);sloupce_r(sloupce_r==0)=[]; %potencionalni sirka zapesti
    sloupce_vyb_hodnota_r=median(sloupce_r);
    radky_r=sum(obr_rot1,2);radky_r(radky_r==0)=[]; %potencionalni sirka zapesti
    radky_vyb_hodnota_r=median(radky_r);
    median_min_r=min([sloupce_vyb_hodnota_r,radky_vyb_hodnota_r]);
    y=9.0183*median_min_r^-0.518; %linearni zavislost - vyjadruje kalibracni funkce ziskana z 10 hodnot
    orez=fix(orez*y);
    orez=abs([orez,orez]);
    if pr_e~=1
        y=0.979*pr_e^-1.57; % funkce ziskana z kalibracni krivky - mocninna funkce
        orez=fix(orez*y); % uprava dle prevzorkovani erodovaneho obrazku, korekcni koeficient nalezen pro ziskani nejlepsi
    end
    disp('orez se pocita pres pomer, vypocet muze byt mene presny');
end
orez=fix(orez*orez_koef);
% orez=abs(orez*korekce)
orez(orez==0)=1; %osetreni mozne chyby, pokud je orez nulovy
%% zaverecny orez dle predlokti
switch pr_umisteni
    case 1
        obr_orez=obr_rot1(:,orez(1):end);
    case 2
        obr_orez=obr_rot1(orez(2):end,:);
    case 3
        obr_orez=obr_rot1(:,1:end-orez(1));
    case 4
        obr_orez=obr_rot1(1:end-orez(2),:);
end
% figure(2);
% imshow(objekt);
%% zaverecne upravy rozliseni a rozmeru pro Hammingovu sit
[x_orez,y_orez]=find(obr_orez==1);
obr_orez=obr_orez(min(x_orez):max(x_orez),min(y_orez):max(y_orez));
obr_orez(obr_orez>0.5)=1; obr_orez(obr_orez<=0.5)=0;
obr_vysl=zeros(roz_hamming,roz_hamming); %vytvoreni obrazu s pozadovanymi rozmery

xymax_resize=max(size(obr_orez)); %zjisteni maximalniho rozmeru
xy_resize=size(obr_orez); %zjisteni rozmeru obrazku
xymaxind_resize=find(xy_resize==xymax_resize); %je maximum na prvni nebo druhe pozici?
pomer_resize=roz_hamming/xymax_resize; % pomer pro prevzorkovani
obr_resize=imresize(obr_orez,pomer_resize); % prevzorkovani
xyobr_resize=size(obr_resize); % novy rozmer obrazku po prevzorkovani

if xymaxind_resize==1 %nulami v x ose nebo y ose
    resize_kor=(roz_hamming-min(xyobr_resize))/2;
    obr_resize=obr_resize(1:roz_hamming,1:end);
    obr_vysl(1:end,(fix(resize_kor)+1):(end-round(resize_kor)))=obr_resize;
else
    resize_kor=(roz_hamming-min(xyobr_resize))/2;
    obr_resize=obr_resize(1:end,1:roz_hamming);
    obr_vysl((fix(resize_kor)+1):(end-round(resize_kor)),1:end)=obr_resize;
end
obr_vysl=obr_vysl(1:roz_hamming,1:roz_hamming); %zaverecny orez - v ojedinelych pripadech muze vzniknout navic nekolik pixelu, coz by zpusobilo chybu
% zaverecna binarizace
obr_vysl(obr_vysl>0.5)=1;
obr_vysl(obr_vysl<=0.5)=0;
% toc
