text: import numpy as np
  import cv2
  
  def abs_sobel_thresh(image, orient='x', sobel_kernel=15, thresh=(0, 255)):
      # Convert to grayscale
      gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
  
      # Apply x or y gradient with the OpenCV Sobel() function
      # and take the absolute value
      if orient == 'x':
          abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 1, 0, sobel_kernel))
      if orient == 'y':
          abs_sobel = np.absolute(cv2.Sobel(gray, cv2.CV_64F, 0, 1, sobel_kernel))
      
      # Rescale back to 8 bit integer
      scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel))
      
      # Create a copy and apply the threshold
      binary_output = np.zeros_like(scaled_sobel)
      binary_output[(scaled_sobel >= thresh[0]) & (scaled_sobel <= thresh[1])] = 1
  
      # Return the result
      return binary_output
  
  def mag_thresh(image, sobel_kernel=15, thresh=(0, 255)):
       # Convert to grayscale
      
      gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
      # Take both Sobel x and y gradients
      sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel)
      sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel)
      # Calculate the gradient magnitude
      gradmag = np.sqrt(sobelx**2 + sobely**2)
      # Rescale to 8 bit
      scale_factor = np.max(gradmag)/255 
      gradmag = (gradmag/scale_factor).astype(np.uint8) 
      # Create a binary image of ones where threshold is met, zeros otherwise
      binary_output = np.zeros_like(gradmag)
      binary_output[(gradmag >= thresh[0]) & (gradmag <= thresh[1])] = 1
  
      # Return the binary image
      return binary_output
  
  def dir_threshold(image, sobel_kernel=9, thresh=(0, np.pi/2)):
      # Grayscale
      gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
  
      # Calculate the x and y gradients
      sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=sobel_kernel)
      sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=sobel_kernel)
  
      # Take the absolute value of the gradient direction, 
      # apply a threshold, and create a binary image result
      absgraddir = np.arctan2(np.absolute(sobely), np.absolute(sobelx))
      binary_output =  np.zeros_like(absgraddir)
      binary_output[(absgraddir >= thresh[0]) & (absgraddir <= thresh[1])] = 1
  
      # Return the binary image
      return binary_output
  
  
  def col_thresh(image, thresh=(170, 255)):
      # HLS
      hls = cv2.cvtColor(image, cv2.COLOR_RGB2HLS)
      
      # Select S channel
      s_channel = hls[:,:,2] 
      
      binary_output = np.zeros_like(s_channel)
      binary_output[(s_channel >= thresh[0]) & (s_channel <= thresh[1])] = 1
  
      # Return the binary image
      return binary_output
  
  def combine_threshs(grad_x, grad_y, mag_binary, dir_binary, col_binary, ksize=15):
      # Combine the previous thresholds
      combined = np.zeros_like(dir_binary)
      combined[((grad_x == 1) & (grad_y == 1)) | ((mag_binary == 1) & (dir_binary == 1)) | (col_binary == 1)] = 1
  
      return combined