function [transm_fault,well_empty] = inicializace(url,img_file_name,zdroj)
%argumenty:
%url - odkaz na sdílený soubor z uložiště Google Drive nebo Dropbox
%img_file_name - soubor .mat z matlab cloud storage s přednačtenými snímky
%zdroj - odkud pochází předkládaný snímek: 'dr' 'gd' 'cloud'
%načítání z uložišť GD a DB -> vložit url a místo img_file_name vložit 0
%načítání z uložiště Matlab Cloud Storage -> vložit img_file_name a místo url vložit 0

%výstup:
%transm_faul - faktory relativního útlumu
%well_empty - jasové hodnoty prázdných jamek (jen destilovaná voda)

%% ÚPRAVA URL a NAČTENÍ SNÍMKU Z ULOŽIŠTĚ
switch zdroj
     case 'dr' %dropbox
            url = strrep(url,'dl=0','dl=1');
            
            raw = double(imread(url));
            info = imfinfo(url);
    
     case 'gd' %google drive
            url = strrep(url,'file/d/','open?id=');
            url = strrep(url,'open?','uc?export=download&');
            url = strrep(url,'/view?usp=drivesdk','');
            
            raw = double(imread(url));
            info = imfinfo(url);
    
     case 'cloud' %matlab cloud storage
         load (img_file_name);
         
         raw = cloud_img;
         info = cloud_img_info;          
    otherwise %chybný zdroj
            error('Zadat správný zdroj')
end
%% ÚPRAVA RAW SOUBORŮ
white = info(1).WhiteLevel;     %hodnota bílé
black = info(1).BlackLevel(4);  %hodnota černé
bps = info(1).BitsPerSample;    %bitová hloubka - kontrola

blueraw = raw(1:2:end,1:2:end);	%výběr modrých pixelů, platné pro Bayer pattern RG/GB

%normalizace na rozsah 0-1, tento vystupuje dále jako original obraz
lin_raw = (blueraw - black) / (white - black); 
lin_raw = max(0,min(lin_raw,1));
imshow(lin_raw); title('Originální obraz (RAW po extrakci modrého kanálu a normalizaci)');
%% BINARIZACE OBRAZU
%filtrace pro snažší binarizaci
kernel = ones(3, 3) / 9;                        %3x3 mean kernel
raw_filtr = medfilt2(lin_raw);                  %mediánová předfiltrace
raw_filtr2 = conv2(raw_filtr, kernel, 'same');  %průměrování konvolucí s průměrovací maskou

bw = imbinarize(raw_filtr2,0.04);   %binarizace s prahem 0.04 - empiricky určeno, pozadí vždy tmavší, prstence jamek vždy světlejší

SE = strel('disk',4);               
bw_dil = imdilate(bw,SE);           %morfo dilatace pro zlepšení tvaru binar. obrazu jamek
%imshow(bw_dil);


%% NAROVNÁNÍ SNÍMKU POMOCÍ DETEKCE HRAN A ROTACE - volání funkce rotace_hrany

[bw_rot,raw_rot] = rotace_hrany(bw_dil,lin_raw);

%% DETEKCE JAMEK
[centers, radii, metric] = imfindcircles(bw_rot,[20 40],'Sensitivity',0.75,'ObjectPolarity','bright'); %hledání kružnic
% imshow(bw_rot)
% viscircles(centers, radii,'EdgeColor','R');

%seřazení středů kružnic dle y-souřadnice a následně dle x-souřadnice tak,
%aby pořadí detekovaných jamek odpovídalo pozicím jamek v matici mikrotitrační destičky
sort_centers_y = sortrows (centers,2);  plot(sort_centers_y(:,2));
sort_centers = [];
for k = 1:12:85
    sort_centers = [sort_centers; sortrows(sort_centers_y(k:k+11,:),1)];
end
sort_centers = round(sort_centers); %zaokrouhlení souřadnice pixelů na celé čísla

%zobrazení original obrazu se zaznačenými detekovanými jamkami a pořadím po seřazení + plnění matice středů jamek
imshow(raw_rot)
viscircles(sort_centers, repmat(mean(radii),96,1),'EdgeColor','r');
title('Originální obraz se zaznačenými detekovanými jamkami a pořadím po seřazení');
jamky = {};
for k = 1:length(sort_centers)
    centers_string = sprintf('%i',k);  
    text(sort_centers(k,1),sort_centers(k,2),centers_string,'color','b','HorizontalAlignment', 'center','VerticalAlignment', 'middle');
    jamky{k} = sort_centers(k,:); %plnění matice středů jamek
end

well_coor = reshape(jamky,12,8)' ;%přetvarování a transpozice matice středů jamek

%% ČTECÍ RÁMCE A KOREKCE VZHLEDEM K ÚHLU NÁHLEDU
ST = strel('disk',7,0);         %čtecí rámec
okoli = 7;
corected_centers = well_coor;   %budoucí matice korigovaných středů

%rozdělení destičky na 9 segmentů, aplikace korekce na 8 krajních
%posunutí čtecího rámce víc ke středu destičky
%Levý horní segment
kompenzace_LH{1}(1) = okoli+2 ;kompenzace_LH{1}(2) = okoli-2;
for k = 1:2
    for l = 1:4
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_LH ,'Un',0);  
    end
end
%Levý segment
kompenzace_L{1}(1) = okoli ;kompenzace_L{1}(2) = 0;
for k = 3:6
    for l = 1:4
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_L ,'Un',0);  
    end
end
%Levý dolní segment
kompenzace_LD{1}(1) = okoli ;kompenzace_LD{1}(2) = -okoli;
for k = 7:8
    for l = 1:4
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_LD ,'Un',0);  
    end
end
%Horní segment
kompenzace_H{1}(1) = 0 ;kompenzace_H{1}(2) = okoli;
for k = 1:2
    for l = 5:8
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_H ,'Un',0);  
    end
end
%Dolní segment
kompenzace_D{1}(1) = 0 ;kompenzace_D{1}(2) = -okoli;
for k = 7:8
    for l = 5:8
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_D ,'Un',0);  
    end
end
%Pravý horní segment
kompenzace_PH{1}(1) = -okoli ;kompenzace_PH{1}(2) = okoli;
for k = 1:2
    for l = 9:12
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_PH ,'Un',0);  
    end
end
%Pravý segment 
kompenzace_P{1}(1) = -okoli ;kompenzace_P{1}(2) = 0;
for k = 3:6
    for l = 9:12
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_P ,'Un',0);  
    end
end
%Pravý dolní segment
kompenzace_PD{1}(1) = -(okoli+2) ;kompenzace_PD{1}(2) = -(okoli);
for k = 7:8
    for l = 9:12
        corected_centers(k,l) = cellfun(@plus, corected_centers(k,l) , kompenzace_PD ,'Un',0);  
    end
end

%pomocná matice pro zobrazeni rámců v imshow
corected_centers_mat = cell2mat(corected_centers);                  
cor_cen_row = [];
for i = 1:2:23
    cor_cen_row = [cor_cen_row; corected_centers_mat(:,i:i+1)];
end

%kontrolní zobrazení (pozn. přibližné vyznačení čtecích rámců, nikoliv skutečná reprezentace)
figure
imshow(raw_rot); 
hold on; viscircles(sort_centers, repmat(okoli,96,1),'EdgeColor','r','LineWidth',1); hold off;  %red - původní středy
hold on; viscircles(cor_cen_row,repmat(okoli,96,1),'EdgeColor','b','LineWidth',1); hold off;    %blue- korigované středy
title('Přibližné vyznačení čtecích rámců');

%% ČTENÍ HODNOT Z JAMEK
SK = strel('disk',5,0);     %čtecí rámec
kernel = ones(5,5) / 25;    %5x5 mean kernel

for g = 1:8
    for h = 1:12
        %netvarované okolí zkoumaného pixelu - plná matice 
        pom0 = raw_rot(corected_centers{g,h}(2)-okoli : corected_centers{g,h}(2) +okoli , corected_centers{g,h}(1)-okoli : corected_centers{g,h}(1)+okoli); 
        pom1 = medfilt2(pom0,'symmetric');      %mediánová předfiltrace
        pom2 = conv2(pom1, kernel, 'valid');    %průměrování konvolucí s 5x5 maskou pro zmírnění vlivu šumu
        flek = pom2 .* double(SK.Neighborhood); %z plné matice bereme pouze část ve tvaru disku, lépe odpovídá tvaru jamky
        well_vals(g,h) = median(median(flek(flek ~=0 ))); %mediánová hodnota z disku (méně ovlivněna neodfiltrovanými extrémy než průměr)
    end
end

well_empty = well_vals; %hodnoty z prázdných jamek pro přenos do výpočtu OD v ostrém měření

%% ZJIŠTĚNÍ NEHOMOGENITY ROZLOŽENÍ INTENZITY OSVĚTLENÍ MEZI JAMKAMI
transm_fault = well_vals ./ max(well_vals(:)); %faktory relativního útlumu proti nejsvětlejší jamce

well_vals_cleared = well_vals ./ transm_fault; %kontrolní výpočet

save('inicializace_var.mat','well_empty','transm_fault'); %uložení proměnných do souborů
%při neúmyslném přepsání nebo ztrátě proměnné lze znovu načíst

%% ZOBRAZENÍ VÝSLEDKŮ

%původní rozložení jasu
figure
imagesc(well_vals);colormap(flipud(bone))
set(gca,'XAxisLocation','top','xgrid', 'on', 'ygrid', 'on','XTick',1:12,'YTickLabel',{'A','B','C','D','E','F','G','H',})
title('Mapa jasu v jamkách s destilovanou vodou - rozsah 0 až 1')
for i = 1:8
    for j = 1:12
        text(j,i ,num2str(well_vals(i,j)),'FontSize',15,'Color','r','HorizontalAlignment','center');
    end
end


%% možnost postupně sbírat hodnoty faktorů a jasů v jamkách a průměrovat je - práce v command window - neaktivní
% well_empty_sum(:,:,3) = well_empty;
% transm_fault_sum(:,:,3) = transm_fault;
% 
% well_empty_avg = mean(well_empty_sum,3) ;
% transm_fault_avg = mean(transm_fault_sum,3) ;
% 
% save('lab_kal_avg.mat','well_empty_avg','transm_fault_avg');