class_docstr: Implemented from https://stackoverflow.com/questions/31400769/bounding-box-of-numpy-array
  Removes all rows/columns/etc composed only of the provided values.
  
  mask_value: int
      Value to be cropped. Currently, only 0 supported.
  lead_data_group: str
      If provided, multiple data groups will be cropped according
      to the bounding box determined in the lead_data_group. Only
      applicable if different data_groups have the same shape. None
      by default, meaning that all data groups are cropped on an
      individual basis.
code: def preprocess(self, data_group):
      input_data = data_group.preprocessed_case
  
      if self.lead_data_group is None or self.slice_boundaries == []:
          num_dims = input_data.ndim
          slice_boundaries = []
          for axis in itertools.combinations(
              range(num_dims), num_dims - 1
          ):
              nonzero = np.any(input_data, axis=axis)
              slice_boundary = list(np.where(nonzero)[0][[0, -1]])
              slice_boundaries = [
                  slice(slice_boundary[0], slice_boundary[1] + 1, 1)
              ] + slice_boundaries
              self.output_data = input_data[tuple(slice_boundaries)]
      else:
          self.output_data = input_data[tuple(self.slice_boundaries)]
  
      if (
          self.slice_boundaries == []
          and self.lead_data_group is not None
      ):
          self.slice_boundaries = tuple(slice_boundaries)
  
      data_group.preprocessed_case = self.output_data
  
imports: import subprocess
  import os
  import numpy
  import itertools
  from deepneuro.preprocessing.preprocessor import Preprocessor
  from deepneuro.utilities.util import add_parameter, quotes
label_desc: Use image node_id 4 for calling the CropValues obj's underlying member method code with example usage: obj.preprocess(data_group) without return types