class_docstr: Class for image processing. Methods for detecting lines in an image and clustering them. Helper methods for
  drawing.
docstr: From a list of lines in <lines> detected by cv2.HoughLines, create a list with a tuple per line
  containing:
  (rho, theta, normalized theta with 0 <= theta_norm < np.pi, DIRECTION_VERTICAL or DIRECTION_HORIZONTAL)
docstr_tok: ["From","a","list","of","lines","in","<","lines",">","detected","by","cv2.HoughLines",",","create","a","list","with","a","tuple","per","line","containing",":","(","rho",",","theta",",","normalized","theta","with","0","<","=","theta_norm","<","np.pi",",","DIRECTION_VERTICAL","or","DIRECTION_HORIZONTAL",")"]
code: def _generate_hough_lines(self, lines):
      """
      From a list of lines in <lines> detected by cv2.HoughLines, create a list with a tuple per line
      containing:
      (rho, theta, normalized theta with 0 <= theta_norm < np.pi, DIRECTION_VERTICAL or DIRECTION_HORIZONTAL)
      """
      lines_hough = []
      for l in lines:
          rho, theta = l[
              0
          ]  # they come like this from OpenCV's hough transform
          theta_norm = normalize_angle(theta)
  
          if abs(PIHLF - theta_norm) > PI4TH:  # vertical
              line_dir = DIRECTION_VERTICAL
          else:
              line_dir = DIRECTION_HORIZONTAL
  
          lines_hough.append((rho, theta, theta_norm, line_dir))
  
      return lines_hough
  
imports: from logging import warning
  from math import degrees
  import numpy
  import cv2
  from pdftabextract.common import ROTATION, SKEW_X, SKEW_Y, DIRECTION_HORIZONTAL, DIRECTION_VERTICAL
  from pdftabextract.geom import normalize_angle, project_polarcoord_lines
  from pdftabextract.clustering import zip_clusters_and_values, find_clusters_1d_break_dist, calc_cluster_centers_1d
label_desc: Use image node_id 14 for calling the ImageProc obj's underlying member method code with example usage: obj._generate_hough_lines(lines) and returns: lines_hough