function [pozice_ivd_boxu, centroidy] = localize_ivd(disk, obraz, pixel_size)
% funkce filtruje mapu Gaborovych priznaku pro meziobratlove plotenky (IVD)
% a v takto filtrovane mape lokalizuje oblasti jednotlivych plotenek

% Mediánová filtrace s oknem pro lepší výsledek
% filter_size = [44 17];
filter_size = round([36*pixel_size(2), 14*pixel_size(1)]);
ivd_info_image = medfilt2(disk, filter_size); % box filter kernel

horizont_krivka = normalize(sum(ivd_info_image, 2), 'range');

% % visualize horizont_krivka
% imshow(obraz')
% hold on
% plot(horizont_krivka.*size(obraz, 2))
% hold off

% Nalezení souřadnic peaků a jejich úprava
[~, radek_ivd, sirka_peaku_ver] = findpeaks(horizont_krivka, ...
                              'MinPeakProminence', 0.2,...
                              'MinPeakHeight', 0.2);
sirka_peaku_ver = round(sirka_peaku_ver)';

vert_limity_ivd = [radek_ivd(1) / 2; ...
             (radek_ivd(1:end-1) + radek_ivd(2:end)) ./ 2; ...
             (size(disk, 1) + radek_ivd(end)) ./ 2];
         
vert_limity_ivd = round(vert_limity_ivd);

% Nalezení výšky a šířky boxů
sloupec_ivd = [];
sirka_ivd = [];
for i = 2:(length(radek_ivd)+1)
    [pozice_peaku_ver, pozice_peaku_hor, sirka_peaku_hor] = findpeaks(sum(ivd_info_image(vert_limity_ivd(i-1):vert_limity_ivd(i), :)));
    [~, max_peak] = max(pozice_peaku_ver);
    sloupec_ivd = [sloupec_ivd; round(pozice_peaku_hor(max_peak(1)))];
    sirka_ivd = [sirka_ivd; round(sirka_peaku_hor(max_peak(1)))];
end
pozice_ivd_boxu = zeros(length(sloupec_ivd), 4);
pozice_ivd_boxu(:, 1) = sloupec_ivd - sirka_ivd; % pozice leveho rohu
pozice_ivd_boxu(:, 2) = radek_ivd' - sirka_peaku_ver; % pozice horniho rohu
pozice_ivd_boxu(:, 3) = sirka_ivd .* 2; % sirka boxu
pozice_ivd_boxu(:, 4) = sirka_peaku_ver .* 2; % vyske boxu
pozice_ivd_boxu(pozice_ivd_boxu<=0) = 1;

% Vybrání částí filtrovaného obrazu - boxy s IVD
binary_ivd_data = cell(1, size(pozice_ivd_boxu, 1));
grayscale_ivd_data = cell(1, size(pozice_ivd_boxu, 1));
centroidy = [];
for i = 1:length(binary_ivd_data)
    
    pozice_peaku_ver = pozice_ivd_boxu(i, 2) + pozice_ivd_boxu(i, 4);
    pozice_peaku_hor = pozice_ivd_boxu(i, 1) + pozice_ivd_boxu(i, 3);
    % kontrola, ze oblasti jsou uvnitr obrazu
    if pozice_peaku_ver > size(disk, 1)
        pozice_ivd_boxu(i, 4) = size(disk, 1) - pozice_ivd_boxu(i, 2);
        pozice_peaku_ver = size(disk, 1);
    end
    
    sirka_peaku_hor = disk(pozice_ivd_boxu(i, 2):pozice_peaku_ver, pozice_ivd_boxu(i, 1):pozice_peaku_hor);
        
    grayscale_ivd_data{i} = obraz(pozice_ivd_boxu(i, 2):pozice_peaku_ver, pozice_ivd_boxu(i, 1):pozice_peaku_hor); % TODO - zde upravit, predtim zde byla pouzivana spatna promenna
    max_peak = imbinarize(sirka_peaku_hor); % otsu
    binary_ivd_data{i} = bwareafilt(max_peak, 1, 'largest'); % TODO - thresholdingh ted nefunguje idealne
    
%     imshow(binary_ivd_data{i}, []); pause
    
    % Nalazení centroidů pro každý box s IVD
    
    pozice_peaku_ver = regionprops(binary_ivd_data{i}, 'centroid');
    centroidy = [centroidy; round(pozice_ivd_boxu(i, 1:2)+ pozice_peaku_ver.Centroid)];
    
end

% % Vykreslení
% superpozice = obraz + func.superpozice_ivd_segmentace(size(obraz), binary_ivd_data, pozice_ivd_boxu);
% figure
% imshow(superpozice, [])
% hold on
% plot(sloupec_ivd, radek_ivd, '+w')
% plot(centroidy(:, 1), centroidy(:, 2), '+r')
% for i = 1:length(sloupec_ivd)
%     rectangle('Position', pozice_ivd_boxu(i, :), 'EdgeColor', 'w')
% end
% hold off
end

