code: def _binary_erosion(
      input,
      structure,
      iterations,
      mask,
      output,
      border_value,
      origin,
      invert,
      brute_force,
  ):
      try:
          iterations = operator.index(iterations)
      except TypeError as e:
          raise TypeError(
              "iterations parameter should be an integer"
          ) from e
  
      input = numpy.asarray(input)
      if numpy.iscomplexobj(input):
          raise TypeError("Complex type not supported")
      if structure is None:
          structure = generate_binary_structure(input.ndim, 1)
      else:
          structure = numpy.asarray(structure, dtype=bool)
      if structure.ndim != input.ndim:
          raise RuntimeError(
              "structure and input must have same dimensionality"
          )
      if not structure.flags.contiguous:
          structure = structure.copy()
      if numpy.prod(structure.shape, axis=0) < 1:
          raise RuntimeError("structure must not be empty")
      if mask is not None:
          mask = numpy.asarray(mask)
          if mask.shape != input.shape:
              raise RuntimeError("mask and input must have equal sizes")
      origin = _ni_support._normalize_sequence(origin, input.ndim)
      cit = _center_is_true(structure, origin)
      if isinstance(output, numpy.ndarray):
          if numpy.iscomplexobj(output):
              raise TypeError("Complex output type not supported")
      else:
          output = bool
      output = _ni_support._get_output(output, input)
      temp_needed = numpy.may_share_memory(input, output)
      if temp_needed:
          # input and output arrays cannot share memory
          temp = output
          output = _ni_support._get_output(output.dtype, input)
      if iterations == 1:
          _nd_image.binary_erosion(
              input,
              structure,
              mask,
              output,
              border_value,
              origin,
              invert,
              cit,
              0,
          )
          return output
      elif cit and not brute_force:
          changed, coordinate_list = _nd_image.binary_erosion(
              input,
              structure,
              mask,
              output,
              border_value,
              origin,
              invert,
              cit,
              1,
          )
          structure = structure[
              tuple([slice(None, None, -1)] * structure.ndim)
          ]
          for ii in range(len(origin)):
              origin[ii] = -origin[ii]
              if not structure.shape[ii] & 1:
                  origin[ii] -= 1
          if mask is not None:
              mask = numpy.asarray(mask, dtype=numpy.int8)
          if not structure.flags.contiguous:
              structure = structure.copy()
          _nd_image.binary_erosion2(
              output,
              structure,
              mask,
              iterations - 1,
              origin,
              invert,
              coordinate_list,
          )
      else:
          tmp_in = numpy.empty_like(input, dtype=bool)
          tmp_out = output
          if iterations >= 1 and not iterations & 1:
              tmp_in, tmp_out = tmp_out, tmp_in
          changed = _nd_image.binary_erosion(
              input,
              structure,
              mask,
              tmp_out,
              border_value,
              origin,
              invert,
              cit,
              0,
          )
          ii = 1
          while ii < iterations or (iterations < 1 and changed):
              tmp_in, tmp_out = tmp_out, tmp_in
              changed = _nd_image.binary_erosion(
                  tmp_in,
                  structure,
                  mask,
                  tmp_out,
                  border_value,
                  origin,
                  invert,
                  cit,
                  0,
              )
              ii += 1
      if temp_needed:
          temp[...] = output
          output = temp
      return output
  
imports: import warnings
  import operator
  import numpy
  from .None import _ni_support
  from .None import _nd_image
  from .None import filters
label_desc: Use image node_id 4 for calling a global function with example usage: _binary_erosion(input, structure, iterations, mask, output, border_value, origin, invert, brute_force) and returns: output, output