content: import numpy as np
  from scipy.ndimage import binary_fill_holes
  from acvl_utils.cropping_and_padding.bounding_boxes import get_bbox_from_mask, bounding_box_to_slice
  
  
  def create_nonzero_mask(data):
      """
  
      :param data:
      :return: the mask is True where the data is nonzero
      """
      assert data.ndim in (3, 4), "data must have shape (C, X, Y, Z) or shape (C, X, Y)"
      nonzero_mask = data[0] != 0
      for c in range(1, data.shape[0]):
          nonzero_mask |= data[c] != 0
      return binary_fill_holes(nonzero_mask)
  
  
  def crop_to_nonzero(data, seg=None, nonzero_label=-1):
      """
  
      :param data:
      :param seg:
      :param nonzero_label: this will be written into the segmentation map
      :return:
      """
      nonzero_mask = create_nonzero_mask(data)
      bbox = get_bbox_from_mask(nonzero_mask)
      slicer = bounding_box_to_slice(bbox)
      nonzero_mask = nonzero_mask[slicer][None]
      
      slicer = (slice(None), ) + slicer
      data = data[slicer]
      if seg is not None:
          seg = seg[slicer]
          seg[(seg == 0) & (~nonzero_mask)] = nonzero_label
      else:
          seg = np.where(nonzero_mask, np.int8(0), np.int8(nonzero_label))
      return data, seg, bbox
  
  
  