code: def register_channel(im0, im1, scale=None, ch0angle=None,
                       chanapproxangle=None):
      
      im0 = np.asarray(im0)
      im1 = np.asarray(im1)
      # extract the channels edges
      e0 = edge(im0)
      e1 = edge(im1)
      fe0, fe1 = reg.dft_optsize_same(np.float32(e0), np.float32(e1))
  
      # compute the angle and channel width of biggest angular feature
      w0, a0 = channel_width(
          fe0, isccsedge=True, chanapproxangle=chanapproxangle)
      w1, a1 = channel_width(
          fe1, isccsedge=True, chanapproxangle=chanapproxangle)
  
      # get angle diff
      angle = reg.clamp_angle(a0 - a1)
      if ch0angle is not None:
          a0 = ch0angle
          a1 = a0 - angle
  
      # if the scale is unknown, ratio of the channels
      if scale is None:
          scale = w1 / w0
      #scale and rotate
      e2 = reg.rotate_scale(e1, angle, scale)
      # get edge from scaled and rotated im1
      fe2 = reg.dft_optsize(np.float32(e2), shape=fe0.shape)
      # find offset
      y, x = reg.find_shift_dft(fe0, fe2, isccs=True)
      # return all infos
      return angle, scale, [y, x], e2
docs: Register the images assuming they are channels
  
      Parameters:
      -----------
      im0: 2d array
          The first image
      im1: 2d array
          The second image
      scale: number, optional
          The scale difference if known
      ch0angle: number, optional
          The angle of the channel in the first image if known
      chanapproxangle: number, optional
          The approximate angle for both images if known
  
      Returns:
      --------
      angle: number
          The angle difference
      scale: number
          The scale difference
      [y, x]: 2 numbers
          The offset
      e2: 2d array
          The second image rotated and translated for performances reasons