code: def skimage_radon_back_projector(sinogram, geometry, range, out=None):
      
      # 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
docs: 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.