docs: def roberts(image, mask=None):
      '''Find edges using the Roberts algorithm
  
      image - the image to process
      mask  - mask of relevant points
  
      The algorithm returns the magnitude of the output of the two Roberts
      convolution kernels.
  
      The following is the canonical citation for the algorithm:
      L. Roberts Machine Perception of 3-D Solids, Optical and
      Electro-optical Information Processing, MIT Press 1965.
  
      The following website has a tutorial on the algorithm:
      http://homepages.inf.ed.ac.uk/rbf/HIPR2/roberts.htm
      '''
      result = np.zeros(image.shape)
      #
      # Four quadrants and two convolutions:
      #
      # q0,0 | q0,1    1  |  0  anti-diagonal
      # q1,0 | q1,1    0  | -1
      #
      # q-1,0 | q0,0   0  |  1  diagonal
      # q-1,1 | q0,1  -1  |  0
      #
      # Points near the mask edges and image edges are computed unreliably
      # so make them zero (no edge) in the result
      #
      if mask is None:
          mask = np.ones(image.shape, bool)
      big_mask = binary_erosion(mask,
                                generate_binary_structure(2,2),
                                border_value = 0)
      result[big_mask==False] = 0
      q00   = image[:,:][big_mask]
      q11   = image[1:,1:][big_mask[:-1,:-1]]
      qm11  = image[:-1,1:][big_mask[1:,:-1]]
      diagonal = q00 - qm11
      anti_diagonal = q00 - q11
      result[big_mask] = np.sqrt(diagonal*diagonal + anti_diagonal*anti_diagonal)
      return result