

%%
%
% Diplomova prace 
% Martin Krupicka
% FEL CVUT
% leden 2017
%
% Simulace funkce fotoaparatu - zachyceni serie LDR snimku a generace HDR
% snimku jejich kombinaci - ve variantach bez komprese pro vytvoreni
% reference a nasledne s JPEG kompresi s volitelnou kvalitou pro simulaci
% dnes uzivaneho postupu ve fotoaparatech.
%
% Jak teoreticka, tak prakticka cast teto prace 
% vychazi z materialu vypracovanych v ramci magisterskeho
% predmetu Projekt individualni (A2M37IND) [1].
%
% Pri psani tohoto skriptu bylo vyuzito kodu dem (hlavne demo_extract_stack_from_hdr.m a demo_build_hdr.m)
% z Banterleho HDR Toolboxu a konverzace se Support Teamem po emailu. 
%
% Jako vychozi format vstupnich obrazku je uvazovan .pfm z duvodu sjednoceni formatu a nasledne
% kompatibility.
%
%%

close all;
clear all;
clc;

%% uzivatelska nastaveni

% nastaveni rozsahu poradovych cisel obrazku (index cisla v nazvu)
% Pokud nastavime stejne cislo v obou promennych, zpracuje cyklus jen jeden
% soubor. Jinak lze vice souboru najednou, pokud maji poradova cisla
% presne za sebou.
pocatecni_soubor = 1;
koncovy_soubor = 2;

% nastaveni expozicniho rozdilu mezi generovanymi snimky
krok_delta_fstops = 5; 

% pouzivane kvality JPEG komprese LDR snimku v serii
jpeg_quality_pocatecni = 19;
jpeg_quality_koncova = 99;
jpeg_quality_krok = 20;

%% hlavni cast

% nacteni vstupnich snimku
% vyuzito cyklu, kdy je po nacteni kazdeho vstupniho snimku realizovan cely zbytek skriptu a az nasledne nacten dalsi vstupni snimek 
for j=pocatecni_soubor:koncovy_soubor
    
% nacteni vstupniho souboru
[img, hdr_info] = hdrimread(['in' int2str(j) '_HDR.pfm']);
    
% tvorba N LDR snimku z puvodniho HDR snimku - pomoci parametru uniform u hlavni funkce
% generovani LDR snimku s nejlepsim nalezenym nastavenim
[stack, stack_exposure] = CreateLDRStackFromHDR(img, krok_delta_fstops, 'uniform','gamma', 2.2);

% bezeztratova varianta a ukladani do PNG
% nazev slozky pro ulozeni N LDR snimku
nazev_slozky_N_LDR_uniform_PNG = ['LDR_serie_uniform_PFM_PNG_deltafstops_' num2str(krok_delta_fstops) '_in' int2str(j)];

% volba formatu LDR snimku
format_PNG = 'png';

% tvorba slozky pro LDR snimky
mkdir(nazev_slozky_N_LDR_uniform_PNG);

% ulozeni jednotlivych prave vytvorenych LDR snimku do souboru
for i=1:size(stack, 4)
    
    % varianta PNG, PNG verze ukladany jen pro porovnani, jinak nevyuzivany
    name_out_PNG = [nazev_slozky_N_LDR_uniform_PNG, '/' int2str(i) '_exp_', num2str(stack_exposure(i)), '_in', int2str(j),'.', format_PNG];
    imwrite(flipud(stack(:,:,:,i)), name_out_PNG); % bez flipud.m by byly LDR snimky vzhuru nohama
end

% rekonstrukce puvodniho HDR snimku z N vygenerovanych nekomprimovanych snimku s uniform parametrem u rozkladu

% snimky pro tuto cast neukladame, jsou momentalne v promenne stack, takze lze rovnou zacit s rekonstrukci
% (simulace situace, kdy fotoaparat nasnima serii LDR snimku bez komprese, neuklada je a rovnou sklada HDR obrazovy soubor)

% takto pripravene HDR soubory jsou pripraveny k nasledne JPEG XT kompresi,
% pripadne jako referencni obrazove soubory pro ruzna srovnani kvality
[imgHDR_reference, lin_fun_reference] = BuildHDR(stack, stack_exposure, 'gamma', 2.2, 'Deb97', 'linear', 1); % nejlepsi zjistena varianta nastaveni

hdrimwrite(imgHDR_reference, ['in' int2str(j) '_slozeny_uniform_REFERENCE_bezeztratova_deltafstops_' num2str(krok_delta_fstops) '.pfm']);

% druhy cyklus je pres kvalitu JPEG komprese LDR serie
for jpeg_quality=jpeg_quality_pocatecni:jpeg_quality_krok:jpeg_quality_koncova  

% nazev slozky pro ulozeni N LDR JPEG snimku
nazev_slozky_N_LDR_uniform_JPEG = ['LDR_serie_uniform_PFM_JPEG_q_' int2str(jpeg_quality) '_deltafstops_' num2str(krok_delta_fstops) '_in' int2str(j)];

% volba formatu LDR snimku
format_JPEG = 'jpg'; 

% tvorba slozky pro LDR snimky
mkdir(nazev_slozky_N_LDR_uniform_JPEG);

% ulozeni jednotlivych prave vytvorenych LDR snimku do souboru
for i=1:size(stack, 4)
    
    % se ztratovou JPEG kompresi s nastavovanou kvalitou
    name_out_JPEG = [nazev_slozky_N_LDR_uniform_JPEG, '/' int2str(i) '_exp_', num2str(stack_exposure(i)), '_jpeg_quality_', int2str(jpeg_quality), '_in', int2str(j),'.', format_JPEG];
    imwrite(flipud(stack(:,:,:,i)), name_out_JPEG, 'Quality', jpeg_quality); % bez flipud.m by byly LDR snimky vzhuru nohama
    
end
 
% rekonstrukce puvodniho HDR snimku z N LDR JPEG komprimovanych snimku s uniform parametrem u rozkladu

% nacteni obrazku ze slozky s JPEG serii
[stack_JPEG, norm_value] = ReadLDRStack(nazev_slozky_N_LDR_uniform_JPEG, format_JPEG, 1);

% generovani HDR snimku a ulozeni do souboru
[imgHDR_JPEG, lin_fun_JPEG] = BuildHDR(stack_JPEG, stack_exposure, 'gamma', 2.2, 'Deb97', 'linear',1); % nejlepsi zjistena varianta nastaveni

imgHDR_JPEG = flipud(imgHDR_JPEG); % na zaver je treba snimek otocit, aby se neulozil vzhuru nohama

hdrimwrite(imgHDR_JPEG, ['in' int2str(j) '_slozeny_uniform_JPEG_serie_q_' int2str(jpeg_quality) '_deltafstops_' num2str(krok_delta_fstops) '.pfm']);    
     

end

end



