def sinogram_as_rytov(uSin, u0=1, align=True):
    r"""Convert the complex wave field sinogram to the Rytov phase

    This method applies the Rytov approximation to the
    recorded complex wave sinogram. To achieve this, the following
    filter is applied:

    .. math::
        u_\mathrm{B}(\mathbf{r}) = u_\mathrm{0}(\mathbf{r})
            \ln\!\left(
            \frac{u_\mathrm{R}(\mathbf{r})}{u_\mathrm{0}(\mathbf{r})}
             +1 \right)

    This filter step effectively replaces the Born approximation
    :math:`u_\mathrm{B}(\mathbf{r})` with the Rytov approximation
    :math:`u_\mathrm{R}(\mathbf{r})`, assuming that the scattered
    field is equal to
    :math:`u(\mathbf{r})\approx u_\mathrm{R}(\mathbf{r})+
    u_\mathrm{0}(\mathbf{r})`.


    Parameters
    ----------
    uSin: 2d or 3d complex ndarray
        The sinogram of the complex wave
        :math:`u_\mathrm{R}(\mathbf{r}) + u_\mathrm{0}(\mathbf{r})`.
        The first axis iterates through the angles :math:`\phi_0`.
    u0: ndarray of dimension as `uSin` or less, or int.
        The incident plane wave
        :math:`u_\mathrm{0}(\mathbf{r})` at the detector.
        If `u0` is "1", it is assumed that the data is already
        background-corrected (
        `uSin` :math:`= \frac{u_\mathrm{R}(\mathbf{r})}{
        u_\mathrm{0}(\mathbf{r})} + 1`
        ). Note that if the reconstruction distance :math:`l_\mathrm{D}`
        of the original experiment is non-zero and `u0` is set to 1,
        then the reconstruction will be wrong; the field is not focused
        to the center of the reconstruction volume.
    align: bool
        Tries to correct for a phase offset in the phase sinogram.

    Returns
    -------
    uB: 2d or 3d real ndarray
        The Rytov-filtered complex sinogram
        :math:`u_\mathrm{B}(\mathbf{r})`.

    See Also
    --------
    skimage.restoration.unwrap_phase: phase unwrapping
    """
    ndims = len(uSin.shape)

    # imaginary part of the complex Rytov phase
    phiR = np.angle(uSin / u0)

    # real part of the complex Rytov phase
    lna = np.log(np.absolute(uSin / u0))

    if ndims == 2:
        # unwrapping is very important
        phiR[:] = np.unwrap(phiR, axis=-1)
    else:
        # Unwrap gets the dimension of the problem from the input
        # data. Since we have a sinogram, we need to pass it the
        # slices one by one.
        for ii in range(len(phiR)):
            phiR[ii] = unwrap_phase(phiR[ii], seed=47)

    if align:
        align_unwrapped(phiR)

    # rytovSin = u0*(np.log(a/a0) + 1j*phiR)
    # u0 is one - we already did background correction

    # complex rytov phase:
    rytovSin = 1j * phiR + lna
    return u0 * rytovSin
def sinogram_as_rytov ( uSin , u0 = 1 , align = True ) : ndims = len ( uSin . shape ) phiR = np . angle ( uSin / u0 ) lna = np . log ( np . absolute ( uSin / u0 ) ) if ndims == 2 : phiR [ : ] = np . unwrap ( phiR , axis = - 1 ) else : for ii in range ( len ( phiR ) ) : phiR [ ii ] = unwrap_phase ( phiR [ ii ] , seed = 47 ) if align : align_unwrapped ( phiR ) rytovSin = 1j * phiR + lna return u0 * rytovSin
r"""Convert the complex wave field sinogram to the Rytov phase

    This method applies the Rytov approximation to the
    recorded complex wave sinogram. To achieve this, the following
    filter is applied:

    .. math::
        u_\mathrm{B}(\mathbf{r}) = u_\mathrm{0}(\mathbf{r})
            \ln\!\left(
            \frac{u_\mathrm{R}(\mathbf{r})}{u_\mathrm{0}(\mathbf{r})}
             +1 \right)

    This filter step effectively replaces the Born approximation
    :math:`u_\mathrm{B}(\mathbf{r})` with the Rytov approximation
    :math:`u_\mathrm{R}(\mathbf{r})`, assuming that the scattered
    field is equal to
    :math:`u(\mathbf{r})\approx u_\mathrm{R}(\mathbf{r})+
    u_\mathrm{0}(\mathbf{r})`.


    Parameters
    ----------
    uSin: 2d or 3d complex ndarray
        The sinogram of the complex wave
        :math:`u_\mathrm{R}(\mathbf{r}) + u_\mathrm{0}(\mathbf{r})`.
        The first axis iterates through the angles :math:`\phi_0`.
    u0: ndarray of dimension as `uSin` or less, or int.
        The incident plane wave
        :math:`u_\mathrm{0}(\mathbf{r})` at the detector.
        If `u0` is "1", it is assumed that the data is already
        background-corrected (
        `uSin` :math:`= \frac{u_\mathrm{R}(\mathbf{r})}{
        u_\mathrm{0}(\mathbf{r})} + 1`
        ). Note that if the reconstruction distance :math:`l_\mathrm{D}`
        of the original experiment is non-zero and `u0` is set to 1,
        then the reconstruction will be wrong; the field is not focused
        to the center of the reconstruction volume.
    align: bool
        Tries to correct for a phase offset in the phase sinogram.

    Returns
    -------
    uB: 2d or 3d real ndarray
        The Rytov-filtered complex sinogram
        :math:`u_\mathrm{B}(\mathbf{r})`.

    See Also
    --------
    skimage.restoration.unwrap_phase: phase unwrapping