
% rozeznavani znaku 3
% neuronova sit

function sfa7_3

close all

% nacitam znaky


vzor{1}=double(imread("a000.jpg")); % 0 deg
vzor{2}=double(imread("a225.jpg")); % 22.5 deg
vzor{3}=double(imread("a450.jpg")); 

vzor{4}=double(imread("s000.jpg"));
vzor{5}=double(imread("s225.jpg"));
vzor{6}=double(imread("s450.jpg"));


vzor{7}=double(imread("a120.jpg"));
vzor{8}=double(imread("s120.jpg"));

%vzor{7}=double(imread("a100.jpg"));
%vzor{8}=double(imread("s100.jpg"));



dim=size(vzor{1})
centr=floor(dim(1)/2)+1;

pocet1=6; % pocet pro nastaveni neuron. site
pocet2=8; % celkovy pocet

% nejprve filtr prizpusobeny a000.jpg

h=vzor{1};
matched=conj(ft2(h,1));

for i=1:pocet2
  g=ft2(vzor{i},1);
  g2=g.*matched;
  vzoro{i}=abs(ift2(g2,1));
end

% skladam vystupy do jednoho obrazku
% neni schopno detekovat rotovane vzory ...
img=[];
imgo=[];
for i=1:pocet2
  img=[img,vzor{i}];
  imgo=[imgo,vzoro{i}];
end
figure(1,'units','normalized','position',[0,1,0.8,0.2])
imshow(img,[]);
figure(2,'units','normalized','position',[0,1,0.8,0.2])
imshow(imgo,[]);


% ted neuronova sit


odezva=[1;1;1;0;0;0]  % pozadovana odezva pro prvnich 6 vzoru

% korelace mezi vzory

for i=1:pocet1
for j=1:pocet1
  g1=ft2(vzor{i},1); g2=ft2(vzor{j},1);
  korelace(i,j)=sum(sum(g1.*conj(g2)));
end
end


% koeficienty rozkladu filtru

coef=korelace\odezva;
coef=conj(coef);

% odezva filtru

h=zeros(dim(1));
for i=1:pocet1
  h+=vzor{i}*coef(i);
endfor

figure(3)
imshow(real(h),[])


% spektralni filtr

filtr=conj(ft2(h,1));

% kontrola na vzorech

korel=[];
for i=1:pocet1
  g=ft2(vzor{i},1);
  g2=g.*filtr;
  korel=[korel;real(sum(sum(g2)))];
  vzoro{i}=abs(ift2(g2,1));
end
korel  % korelace pro prvnich 6 vzoru pouzitych pro konstrukci filtru

% skladam do jednoho obrazku
% mnohem lepsi ...
z1=centr-3;z2=centr+3;  % pro zoom centralni casti
imgo=[];
imgozoom=[];
for i=1:pocet1
  imgo=[imgo,vzoro{i}];
  imgozoom=[imgozoom,vzoro{i}(z1:z2,z1:z2)];
end
figure(4,'units','normalized','position',[0,1,0.6,0.2])
imshow(imgo,[]);
figure(5,'units','normalized','position',[0,1,0.6,0.2])
imshow(imgozoom,[]);



% jina rotace - neni zahrnuta mezi vzory pouzite pri konstrukci filtru!
% korelace je slabsi, ale dostatecna

g2=ft2(vzor{7},1).*filtr;
aout=abs(ift2(g2,1));
korel_a=real(sum(sum(g2)))

g2=ft2(vzor{8},1).*filtr;
sout=abs(ift2(g2,1));
korel_s=real(sum(sum(g2)))

figure(6)
subplot(2,2,1)
imshow(vzor{7},[]);
subplot(2,2,2);
imshow(vzor{8},[]);
subplot(2,2,3);
imshow(aout(z1-3:z2+3,z1-3:z2+3),[]);
subplot(2,2,4);
imshow(sout(z1-3:z2+3,z1-3:z2+3),[]);




end



function G=ft2(g,del)
 G=fftshift(fft2(fftshift(g)))*del*del;
end


function g=ift2(G,delf)
 g=ifftshift(ifft2(ifftshift(G)))*(delf*size(G,1))^2;
end

