def skimage_radon_back_projector(sinogram, geometry, range, out=None):
    """Calculate forward projection using skimage.

    Parameters
    ----------
    sinogram : `DiscreteLpElement`
        Sinogram (projections) to backproject.
    geometry : `Geometry`
        The projection geometry to use.
    range : `DiscreteLp`
        range of this projection (volume space).
    out : ``range`` element, optional
        An element in range that the result should be written to.

    Returns
    -------
    sinogram : ``range`` element
        Sinogram given by the projection.
    """
    # Lazy import due to significant import time
    from skimage.transform import iradon

    theta = skimage_theta(geometry)
    skimage_range = skimage_sinogram_space(geometry, range, sinogram.space)

    skimage_sinogram = skimage_range.element()
    skimage_sinogram.sampling(clamped_interpolation(range, sinogram))

    if out is None:
        out = range.element()
    else:
        # Only do asserts here since these are backend functions
        assert out in range

    # Rotate back from (rows, cols) to (x, y)
    backproj = iradon(skimage_sinogram.asarray().T, theta,
                      output_size=range.shape[0], filter=None, circle=False)
    out[:] = np.rot90(backproj, -1)

    # Empirically determined value, gives correct scaling
    scaling_factor = 4.0 * float(geometry.motion_params.length) / (2 * np.pi)

    # Correct in case of non-weighted spaces
    proj_extent = float(sinogram.space.partition.extent.prod())
    proj_size = float(sinogram.space.partition.size)
    proj_weighting = proj_extent / proj_size

    scaling_factor *= (sinogram.space.weighting.const /
                       proj_weighting)
    scaling_factor /= (range.weighting.const /
                       range.cell_volume)

    # Correctly scale the output
    out *= scaling_factor

    return out
Calculate forward projection using skimage.

    Parameters
    ----------
    sinogram : `DiscreteLpElement`
        Sinogram (projections) to backproject.
    geometry : `Geometry`
        The projection geometry to use.
    range : `DiscreteLp`
        range of this projection (volume space).
    out : ``range`` element, optional
        An element in range that the result should be written to.

    Returns
    -------
    sinogram : ``range`` element
        Sinogram given by the projection.