code: def graphcut_stawiaski(
      regions, gradient=False, foreground=False, background=False
  ):
      """
      Executes a Stawiaski label graph cut.
  
      Parameters
      ----------
      regions : ndarray
          The regions image / label map.
      gradient : ndarray
          The gradient image.
      foreground : ndarray
          The foreground markers.
      background : ndarray
          The background markers.
  
      Returns
      -------
      segmentation : ndarray
          The graph-cut segmentation result as boolean array.
  
      Raises
      ------
      ArgumentError
          When the supplied data is erroneous.
      """
      # initialize logger
      logger = Logger.getInstance()
  
      # unpack images if required
      # !TODO: This is an ugly hack, especially since it can be seen inside the function definition
      # How to overcome this, since I can not use a wrapper function as the whole thing must be pickable
      if not gradient and not foreground and not background:
          regions, gradient, foreground, background = regions
  
      # ensure that input images are scipy arrays
      img_region = scipy.asarray(regions)
      img_gradient = scipy.asarray(gradient)
      img_fg = scipy.asarray(foreground, dtype=scipy.bool_)
      img_bg = scipy.asarray(background, dtype=scipy.bool_)
  
      # ensure correctness of supplied images
      if not (
          img_region.shape
          == img_gradient.shape
          == img_fg.shape
          == img_bg.shape
      ):
          raise ArgumentError(
              "All supplied images must be of the same shape."
          )
  
      # recompute the label ids to start from id = 1
      img_region = relabel(img_region)
  
      # generate graph
      gcgraph = graph_from_labels(
          img_region,
          img_fg,
          img_bg,
          boundary_term=boundary_stawiaski,
          boundary_term_args=(img_gradient),
      )
  
      # execute min-cut
      maxflow = (
          gcgraph.maxflow()
      )  # executes the cut and returns the maxflow value
  
      logger.debug(
          "Graph-cut terminated successfully with maxflow of {}.".format(
              maxflow
          )
      )
  
      # apply results to the region image
      mapping = [
          0
      ]  # no regions with id 1 exists in mapping, entry used as padding
      mapping.extend(
          [
              0
              if gcgraph.termtype.SINK
              == gcgraph.what_segment(int(x) - 1)
              else 1
              for x in scipy.unique(img_region)
          ]
      )
      img_results = relabel_map(img_region, mapping)
  
      return img_results.astype(scipy.bool_)
  
file_path: medpy/medpy/graphcut/wrapper.py
imports: import multiprocessing
  import itertools
  import math
  import scipy
  from .energy_label import boundary_stawiaski
  from .generate import graph_from_labels
  from ..core.exceptions import ArgumentError
  from ..core.logger import Logger
  from ..filter import relabel, relabel_map
label_desc: Use image node_id 4 for calling a global function with example usage: graphcut_stawiaski(regions, gradient, foreground, background) and returns: img_results