function [vystup,Hinv]=wiener(I,PSF,NSR,hm1,hodnotahm1,hm2,hodnotahm2,dm1,hodnotadm1,dm2,hodnotadm2)
%[vystup,Hinv]=wiener(I,PSF,NSR,hm1,hodnotahm1,hm2,hodnotahm2,dm1,hodnotadm1,
%dm2,hodnotadm2)
%
%funkce služící pro provedení wienerovské filtrace při znalosti nebo předpokladu 
%poměru signálu k šumu, pro potřeby funkce v opačném poměru NSR.
%
%
%              1          |H(u,v)|^2
% G(u,v)  = ------  * ------------------
%           H(u,v)     |H(u,v)|^2 + NSR
%
%
% 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)
%U této varianty Wienerovy filtrace však není jeho aplikace nutná. Část
%rovnice 1/H(u,v) působící problémy je kompenzována druhým lomeným výrazem tak,
%že extrémní hodnoty jsou účinně potlačeny.
%--------------------------------------------------------------------------
% T=zeros(2*size(I));
% T(1:512,1:1024)=I;
% I=T;

H = psf2otf(PSF, size(I));
S_n=ones(size(I))*NSR;
S_y=ones(size(I));

denom = (abs(H)).^2;
denom = denom + (S_n./S_y);

denom = max(denom, sqrt(eps));
F=abs(H).^2;
Q = F ./ denom;
Hi=(1./H);
Hinv=Q.*Hi;
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
% vystup=vystup(1:512,1:1024);