

%%
%
% Diplomova prace 
% Martin Krupicka
% FEL CVUT
% leden 2017
%
% Realizace objektivniho hodnoceni kvality obrazu prostrednictvim metrik
% SNR a MSE. Je vypocteno take PSNR s vychozim nastavenim, ale to neni
% v teto diplomove praci vyuzivano. Hodnoti se kvalita rady HDR souboru
% proslych JPEG XT koderem a dekoderem s ruznou hodnotou Q. Jako vstup
% koderu a reference pri hodnoceni kvality je vyuzit HDR snimek slozeny
% z N LDR nekomprimovanych snimku.
% 
% Jak teoreticka, tak prakticka cast teto prace 
% vychazi z materialu vypracovanych v ramci magisterskeho
% predmetu Projekt individualni (A2M37IND) [1].
%
%
%%

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;

% pocet zpracovavanych souboru
pocet_souboru = koncovy_soubor-pocatecni_soubor+1;

% pocet expozic v puvodni LDR serii
pocet_expozic = 3;

% pocet objektivnich metrik, ktere se na zaver vypoctou - zakladne 3 - MSE,
% SNR, PSNR
pocet_objektivnich_metrik = 3; 

% TMO pouzity pri kodovani
TMO = 'Drago';

% expozicni rozdil mezi LDR snimky v puvodni LDR serii
krok_deltafstops = 5;

% parametr kvality zakladni vrstvy, zakladne jedna typicka hodnota,
% pokud bychom chteli vyuzit vice ruznych hodnot, nebyl by problem
% realizovat to podobne jako u velkeho Q
q = 75;

% parametr kvality rezidualni vrstvy
% u toho pracujeme s rozsahem hodnot
Q_pocatecni = 19;
Q_koncove = 99;
Q_krok = 20;
Q=Q_pocatecni:Q_krok:Q_koncove;% tento radek jen pro zjisteni poctu uzivanych hodnot Q
% s vyuzitim pri inicializaci tabulky v dalsim prikazu

tabulka_objektivniho_hodnoceni = zeros(size(Q,2), pocet_souboru*pocet_objektivnich_metrik + 2 + pocet_souboru*1); % inicializace tabulky potrebne velikosti
% +2 kvuli kvalitativnim parametrum JPEQ XT q a Q a +pocet_souboru*1 kvuli hodnote
% bitoveho toku JPEG XT kodovaneho souboru

% pomocny index pro pruchody cyklem
index_pruchodu_cyklem_sloupec = 1;

%% hlavni cast

for i=pocatecni_soubor:koncovy_soubor

% pomocny index pro pruchody cyklem
index_pruchodu_cyklem_radek = 1;

% reference - HDR obrazek vznikly kombinaci serie LDR snimku bez komprese
HDR_vstup_koderu = hdrimread(['in' int2str(i) '_slozeny_uniform_REFERENCE_bezeztratova_deltafstops_' num2str(krok_deltafstops) '.pfm']);

% cyklus pro pruchod ruznymi Q
for Q=Q_pocatecni:Q_krok:Q_koncove

    % hodnoceny JPEG XT HDR dekodovany snimek, tedy snimek prosly JPEG XT koderem a dekoderem
    HDR_dekodovany_vystup_dekoderu = hdrimread(['out' int2str(i) '_HDR_DEKODOVANY_slozeny_uniform_REFERENCE_bezeztratova_deltafstops_' num2str(krok_deltafstops) '_' TMO '_q_' int2str(q) '_Q_' int2str(Q) '.pfm']);
    
    % vypocet hodnot SNR, MSE a PSNR
    [peaksnr_HDR,snr_HDR] = psnr(HDR_dekodovany_vystup_dekoderu, HDR_vstup_koderu); % PSNR i SNR vychazi rovnou v dB, PSNR se v praci dale nijak nevyuziva
    mse_HDR = immse(HDR_dekodovany_vystup_dekoderu, HDR_vstup_koderu);
    
    % nasleduje zjisteni bitoveho toku aktualne hodnoceneho souboru v JPEG XT kodovane
    % podobe
    
    % zjisteni zakladnich informaci o souboru, vcetne velikosti v bajtech
    jpeg_xt_kodovany_soubor_info = dir(['out' int2str(i) '_LDR_slozeny_uniform_REFERENCE_bezeztratova_deltafstops_' num2str(krok_deltafstops) '_' TMO '_q_' int2str(q) '_Q_' int2str(Q) '.jpg']);

    % pomocna promenna pro nacteni obrazku pro zjisteni rozliseni
    img_kodovany = imread(['out' int2str(i) '_LDR_slozeny_uniform_REFERENCE_bezeztratova_deltafstops_' num2str(krok_deltafstops) '_' TMO '_q_' int2str(q) '_Q_' int2str(Q) '.jpg']);

    % zjisteni velikosti, poctu pixelu
    [vyska, sirka, dimenze] = size(img_kodovany); 
    pocet_pixelu = vyska * sirka; % pro vypocet bpp bits per pixel

    % zjisteni poctu bitu JPEG XT kodovaneho souboru
    pocet_bajtu_kodovany = jpeg_xt_kodovany_soubor_info.bytes;
    pocet_bitu_kodovany = pocet_bajtu_kodovany*8; 

    % zjisteni bitovych toku JPEG XT kodovaneho souboru
    bitovy_tok_kodovany = pocet_bitu_kodovany/pocet_pixelu;
    
    % ulozeni PSNR, SNR, MSE a hodnoty bitoveho toku do tabulky hodnot
    % inicializovane drive
    % index i oznacuje aktualne zpracovavany soubor
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,1) = q;
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,2) = Q;
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,3+index_pruchodu_cyklem_sloupec-1) = bitovy_tok_kodovany;
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,(3+pocet_souboru)+(index_pruchodu_cyklem_sloupec-1)*pocet_objektivnich_metrik) = peaksnr_HDR;
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,(4+pocet_souboru)+(index_pruchodu_cyklem_sloupec-1)*pocet_objektivnich_metrik) = snr_HDR;
    tabulka_objektivniho_hodnoceni(index_pruchodu_cyklem_radek,(5+pocet_souboru)+(index_pruchodu_cyklem_sloupec-1)*pocet_objektivnich_metrik) = mse_HDR;

    % inkrementace pomocneho indexu pro nastaveni noveho radku tabulky
    index_pruchodu_cyklem_radek = index_pruchodu_cyklem_radek+1;
    

end

index_pruchodu_cyklem_sloupec = index_pruchodu_cyklem_sloupec + 1;

end

% ulozeni vysledku, vysledne tabulky hodnoceni, do MAT souboru
save('SNR_MSE_velke_Q_bitovy_tok_Drago_JPEGXT.mat','tabulka_objektivniho_hodnoceni');












