text: import cv2
  import numpy as np
  
  
  def otsu_implementation(img_title="boat.jpg", is_normalized=False, is_reduce_noise=False):
      # Read the image in a greyscale mode
      image = cv2.imread(img_title, 0)
  
      # Apply GaussianBlur to reduce image noise if it is required
      if is_reduce_noise:
          image = cv2.GaussianBlur(image, (5, 5), 0)
  
      # Set total number of bins in the histogram
      bins_num = 256
  
      # Get the image histogram
      hist, bin_edges = np.histogram(image, bins=bins_num)
  
      # Get normalized histogram if it is required
      if is_normalized:
          hist = np.divide(hist.ravel(), hist.max())
  
      # Calculate centers of bins
      bin_mids = (bin_edges[:-1] + bin_edges[1:]) / 2.
  
      # Iterate over all thresholds (indices) and get the probabilities w1(t), w2(t)
      weight1 = np.cumsum(hist)
      weight2 = np.cumsum(hist[::-1])[::-1]
  
      # Get the class means mu0(t)
      mean1 = np.cumsum(hist * bin_mids) / weight1
      # Get the class means mu1(t)
      mean2 = (np.cumsum((hist * bin_mids)[::-1]) / weight2[::-1])[::-1]
  
      inter_class_variance = weight1[:-1] * weight2[1:] * (mean1[:-1] - mean2[1:]) ** 2
  
      # Maximize the inter_class_variance function val
      index_of_max_val = np.argmax(inter_class_variance)
  
      threshold = bin_mids[:-1][index_of_max_val]
      print("Otsu's algorithm implementation thresholding result: ", threshold)
      return threshold
  
  
  def main():
      otsu_implementation()
  
  
  if __name__ == "__main__":
      main()
  