code: def convex_hull(labels, indexes=None, fast=True):
      
      if indexes is None:
          indexes = np.unique(labels)
          indexes.sort()
          indexes=indexes[indexes!=0]
      else:
          indexes=np.array(indexes)
      if len(indexes) == 0:
          return np.zeros((0,2),int),np.zeros((0,),int)
      #
      # Reduce the # of points to consider
      #
      outlines = outline(labels)
      coords = np.argwhere(outlines > 0).astype(np.int32)
      if len(coords)==0:
          # Every outline of every image is blank
          return (np.zeros((0,3),int),
                  np.zeros((len(indexes),),int))
      
      i = coords[:,0]
      j = coords[:,1]
      labels_per_point = labels[i,j]
      pixel_labels = np.column_stack((i,j,labels_per_point))
      return convex_hull_ijv(pixel_labels, indexes, fast)
docs: Given a labeled image, return a list of points per object ordered by
      angle from an interior point, representing the convex hull.s
      
      labels - the label matrix
      indexes - an array of label #s to be processed, defaults to all non-zero
                labels
      
      Returns a matrix and a vector. The matrix consists of one row per
      point in the convex hull. Each row has three columns, the label #,
      the i coordinate of the point and the j coordinate of the point. The
      result is organized first by label, then the points are arranged
      counter-clockwise around the perimeter.
      The vector is a vector of #s of points in the convex hull per label