% Tento skript provede segmentaci meziobratlovych plotenek v MRI datech
% pomoci metody Zhu et al. z roku 2016: A method of localization and 
% segmentation of intervertebral disc in spine MRI based on Gabor filter bank

close all; clear all; clc;

%% Konstanty
func.gabor_konstanty

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;
    
    % figure; imshow(obraz)

    %% 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

    %% 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, centroidy] = func.localize_ivd(gfi_disk, obraz, pixel_size);
%     image_db(i).ivd_positions = pozice;
%     image_db(i).ivd_centroids = centroidy;

    %% Segmentace meziobralových plotének
    segmentace_final = func.ivd_segmentation(magnitude, obraz, pater_krivka, pozice);
    
    %% Postprocessing
    % Úpravy pro zlepšení výsledků
    segmentace_final = func.mri_gabor_postprocessing(segmentace_final, pixel_size);
    image_db(i).segmented = logical(segmentace_final);
    % figure
    % imshow(segmentace_final + obraz)
    
    image_db(i).time = toc;
    
end

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

