ó
î&]\c           @` s¸   d  d l  m Z m Z m Z d  d l Z d d l m Z d d l m Z d d d d	 g Z d
 „  Z	 d „  Z
 d d d d „ Z d d d d „ Z d d d d „ Z d d d d „ Z d S(   i    (   t   divisiont   print_functiont   absolute_importNi   (   t   _ni_support(   t	   _nd_imaget   fourier_gaussiant   fourier_uniformt   fourier_ellipsoidt   fourier_shiftc         C` sñ   |  d  k rl | j j t j t j t j g k rN t j | j d | j ƒ}  qí t j | j d t j	 ƒ}  n t |  ƒ t k rÌ |  t j t j t j t j	 g k r± t
 d ƒ ‚ n  t j | j d |  ƒ}  n! |  j | j k rí t
 d ƒ ‚ n  |  S(   Nt   dtypes   output type not supporteds   output shape not correct(   t   NoneR	   t   typet   numpyt	   complex64t
   complex128t   float32t   zerost   shapet   float64t   RuntimeError(   t   outputt   input(    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyt   _get_output_fourier)   s    c         C` sß   |  d  k rf | j j t j t j g k rH t j | j d | j ƒ}  qÛ t j | j d t j ƒ}  nu t |  ƒ t k rº |  t j t j g k rŸ t d ƒ ‚ n  t j | j d |  ƒ}  n! |  j | j k rÛ t d ƒ ‚ n  |  S(   NR	   s   output type not supporteds   output shape not correct(	   R
   R	   R   R   R   R   R   R   R   (   R   R   (    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyt   _get_output_fourier_complex:   s    iÿÿÿÿc         C` s›   t  j |  ƒ }  t | |  ƒ } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s{ | j
 ƒ  } n  t j |  | | | | d ƒ | S(   s#  
    Multi-dimensional Gaussian fourier filter.

    The array is multiplied with the fourier transform of a Gaussian
    kernel.

    Parameters
    ----------
    input : array_like
        The input array.
    sigma : float or sequence
        The sigma of the Gaussian kernel. If a float, `sigma` is the same for
        all axes. If a sequence, `sigma` has to contain one value for each
        axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_gaussian : ndarray
        The filtered input.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_gaussian(input_, sigma=4)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i    (   R   t   asarrayR   R   t   _check_axist   ndimt   _normalize_sequenceR   t   flagst
   contiguoust   copyR   t   fourier_filter(   R   t   sigmat   nt   axisR   t   sigmas(    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyR   I   s    /c         C` s›   t  j |  ƒ }  t | |  ƒ } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s{ | j
 ƒ  } n  t j |  | | | | d ƒ | S(   s%  
    Multi-dimensional uniform fourier filter.

    The array is multiplied with the fourier transform of a box of given
    size.

    Parameters
    ----------
    input : array_like
        The input array.
    size : float or sequence
        The size of the box used for filtering.
        If a float, `size` is the same for all axes. If a sequence, `size` has
        to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_uniform : ndarray
        The filtered input.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_uniform(input_, size=20)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i   (   R   R   R   R   R   R   R   R   R   R   R   R   R   (   R   t   sizeR!   R"   R   t   sizes(    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyR   „   s    /c         C` s›   t  j |  ƒ }  t | |  ƒ } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s{ | j
 ƒ  } n  t j |  | | | | d ƒ | S(   s‡  
    Multi-dimensional ellipsoid fourier filter.

    The array is multiplied with the fourier transform of a ellipsoid of
    given sizes.

    Parameters
    ----------
    input : array_like
        The input array.
    size : float or sequence
        The size of the box used for filtering.
        If a float, `size` is the same for all axes. If a sequence, `size` has
        to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of filtering the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_ellipsoid : ndarray
        The filtered input.

    Notes
    -----
    This function is implemented for arrays of rank 1, 2, or 3.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import numpy.fft
    >>> import matplotlib.pyplot as plt
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_ellipsoid(input_, size=20)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   i   (   R   R   R   R   R   R   R   R   R   R   R   R   R   (   R   R$   R!   R"   R   R%   (    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyR   ¾   s    3c         C` s˜   t  j |  ƒ }  t | |  ƒ } t j | |  j ƒ } t j | |  j ƒ } t  j | d t  j ƒ} | j j	 s{ | j
 ƒ  } n  t j |  | | | | ƒ | S(   s  
    Multi-dimensional fourier shift filter.

    The array is multiplied with the fourier transform of a shift operation.

    Parameters
    ----------
    input : array_like
        The input array.
    shift : float or sequence
        The size of the box used for filtering.
        If a float, `shift` is the same for all axes. If a sequence, `shift`
        has to contain one value for each axis.
    n : int, optional
        If `n` is negative (default), then the input is assumed to be the
        result of a complex fft.
        If `n` is larger than or equal to zero, the input is assumed to be the
        result of a real fft, and `n` gives the length of the array before
        transformation along the real transform direction.
    axis : int, optional
        The axis of the real transform.
    output : ndarray, optional
        If given, the result of shifting the input is placed in this array.
        None is returned in this case.

    Returns
    -------
    fourier_shift : ndarray
        The shifted input.

    Examples
    --------
    >>> from scipy import ndimage, misc
    >>> import matplotlib.pyplot as plt
    >>> import numpy.fft
    >>> fig, (ax1, ax2) = plt.subplots(1, 2)
    >>> plt.gray()  # show the filtered result in grayscale
    >>> ascent = misc.ascent()
    >>> input_ = numpy.fft.fft2(ascent)
    >>> result = ndimage.fourier_shift(input_, shift=200)
    >>> result = numpy.fft.ifft2(result)
    >>> ax1.imshow(ascent)
    >>> ax2.imshow(result.real)  # the imaginary part is an artifact
    >>> plt.show()
    R	   (   R   R   R   R   R   R   R   R   R   R   R   R   R   (   R   t   shiftR!   R"   R   t   shifts(    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyR   ü   s    .(   t
   __future__R    R   R   R   t    R   R   t   __all__R   R   R
   R   R   R   R   (    (    (    s4   lib/python2.7/site-packages/scipy/ndimage/fourier.pyt   <module>   s   				;:>