check_table.py 3.6 KB

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