+
    Ai?1                         R t ^ RIt^ RIHt ^RIHt RR ltRR ltRR lt	RR lt
R tR tR	 tRR
 ltR tRR ltRR ltR# )a  Function of unitary fourier transform (uft) and utilities

This module implements the unitary fourier transform, also known as
the ortho-normal transform. It is especially useful for convolution
[1], as it respects the Parseval equality. The value of the null
frequency is equal to

.. math::  \frac{1}{\sqrt{n}} \sum_i x_i

so the Fourier transform has the same energy as the original image
(see ``image_quad_norm`` function). The transform is applied from the
last axis for performance (assuming a C-order array input).

References
----------
.. [1] B. R. Hunt "A matrix theory proof of the discrete convolution
       theorem", IEEE Trans. on Audio and Electroacoustics,
       vol. au-19, no. 4, pp. 285-288, dec. 1971

N)_supported_float_typec                n    Vf   V P                   p\        P                  ! V \        V) ^ 4      RR7      pV# )a  N-dimensional unitary Fourier transform.

Parameters
----------
inarray : ndarray
    The array to transform.
dim : int, optional
    The last axis along which to compute the transform. All
    axes by default.

Returns
-------
outarray : ndarray (same shape than inarray)
    The unitary N-D Fourier transform of ``inarray``.

Examples
--------
>>> input = np.ones((3, 3, 3))
>>> output = ufftn(input)
>>> np.allclose(np.sum(input) / np.sqrt(input.size), output[0, 0, 0])
True
>>> output.shape
(3, 3, 3)
orthoaxesnorm)ndimfftfftnrangeinarraydimoutarrays   && U/var/www/html/photoedit/myenv/lib/python3.14/site-packages/skimage/restoration/uft.pyufftnr      s1    2 {llxxeSD!n7CHO    c                n    Vf   V P                   p\        P                  ! V \        V) ^ 4      RR7      pV# )a  N-dimensional unitary inverse Fourier transform.

Parameters
----------
inarray : ndarray
    The array to transform.
dim : int, optional
    The last axis along which to compute the transform. All
    axes by default.

Returns
-------
outarray : ndarray
    The unitary inverse nD Fourier transform of ``inarray``. Has the same shape as
    ``inarray``.

Examples
--------
>>> input = np.ones((3, 3, 3))
>>> output = uifftn(input)
>>> np.allclose(np.sum(input) / np.sqrt(input.size), output[0, 0, 0])
True
>>> output.shape
(3, 3, 3)
r   r   )r   r	   ifftnr   r   s   && r   uifftnr   ;   s1    4 {llyyucT1~GDHOr   c                n    Vf   V P                   p\        P                  ! V \        V) ^ 4      RR7      pV# )a$  N-dimensional real unitary Fourier transform.

This transform considers the Hermitian property of the transform on
real-valued input.

Parameters
----------
inarray : ndarray, shape (M[, ...], P)
    The array to transform.
dim : int, optional
    The last axis along which to compute the transform. All
    axes by default.

Returns
-------
outarray : ndarray, shape (M[, ...], P / 2 + 1)
    The unitary N-D real Fourier transform of ``inarray``.

Notes
-----
The ``urfft`` functions assume an input array of real
values. Consequently, the output has a Hermitian property and
redundant values are not computed or returned.

Examples
--------
>>> input = np.ones((5, 5, 5))
>>> output = urfftn(input)
>>> np.allclose(np.sum(input) / np.sqrt(input.size), output[0, 0, 0])
True
>>> output.shape
(5, 5, 3)
r   r   )r   r	   rfftnr   r   s   && r   urfftnr   [   s2    D {llyyucT1~GDHOr   c                n    Vf   V P                   p\        P                  ! W\        V) ^ 4      RR7      pV# )a  N-dimensional inverse real unitary Fourier transform.

This transform considers the Hermitian property of the transform
from complex to real input.

Parameters
----------
inarray : ndarray
    The array to transform.
dim : int, optional
    The last axis along which to compute the transform. All
    axes by default.
shape : tuple of int, optional
    The shape of the output. The shape of ``rfft`` is ambiguous in
    case of odd-valued input shape. In this case, this parameter
    should be provided. See ``np.fft.irfftn``.

Returns
-------
outarray : ndarray
    The unitary N-D inverse real Fourier transform of ``inarray``.

Notes
-----
The ``uirfft`` function assumes that the output array is
real-valued. Consequently, the input is assumed to have a Hermitian
property and redundant values are implicit.

Examples
--------
>>> input = np.ones((5, 5, 5))
>>> output = uirfftn(urfftn(input), shape=input.shape)
>>> np.allclose(input, output)
True
>>> output.shape
(5, 5, 5)
r   r   )r   r	   irfftnr   )r   r   shaper   s   &&& r   uirfftnr      s2    L {llzz'ucT1~GLHOr   c                    \        V ^4      # )a  2-dimensional unitary Fourier transform.

Compute the Fourier transform on the last 2 axes.

Parameters
----------
inarray : ndarray
    The array to transform.

Returns
-------
outarray : ndarray (same shape as inarray)
    The unitary 2-D Fourier transform of ``inarray``.

See Also
--------
uifft2, ufftn, urfftn

Examples
--------
>>> input = np.ones((10, 128, 128))
>>> output = ufft2(input)
>>> np.allclose(np.sum(input[1, ...]) / np.sqrt(input[1, ...].size),
...             output[1, 0, 0])
True
>>> output.shape
(10, 128, 128)
)r   r   s   &r   ufft2r      s    : !r   c                    \        V ^4      # )a3  2-dimensional inverse unitary Fourier transform.

Compute the inverse Fourier transform on the last 2 axes.

Parameters
----------
inarray : ndarray
    The array to transform.

Returns
-------
outarray : ndarray (same shape as inarray)
    The unitary 2-D inverse Fourier transform of ``inarray``.

See Also
--------
uifft2, uifftn, uirfftn

Examples
--------
>>> input = np.ones((10, 128, 128))
>>> output = uifft2(input)
>>> np.allclose(np.sum(input[1, ...]) / np.sqrt(input[1, ...].size),
...             output[0, 0, 0])
True
>>> output.shape
(10, 128, 128)
)r   r   s   &r   uifft2r!      s    : '1r   c                    \        V ^4      # )a  2-dimensional real unitary Fourier transform

Compute the real Fourier transform on the last 2 axes. This
transform considers the Hermitian property of the transform from
complex to real-valued input.

Parameters
----------
inarray : ndarray, shape (M[, ...], P)
    The array to transform.

Returns
-------
outarray : ndarray, shape (M[, ...], 2 * (P - 1))
    The unitary 2-D real Fourier transform of ``inarray``.

See Also
--------
ufft2, ufftn, urfftn

Examples
--------
>>> input = np.ones((10, 128, 128))
>>> output = urfft2(input)
>>> np.allclose(np.sum(input[1,...]) / np.sqrt(input[1,...].size),
...             output[1, 0, 0])
True
>>> output.shape
(10, 128, 65)
)r   r   s   &r   urfft2r#      s    > '1r   c                    \        V ^VR7      # )ai  2-dimensional inverse real unitary Fourier transform.

Compute the real inverse Fourier transform on the last 2 axes.
This transform considers the Hermitian property of the transform
from complex to real-valued input.

Parameters
----------
inarray : ndarray, shape (M[, ...], P)
    The array to transform.
shape : tuple of int, optional
    The shape of the output. The shape of ``rfft`` is ambiguous in
    case of odd-valued input shape. In this case, this parameter
    should be provided. See ``np.fft.irfftn``.

Returns
-------
outarray : ndarray, shape (M[, ...], 2 * (P - 1))
    The unitary 2-D inverse real Fourier transform of ``inarray``.

See Also
--------
urfft2, uifftn, uirfftn

Examples
--------
>>> input = np.ones((10, 128, 128))
>>> output = uirfftn(urfftn(input), shape=input.shape)
>>> np.allclose(input, output)
True
>>> output.shape
(10, 128, 128)
)r   )r   )r   r   s   &&r   uirfft2r%     s    D 7AU++r   c                   V P                   R,          V P                   R,          8w  d   ^\        P                  ! \        P                  ! \        P                  ! V 4      ^,          RR7      RR7      ,          \        P                  ! \        P                  ! V R,          4      ^,          RR7      ,
          # \        P                  ! \        P                  ! \        P                  ! V 4      ^,          RR7      RR7      # )a  Return the quadratic norm of images in Fourier space.

This function detects whether the input image satisfies the
Hermitian property.

Parameters
----------
inarray : ndarray
    Input image. The image data should reside in the final two
    axes.

Returns
-------
norm : float
    The quadratic norm of ``inarray``.

Examples
--------
>>> input = np.ones((5, 5))
>>> image_quad_norm(ufft2(input)) == np.sum(np.abs(input)**2)
True
>>> image_quad_norm(ufft2(input)) == image_quad_norm(urfft2(input))
True
)axis).    )r   npsumabsr   s   &r   image_quad_normr.   6  s    4 }}RGMM"--266"&&A!5B?bIIBFFFF76?#q(rM
 
 	
 vvbffRVVG_1;"EEr   c                   V'       g   V P                   p\        V P                  4      p\        P                  ! WR7      pY\        V P                   Uu. uF  p\        ^ V4      NK  	  up4      &   \        V P                  4       F\  w  rxWpP                   V,
          8  g   K  \        P                  ! V\        \        P                  ! V^,          4      4      ) VR7      pK^  	  V'       d   \        P                  M\        P                  p	V	! V\        V) ^ 4      R7      p
\        P                   ! V\        P"                  4      pV
P%                  VRR7      # u upi )a  Compute the transfer function of an impulse response (IR).

This function makes the necessary correct zero-padding, zero
convention, correct fft2, etc... to compute the transfer function
of IR. To use with unitary Fourier transform for the signal (ufftn
or equivalent).

Parameters
----------
imp_resp : ndarray
    The impulse responses.
shape : tuple of int
    A tuple of integer corresponding to the target shape of the
    transfer function.
dim : int, optional
    The last axis along which to compute the transform. All
    axes by default.
is_real : bool, optional
   If True (default), imp_resp is supposed real and the Hermitian property
   is used with rfftn Fourier transform.

Returns
-------
y : complex ndarray
   The transfer function of shape ``shape``.

See Also
--------
ufftn, uifftn, urfftn, uirfftn

Examples
--------
>>> np.all(np.array([[4, 0], [0, 0]]) == ir2tf(np.ones((2, 2)), (2, 2)))
True
>>> ir2tf(np.ones((2, 2)), (512, 512)).shape == (512, 257)
True
>>> ir2tf(np.ones((2, 2)), (512, 512), is_real=False).shape == (512, 512)
True

Notes
-----
The input array can be composed of multiple-dimensional IR with
an arbitrary number of IR. The individual IR must be accessed
through the first axes. The last ``dim`` axes contain the space
definition.
)dtype)shiftr'   )r   F)copy)r   r   r0   r+   zerostupler   slice	enumeraterollintfloorr	   r   r
   r   promote_types	complex64astype)imp_respr   r   is_realirpadded_dtypeirpaddedsr'   	axis_sizefuncout
cplx_dtypes   &&&&        r   ir2tfrF   X  s    ^ mm*8>>:Nxx4H=EU8AE!QK89: %X^^4==3&&wwxBHHY]4K0L/LSWXH 5  399SXXD
xucT1~
/C !!.",,?J::ju:-- 9s   Ec                   \         P                  ! ^.V ,          4      p\        V 4       F  p\        \	        ^^4      .V,          \	        R4      .,           \	        ^^4      .W,
          ^,
          ,          ,           4      p\         P
                  ! . RO4      P                  \        V 4       Uu. uF  qfV8X  d   RM^NK  	  up4      W5&   K  	  RV ,          V\	        ^^4      3V ,          &   \        W1VR7      V3# u upi )a  Return the transfer function of the Laplacian.

Laplacian is the second order difference, on row and column.

Parameters
----------
ndim : int
    The dimension of the Laplacian.
shape : tuple
    The support on which to compute the transfer function.
is_real : bool, optional
   If True (default), imp_resp is assumed to be real-valued and
   the Hermitian property is used with rfftn Fourier transform
   to return the transfer function.

Returns
-------
tf : array_like, complex
    The transfer function.
impr : array_like, real
    The Laplacian.

Examples
--------
>>> tf, ir = laplacian(2, (32, 32))
>>> np.all(ir == np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]]))
True
>>> np.all(tf == ir2tf(ir, (32, 32)))
True
Ng       @)r>   )      g        rH   r(   )r+   r3   r   r4   r5   arrayreshaperF   )r   r   r>   imprr   idxis   &&&    r   	laplacianrN     s    > 88QC$JDT{1a[MC5;-/5A;-4:PQ>2RR
 HH./77,1$K8Kq8R"K8
		  #&*D%1+$	g.44 9s   /C<
)N)NN)NT)T)__doc__numpyr+   	scipy.fftr	   _shared.utilsr   r   r   r   r   r   r!   r#   r%   r.   rF   rN    r   r   <module>rT      sW   *   1>@%P)X@@D",JFD@.F(5r   