function [vystup,Hinv]=wiener_v2(I,S_n,S_y,PSF,hm1,hodnotahm1,hm2,hodnotahm2,dm1,hodnotadm1,dm2,hodnotadm2)
%[J,Hinv]=wiener_v2(I,S_n,S_y,PSF,hm1,hodnotahm1,hm2,hodnotahm2,dm1,hodnota
%dm1,dm2,hodnotadm2)
%
%funkce služící pro provedení wienerovské filtrace při znalosti spekter šumu
%S_n(u,v) a obrazu S_y(u,v) dle vzorce
%
%             1      S_y(u,v)-S_n(u,v)
% G(u,v)  = ----- * -------------------
%           H(u,v)        S_y(u,v)
%
% vystup= FT^(-1) [G(u,v)* FT(I(x,y))]
%
%parametr 4. až 11. slouží pro definici omezujícího filtru aplikovaného na
%G(u,v)
%---------------------------------------------------------------------------
H = psf2otf(PSF, size(I));
WKF=(S_y-S_n);
WKF=WKF./S_y;
WKF(WKF<0)=0;
Hinv=1./H;
Hinv=Hinv.*(WKF);
if isempty(dm1) || isempty(hodnotadm1)

else
    if isempty(dm2) || isempty(hodnotadm2)
        Hinv(Hinv<dm1)=hodnotadm1;
        
    else
        if dm2<dm1
        Hinv(Hinv<dm2)=hodnotadm2;
        Hinv(Hinv<dm1)=hodnotadm1;
        else
        Hinv(Hinv<dm1)=hodnotadm1;
        Hinv(Hinv<dm2)=hodnotadm2;
        end
    end
end

if isempty(hm1) || isempty(hodnotahm1)

else
    if isempty(hm2) || isempty(hodnotahm2)
        Hinv(Hinv>hm1)=hodnotahm1;
    else
        if hm2>hm1
        Hinv(Hinv>hm2)=hodnotahm2;
        Hinv(Hinv>hm1)=hodnotahm1;
        else
        Hinv(Hinv>hm1)=hodnotahm1;
        Hinv(Hinv>hm2)=hodnotahm2;
        end
    end
end
G=Hinv;
vystup = ifftn(G.* (fftn(I)));
if isreal(I) && isreal(PSF)
    vystup= real(vystup);
end
