function PMs = prohledavani(obraz, maticepozic, pocetprimek, vzdalodst, minvzdalodst, binmapa)
% funkce prochazi vstupni obraz pixel po pixelu a po kazde radialni primce
% urcuje maximalni zmenu jasove hodnoty (variace) a jeji pozici.
% radialni primky jsou prochazeny po smeru hodinovych rucicek, konci na
% pomyslne 12. hodine (konec presne na 12., zacatek je 12 - 1*fi, kde fi je uhel inkrementu radialnich primek)
 
% VSTUP:
% - obraz - vstupni obraz, ktery bude prohledavan - predpoklada se sedotonovy vstupni obraz (obsahuje pouze jeden jasovy rozmer)
% - maticepozic -  matice obsahujici pozice pixelu prohledavaneho okoli (pozice pro kazdou radialni primku (uhel) zvlast)
% - pocetprimek - pocet radialnich primek pod kterymi bude prohledavano
% - vzdalodst - vzdalenost od stredu urcuje maximalni vzdalenost, ve ktere bude okoli kolem stredoveho pixelu prohledavano
% - minvzdalodst - urcuje minimalni vzdalenost, ve ktere bude okoli kolem stredoveho pixelu prohledavano - umozni odfiltrovat male kruhove
%   artefakty a detekci maximalnich zmen variace na cevach uvnitr OD
% - binmapa (volitelna promenna) - binarni obraz o stejnych rozmerech jako vstupni obraz. Binarni mapa urcuje, ktera mista vstupniho obrazu budou prohledavana a
%   ktera nikoliv. Mista v mape s hodnotou 1 budou ve vstupnim obraze prohledavana, mista s hodnotou 0 budou ve vstupnim obraze vynechana (mapa
%   tedy slouzi ke zrychleni prohledavani
    
% VYSTUP:
% - PMs - matice obsahujici vsechny potrebne informace o kazdem tzv. bode
%   PM. Bod PM je bod, ve kterem podel jedne radialni primky doslo k nejvetsi
%   zmene jasu. V jednotlivych radcich jsou jednotlive body PM.
%       - prvni sloupec PMs obsahuje y-ovou souradnici stredoveho pixelu daneho bodu PM
%       - druhy sloupec PMs obsahuje x-ovou souradnici stredoveho pixelu daneho bodu PM
%       - treti sloupec PMs obsahuje velikost variace (rozdil jasovych intenzit dvou sousednich pixelu bodu PM podel radialni primky)
%       - ctvrty sloupec PMs obsahuje vzdalenost daneho bodu PM od sveho stredoveho pixelu
%       - paty sloupec PMs obsahuje uhel pod kterym byl dany bod PM zjisten

   


    [radku, sloupcu] = size(obraz);
    
    if nargin < 6         % osetreni vstupu
        disp('Chybi bin. mapa, prohledavam cely vstupni obraz!');
        binmapa = ones(radku,sloupcu);
    end
    
    [radkum, sloupcum] = size(binmapa);   
    
    if ((radku ~= radkum) || (sloupcu ~= sloupcum)) % vstupni osetreni - binarni mapa musi mit stejne rozmery jako vstupni obraz
        disp('Pravdepodobnostni mapa nema stejne rozmery jako vstupni obraz!');
        disp('Prohledavam tedy cely vstupni obraz!');        
        binmapa = ones(radku,sloupcu);
    end

    obal = ones(radku+2*vzdalodst,sloupcu+2*vzdalodst);     % Obal je jedickova matice, do ktere se vlozi vstupni obraz. Slouzi k tomu, aby bylo mozne prohledavat obraz az k jeho okrajum bez nutneho orezu
    obal(vzdalodst+1:radku+vzdalodst, vzdalodst+1:sloupcu+vzdalodst) = obraz;   % vlozeni vstupniho obrazu do obalu
    obraz = obal;   
    
    obal = zeros(radku+2*vzdalodst,sloupcu+2*vzdalodst);    
    obal(vzdalodst+1:radku+vzdalodst, vzdalodst+1:sloupcu+vzdalodst) = binmapa; % vlozeni binarni mapy do obalu - rozmery a pozice vstupniho obrazu a mapy si musi odpovidat
    binmapa = obal;

%     figure
%     imshow(obraz)

    pom = 1;                            % pomocne promenna pro indexaci vektoru (matice)
    
    
    plocha = sum(binmapa(:));   % zjisteni mnozstvi prohledavanych pixelu
    souradnicex = zeros((plocha*pocetprimek),1);     % alokace - umozni urychleni cyklu
    souradnicey = zeros((plocha*pocetprimek),1);     % alokace - umozni urychleni cyklu
    maxvarvekt = zeros((plocha*pocetprimek),1);      % alokace - umozni urychleni cyklu
    vzdalenosti = zeros((plocha*pocetprimek),1);     % alokace - umozni urychleni cyklu
    uhly = zeros((plocha*pocetprimek),1);            % alokace - umozni urychleni cyklu
    
    global h;
    h = waitbar(0,'Prohledavam vstupni obraz...');             % inicializace waitbaru
    delit = round((plocha*pocetprimek)/30);  % pomocna promenna pro waitbar
    cas = clock;
      
    for i = vzdalodst+1:radku+vzdalodst                 % prochazime vstupni obraz (i = radkovy index)
        for j = vzdalodst+1:sloupcu+vzdalodst           % prochazime vstupni obraz (j = sloupcovy index)
            
            if binmapa(i,j) == 1    % aktualni pixel prohledavame jen pokud je v binarni mape na odpovidajicim miste jednickovy pixel
            
                % prochazime okoli aktualniho pixelu:
                for k = 1:2:(pocetprimek*2)   % prochazime jednotlive uhly (k = index uhloveho inkrementu)
                    maxvariace = -Inf;     % nastaveni pocatecni maximalni variace vzdy pro novy uhel jako -nekonecno (nalezena variace pak bude vzdy vetsi)

                    souradnicex(pom) = i-vzdalodst;       % do vektoru ukladame y-ovou souradnici centralniho pixelu v obraze (promenna pom rozlisuje jednotlive body PM)
                                                          % souradnice maji korekci na obal kolem obrazu, vysledek je tedy nezavisly na sirce obalu
                    souradnicey(pom) = j-vzdalodst;       % do vektoru ukladame x-ovou souradnici centralniho pixelu v obraze (promenna pom rozlisuje jednotlive body PM)
                                                          % souradnice maji korekci na obal kolem obrazu, vysledek je tedy nezavisly na sirce obalu

                    for l = minvzdalodst:vzdalodst-1   % v aktualnim uhlu prohledavame podel radialni primky v ruznych vzdalenostech (l = index vzdalenosti)

                        % v kazde iteraci z maticepozic zjistime souradnice dvou pixelu na radialni primce v odpovidajicim uhlu a odpovidajici vzdalenosti od centralniho pixelu
                        % zjistime jejich jasove hodnoty a odecteme vzdalenejsi pixel od pixelu blizsiho k centralnimu pixelu - tedy zjistime variaci v
                        % aktualnim uhlu a aktualni vzdalenosti
                        variace = obraz(i+maticepozic(k+2,l+2),j+maticepozic(k+1,l+2)) - obraz(i+maticepozic(k+2,l+4),j+maticepozic(k+1,l+4));  % vypocet aktualni variace

                        if maxvariace < variace     % pokud je aktualni variace vetsi nez doposud nejvetsi variace pro tento uhel, 
                            maxvariace = variace;   % je aktualni variace ulozena jako maximalni
                            maxvarvekt(pom) = maxvariace;    % do vektoru maxvarvekt ulozime maximalni variaci tohoto uhlu (promenna pom rozlisuje jednotlive body PM)
                            vzdalenosti(pom) = l;             % do vektoru vzdalenosti ulozime vzdalenost od aktualniho stredu kde se nachazela max variace (promenna pom rozlisuje jednotlive body PM)
                            uhly(pom) = maticepozic(k+1,2);    % do vektoru uhly ulozime uhel pro ktery byly hodnoty zjisteny
                        end           
                    end                
                    pom = pom+1;        % musime indexovat pomoci promenne pom, protoze ostatni indexy se behem prochazeni obrazu mohou prekryvat (nejsou jednoznacne) - promenna pom rozlisuje jednotlive body PM
                    
                end
            end
        end
        
        if rem(pom,delit)
            ubehlo = etime(clock,cas);    % doba mezi prvni a aktualni iteraci
            celkem = ubehlo * ((plocha*pocetprimek)/pom);        % priblizne jak dlouho smycka celkem pobezi
            zbyva = celkem - ubehlo;    % zbyvajici cas vypoctu
            
            text = 'Prohledavam vstupni obraz ... \n zbyva priblizne %.1f vterin';
            str = sprintf(text , zbyva);
            waitbar(pom/(plocha*pocetprimek), h, str);        % zobrazeni progresu vypoctu na obrazovce (vhodne pro vyssi rozliseni vstupnich obrazu)
        end
            
    end
   
    % vytvoreni matice PMs spojenim jednotlivych sloupcovych vektoru -
    % jednotlive body PM jsou umisteny v radcich
    PMs(:,1) = souradnicex;
    PMs(:,2) = souradnicey;
    PMs(:,3) = maxvarvekt;
    PMs(:,4) = vzdalenosti;
    PMs(:,5) = uhly;
   
end