check_table.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import cv2
  2. import numpy as np
  3. hard_colors = [[[35, 43, 46], [77, 220, 255]]]
  4. class Table:
  5. def __init__(self, html, img=[]):
  6. """
  7. 表格类的初始化函数。
  8. Parameters:
  9. html (str): 输入的HTML字符串。
  10. img (List): 输入的图像数组,默认为空列表。
  11. """
  12. self.img = img
  13. self.html = html
  14. self.html_arr = [] # 存储HTML解析后的表格内容
  15. self.total = 0 # 表格单元总数
  16. self.empty = 0 # 空白表格单元数
  17. def get_tr(self):
  18. """
  19. 从HTML中提取并返回表格行。
  20. Returns:
  21. List: 提取的表格行列表。
  22. """
  23. str = self.html
  24. if len(str.split('<tr>')) > 1:
  25. return str.split('<tr>')[1:]
  26. else:
  27. return []
  28. def get_td(self):
  29. """
  30. 从HTML中提取并存储表格单元。
  31. Returns:
  32. None
  33. """
  34. if self.html_arr != []:
  35. return
  36. tr_list = self.get_tr()
  37. for i in range(len(tr_list)):
  38. if tr_list[i] == '':
  39. continue
  40. tr = tr_list[i].split('</td>')[:-1]
  41. temp_list = []
  42. for cell in tr:
  43. if '<td colspan=\\"3\\">' in cell:
  44. temp_list.append(cell.split('<td colspan=\\"3\\">')[1])
  45. if '<td colspan="3">' in cell:
  46. temp_list.append(cell.split('<td colspan="3">')[1])
  47. if '<td>' in cell:
  48. temp_list.append(cell.split('<td>')[1])
  49. print(temp_list)
  50. self.html_arr.append(temp_list)
  51. def get_empty(self):
  52. """
  53. 统计表格中的空白单元格数量和总单元格数量。
  54. Returns:
  55. None
  56. """
  57. self.get_td()
  58. if self.total != 0:
  59. return
  60. for tr in self.html_arr:
  61. for cell in tr:
  62. self.total += 1
  63. if cell == '':
  64. self.empty += 1
  65. def change_hard2white(self):
  66. """
  67. 将图像中绿色区域修改为白色。
  68. Returns:
  69. None
  70. """
  71. color = [248, 248, 255]
  72. hsv = cv2.cvtColor(self.img, cv2.COLOR_BGR2HSV)
  73. for hard_color in hard_colors:
  74. lower_green = np.array(hard_color[0])
  75. upper_green = np.array(hard_color[1])
  76. mask_green = cv2.inRange(hsv, lower_green, upper_green)
  77. self.img[mask_green != 0] = color
  78. def get_str(self):
  79. """
  80. 从HTML数组中获取字符串。
  81. Returns:
  82. str: 提取的字符串。
  83. """
  84. str = ''
  85. for tr in self.html_arr:
  86. for cell in tr:
  87. str += cell
  88. return str
  89. def check_html(self):
  90. """
  91. 检查HTML表格的质量,如果识别效果不佳,则修改图像颜色。
  92. Returns:
  93. int: 返回1表示识别效果不佳,返回0表示识别效果良好。
  94. """
  95. self.get_empty()
  96. html_str = self.get_str()
  97. # 空白值大于四个,或者大于总格子数的四分之一(self.total // 4,除数之后向下取整)
  98. # HTML字符串 html_str 中同时包含 '项目'、'每份' 和 '营养素参考值',并且在每一行的格子数中最大值小于3时。
  99. if (self.empty > 4 and self.empty > self.total // 4) or ('项目' in html_str and '每份' in html_str and '营养素参考值' in html_str and np.max([len(a) for a in self.html_arr]) < 3):
  100. print('识别效果不佳,改变图片颜色!')
  101. self.change_hard2white()
  102. return 1
  103. return 0