class_docstr: Crops the size of the observation to a given crop window. For example, in Atari, the
  observations are images with a shape of 210x160. Usually, we will want to crop the size of the observation to a
  square of 160x160 before rescaling them.
code: def filter(
      self,
      observation: ObservationType,
      update_internal_state: bool = True,
  ) -> ObservationType:
      # replace -1 with the max size
      crop_high = self._replace_negative_one_in_crop_size(
          self.crop_high, observation.shape
      )
      crop_low = self._replace_negative_one_in_crop_size(
          self.crop_low, observation.shape
      )
  
      # crop
      indices = [slice(i, j) for i, j in zip(crop_low, crop_high)]
      observation = observation[indices]
      return observation
  
file_path: coach/rl_coach/filters/observation/observation_crop_filter.py
imports: from typing import Union, Tuple
  import numpy
  from rl_coach.core_types import ObservationType
  from rl_coach.filters.observation.observation_filter import ObservationFilter
  from rl_coach.spaces import ObservationSpace
label_desc: Use image node_id 4 for calling the ObservationCropFilter obj's underlying member method code with example usage: obj.filter(observation, update_internal_state) and returns: observation