%% test zpracovani v matlabu
clc, clear all, close all;

[filename, pathname] = uigetfile({'*.*'},'Vyberte soubor obrazku');              %dialog pro vyber souboru obrazku
cd(pathname);                           %zmena cesty v matlabu                                                    
[pathstr,name,ext]=fileparts(filename); %nacteni vlastnosti souboru, 
										%pro nas dulezita pripona
typ = ext;
exr = strcmp(typ,'.exr');

if(exr)                       %podminka pro nacteni 
							  %souboru s priponou exr
im2 = exrread(filename);      %nacteni exr obrazku
im2 = imresize(im2, [NaN 1024]);     %volitene zmeneseni rozmeru obrazku, napr.
							         %pro zrychleni zpracovani pri testovani
im1=im2;                               
else
im2 = imread(filename);
im2 = imresize(im2, [NaN 1024]);     %volitene zmeneseni rozmeru obrazku, napr.
							         %pro zrychleni zpracovani pri testovani
im1=im2;                               
im2=single(im2);              %prevod do single formatu
end
       
im3=sqrt(im2);                %pronasobni odmocninou

s=size(im2);                  %zjisteni velikosti
h = fspecial('gaussian', [s(1) s(2)], 3.0); %vytvoreni Gaussovskeho filtru  o velikosti s a 
im4 = imfilter(im3, h);       %aplikace filtru na obraz

imL= im2./im4; %podeleni puvodniho obrazu s obrazem po aplikaci Gauss filtru

imL=real(imL); %odstraneni komplexni slozky

min1 = min(min(min(imL)));    %zjisteni min. hodnoty
imL=(imL-min1);               %posun do nuly

max1 = max(max(max(imL)));    %zjisteni max. hodnoty
k = 255/max1;                 %zjisteni konstanty pro posun do hod. 255
imL=imL.*k;                   %posun jednotl. prvku matice do hod. 255

A = 57;B = 20;C = 330;D = 14.3;E = 21;F = 0; %konstanty pro krivky
G = 0.33; I = 800;A1 = 100;I1 = 4;B1 = 100;  %konstanty pro krivky

for x = 1:s(1)             %kalibrace LCD
    for y = 1:s(2)
        pom = imL(x,y,1);  %aplikace aplikacni krivky na obraz
        imLc(x,y,1) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));
        pom = imL(x,y,2);
        imLc(x,y,2) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));
        pom = imL(x,y,3);
        imLc(x,y,3) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));       
    end
end
                    
imLc=uint8(imLc);

%imL= flipdim(imL,2);        %horizontalni otoceni
%imL= flipdim(imL,1);        %vertikalni otoceni
%imL = flipdim(imL,2);       %horizontalni+vertikalni otoceni

imwrite(imLc, 'LCD.png', 'png'); %zapis obrazu pro LCD do souboru


imP=im3; 

min2 = min(min(min(imP)));   %zjisteni min. hodnoty
imP=(imP-min2);              %posun do nuly

max2 = max(max(max(imP)));   %zjisteni max. hodnoty
l = 255/max2;                %zjisteni konstanty pro posun do hod. 255
imP=imP.*l;                  %posun jednotl. prvku matice do hod.

A = 100;B = 125;C = 40;D = 12.8;E = 21;F = 0; %konstanty pro krivky
G = 0.25; I = 200;A1 = 75;I1 = 1000;B1 = 10;  %konstanty pro krivky

for x = 1:s(1)               %kalibrace projektoru
    for y = 1:s(2)           %aplikace aplikacni krivky na obraz
        pom = imP(x,y,1);
        imPc(x,y,1) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));
        pom = imP(x,y,2);
        imPc(x,y,2) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));
        pom = imP(x,y,3);
        imPc(x,y,3) = G*pom + A*(1-I.^(-pom./B)) + C*(exp(pom./D-E))-F + A1*(1-I1.^(-pom./B1));       
    end
end

imPc=real(imPc);             %odstraneni komplexni slozky
imPc=uint8(imPc);            %prevod do int formatu
%imPc= rgb2gray(imPc);        %prevod do sedotonove skaly

%imPc= flipdim(imP,2);       %horizontalni otoceni
%imPc= flipdim(imP,1);       %vertikalni otoceni
%imPc = flipdim(imP,2);      %horizontalni+vertikalni otoceni

imwrite(imPc, 'projektor.png', 'png'); %zapis obrazu pro projektor do souboru

figure(1);       %zobrazeni obrazku v plotu pro kontrolu a testovani
subplot(331);
imshow(im1), title('Orig');
subplot(332);
imshow(imLc), title('Obraz pro LCD');
subplot(333);
imshow(imP), title('Obraz pro projektor'); 