%% Skript sloužící pro detekci optického disku 
% OD je detekován pomocí metody akivních kontur a následně je 
% vytvořena maska oblasti zájmu, ve které probíhá klasifikace.

clc; clear;

%% Načtení dat
img = im2double(imread('rite01_test_img.tif'));           % načtení barevného obrazu z fundus kamery
[redChannel, greenChannel, blueChannel] = imsplit(img);   % rozdělení obrazu na R, G a B složku

img_eq = adapthisteq(greenChannel);                       % adaptivní ekvalizace histogramu
img_ad = imadjust(greenChannel);                          % úprava intenzit obrazu
% pozn. lze vybrat zelenou či červenou složku na základě vstupní kvality snímku sítnice

% figure
% subplot 131; imshow(greenChannel, []); title('Originální obraz v zeleném kanálu');
% subplot 132; imshow(img_eq, []); title('Obraz po adaptivní ekvalizaci histogramu');
% subplot 133; imshow(img_ad, []); title('Úprava intenzit');

%% Detekce OD
eliminace_cev = imclose(img_eq, strel('disk', 8));        % aplikace morfologické operace za účelem eliminace cév v očním pozadí

figure
imshow(eliminace_cev, []); title('Zadání počátečních bodů kontury');
kontura = createMask(drawpolygon);                        % vytvoření kontury
maska_kont = activecontour(img_ad, kontura, 80, 'edge', 'ContractionBias', 0.1, 'SmoothFactor', 0.1);

measurements = regionprops(maska_kont, 'Centroid');       % zisk středu masky z kontury
centroid = cat(1, measurements.Centroid);                 % extrahování souřadnice středu OD

souradnice_x = floor(centroid(1));                        % zaokrouhlení souřadnice x
souradnice_y = floor(centroid(2));                        % zaokrouhlení souřadnice y

%% Vytvoření masky zájmu okolo OD
polomer_OD = 53;                  % poloměr optického disku
prumer_OD = polomer_OD * 2;       % průměr optického disku

[r, s] = size(redChannel);
maska1 = zeros(r, s);             % vytvoření masky1
[x, y] = meshgrid(1:s, 1:r); 
maska1((x - souradnice_x).^2 + (y - souradnice_y).^2 <= polomer_OD.^2) = 1; % kružnice se středem v nalezených souřadnicích středu optického disku
% redChannel(~maska) = 0;

prumer_DD1 = prumer_OD * 2; 
polomer_DD1 = floor(prumer_DD1 / 2); 

maska2 = zeros(r, s);             % vytvoření masky2
[a, b] = meshgrid(1:s, 1:r); 
maska2((a - souradnice_x).^2 + (b - souradnice_y).^2 <= polomer_DD1.^2) = 1;

% rozdíl masek pro vymezení oblasti zájmu
maska_rozdil = maska2 - maska1;

figure
imshowpair(img, maska_rozdil, 'blend'); title('Oblast zájmu okolo OD');

% save('21_maska_rozdil.mat', 'maska_rozdil')