% Tento skript provede segmentaci meziobratlovych plotenek v MRI datech
% na zaklade rustu oblasti ze seminka. Vyber seminka je inspirovan metodou
%  Zhu et al. z roku 2016: A method of localization and segmentation of 
% intervertebral disc in spine MRI based on Gabor filter bank. Cela metoda
% Zhu et al. je implementovana ve skriptu method_gabor

close all; clear all; clc;

func.gabor_konstanty

lower_thresh_limit = 0.02;
upper_thresh_limit = inf;

data_directory = 'data\MRI\T2';

%% Gaborova banka filtrů
% Vytvoření banky filtrů a její převod z matice na vektor
[banka, matice_indexu] = func.gabor_bank(smery, meritka, okno_gabor_kernelu);

%% Načtení dat

image_db = func.get_image_db(data_directory);

for i = 1:numel(image_db)
    
    tic
    
    obraz = image_db(i).img;
    pixel_size = image_db(i).pix_size;

    %% Detekce pátěřních křivek
    % Výpočet výstupu filtrace vstupního obrazu
    magnitude = func.gabor_feature(obraz, banka);

    gfi_pater = func.gabor_feature_image(magnitude, matice_indexu, u1_krivka, u2_krivka);

    [pater_krivka, stred] = func.spine_curve(gfi_pater, okno_pater); % TODO - zakomponovat toto do metody, ted to neni dale vyuzite
%     image_db(i).spine_curve = pater_krivka;
    
%     % Vykreslení
%     figure
%     imshow(obraz,[])
%     hold on
%     plot(pater_krivka,1:size(obraz, 1),'w','LineWidth', 2)
%     plot(pater_krivka(stred,:),[stred stred],'+r','LineWidth', 2)
%     hold off
%     
%     pause
    

    %% Lokalizace meziobralových plotének
    gfi_disk = func.gabor_feature_image(magnitude, matice_indexu, u1_disk, u2_disk);
    gfi_disk = func.trim_spine(gfi_disk, pater_krivka);
    
    [pozice_ivd_boxu, centroidy] = func.localize_ivd(gfi_disk, obraz, pixel_size);
    [pocet_plotenek, ~] = size(centroidy);
%     image_db(i).ivd_positions = pozice_ivd_boxu;
%     image_db(i).ivd_centroids = centroidy;

    % odecteni pozadi
    pozadi = medfilt2(obraz, [25, 25]); % TODO - adaptivne podle pixel size
    popredi = obraz - pozadi;
    popredi = reshape(normalize(popredi(:), 'range'), size(popredi));

    popredi = adapthisteq(popredi);
    
    %% Růst oblasti pro každou ploténku
    plotenky_cell_array = cell(1, pocet_plotenek);
    for k = 1:pocet_plotenek
        x = centroidy(k, 2) - pozice_ivd_boxu(k, 2);
        y = centroidy(k, 1) - pozice_ivd_boxu(k, 1);
    %     mezivysledky{i} = func.regiongrowing(obraz, x, y, reg_maxdist);
        [vertical_idx, horizontal_idx] = func.get_position_in_img(pozice_ivd_boxu(k, :));
%         plotenky_cell_array{k} = func.regiongrowing(popredi(vertical_idx, horizontal_idx), x, y, reg_maxdist);
        
        plotenky_cell_array{k} = func.region_from_seed(popredi(vertical_idx, horizontal_idx), x, y, lower_thresh_limit, upper_thresh_limit);
        
        plotenky_cell_array{k} = logical(plotenky_cell_array{k});
    end
    
    segmentace_final = func.superpozice_ivd_segmentace(size(obraz), plotenky_cell_array, pozice_ivd_boxu);
    segmentace_final = imfill(segmentace_final, 'holes');
    
    element = func.get_ivd_strel(pixel_size);
    segmentace_final = imdilate(segmentace_final, element);
    
    
    image_db(i).segmented = logical(segmentace_final);
    
    image_db(i).time = toc;
    
end

% Vyhodnocení kvality
[image_db, mean_dice, mean_jaccard, mean_time] = func.evaluate_results(image_db, 'region_growing');

