code: def _shift_hsv_uint8(img, hue_shift, sat_shift, val_shift):
      dtype = img.dtype
      img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
      hue, sat, val = cv2.split(img)
  
      if hue_shift != 0:
          lut_hue = np.arange(0, 256, dtype=np.int16)
          lut_hue = np.mod(lut_hue + hue_shift, 180).astype(dtype)
          hue = cv2.LUT(hue, lut_hue)
  
      if sat_shift != 0:
          lut_sat = np.arange(0, 256, dtype=np.int16)
          lut_sat = np.clip(lut_sat + sat_shift, 0, 255).astype(dtype)
          sat = cv2.LUT(sat, lut_sat)
  
      if val_shift != 0:
          lut_val = np.arange(0, 256, dtype=np.int16)
          lut_val = np.clip(lut_val + val_shift, 0, 255).astype(dtype)
          val = cv2.LUT(val, lut_val)
  
      img = cv2.merge((hue, sat, val)).astype(dtype)
      img = cv2.cvtColor(img, cv2.COLOR_HSV2RGB)
      return img
  
imports: from __future__ import division
  from typing import Optional, Sequence, Union
  from warnings import warn
  import cv2
  import numpy
  import skimage
  from albumentations import random_utils
  from albumentations.augmentations.utils import MAX_VALUES_BY_DTYPE, _maybe_process_in_chunks, clip, clipped, ensure_contiguous, is_grayscale_image, is_rgb_image, non_rgb_warning, preserve_channel_dim, preserve_shape
label_desc: Use image node_id 4 for calling a global function with example usage: _shift_hsv_uint8(img, hue_shift, sat_shift, val_shift) and returns: img