clear
clc;
close all;
%% NACTENI OBRAZKU Z URCITEHO SOUBORU
[filename, pathname] = uigetfile( ...
    {'*.jpg;*.png;*.tif;*.jpeg;*.bmp',...
    'MATLAB Files (*.jpg, *.png, *.tif, *.jpeg,*.bmp)';
    '*.*',  'All Files (*.*)'}, ...
     'Pick a file');
I = imread([pathname,filename]);
%% PREVOD NA CERNOBILY OBRAZ A VYTVORENI MASKY
% zlepseni kontrastu
X = imadjust(I);
%prevod na cernobily obraz
BW = imbinarize(X, 'adaptive', 'Sensitivity', 0.400000, 'ForegroundPolarity', 'bright');
% zaplneni prazdnych prostoru uvnitr bunek
BW = imfill(BW, 'holes');
%odstraneni objektu dotykajicich hran obrazu
BW=imclearborder(BW);
% Zvyrazneni okraju bunek a odstraneni sumu okolo
BW = activecontour(X, BW, 2, 'edge');
%odstraneni objektu velikosti 6 pixelu a mene
BW=bwareaopen(BW,6);
%% SROVNAVACI OBRAZEK (puvodni obrazek a obrazek po uprave)
figure;
imshowpair(I,BW,'montage');
title('srovnavaci obrazek');
%% VYBARVENI BUNEK BARVAMI PRO ODLISENI JEDNOTLIVYCH BUNEK
labeledImage = bwlabel(BW, 8);
coloredLabels = label2rgb (labeledImage, 'hsv', 'k', 'shuffle'); % pseudo nahodne barvy
figure;
imshowpair(I,coloredLabels,'montage');
title('srovnavaci obrazek,obravene detekovane bunky');
%% STATISTIKY BUNEK
bunky = regionprops(BW, I, 'all');
fprintf('\nCelkovy pocet bunek: %d\n',length(bunky(:)));%celkovy pocet detekovanych bunek
fprintf('\nStredni hodnota orientace bunek: %f\n',mean([bunky(:).Orientation]));%stredni hodnota smeroveho uhlu bunek v stupnich
fprintf('\nStredni hodnota delky bunek: %f\n',(mean([bunky(:).MajorAxisLength])*0.2645833333333));%stredni hodnota delky v pixelex, prevod na mm
fprintf('\nStredni hodnota sirky bunek: %f\n',(mean([bunky(:).MinorAxisLength])*0.2645833333333));%stredni hodnota sirky v pixelex, prevod na mm
%% VYKRESLENI OKRAJU BUNEK PODLE UHLU
figure;
imshow(BW);
title('zelene bunky orientace od -90° do 0°, modre od 1° do 90°');
hold on;
boundaries = bwboundaries(BW); % spocitani bunek na obrazku podle cernobile masky
for k = 1 : size(boundaries, 1) % pruchod pres vsechny nalezene bunky
	thisBoundary = boundaries{k}; % zjisteni okraje bunky k
    if(bunky(k).Orientation <= 0)% smerovy uhel bunky od -90 do 0
        plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);%zelena barva
    else
        plot(thisBoundary(:,2), thisBoundary(:,1), 'b', 'LineWidth', 2);% od 1 do 90 modra barva
    end
end