From 9a065a0e7f62823a3b18e301d12c80b1a74f0b3e Mon Sep 17 00:00:00 2001 From: Julius Unverfehrt Date: Thu, 3 Feb 2022 16:45:09 +0100 Subject: [PATCH] Made Bob proud --- table_parsing/table_parsig.py | 43 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/table_parsing/table_parsig.py b/table_parsing/table_parsig.py index c6d0306..5090721 100644 --- a/table_parsing/table_parsig.py +++ b/table_parsing/table_parsig.py @@ -4,42 +4,41 @@ import cv2 import numpy as np import pdf2image from matplotlib import pyplot as plt +import imutils def parse(image: np.array): gray_scale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - th1, img_bin = cv2.threshold(gray_scale, 150, 225, cv2.THRESH_BINARY) - img_bin = ~img_bin + blurred = cv2.GaussianBlur(gray_scale, (5, 5), 1) + thresh = cv2.threshold(blurred, 253, 255, cv2.THRESH_BINARY)[1] + img_bin = ~thresh - line_min_width = 4 - kernel_h = np.ones((1, line_min_width), np.uint8) - kernel_v = np.ones((line_min_width, 1), np.uint8) + line_min_width = 10 + kernel_h = np.ones((10, line_min_width), np.uint8) + kernel_v = np.ones((line_min_width, 10), np.uint8) img_bin_h = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, kernel_h) img_bin_v = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, kernel_v) img_bin_final = img_bin_h | img_bin_v - - _, labels, stats, _ = cv2.connectedComponentsWithStats(~img_bin_final, connectivity=8, ltype=cv2.CV_32S) - - return labels, stats + + contours = cv2.findContours(img_bin_final, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + contours = imutils.grab_contours(contours) + for c in contours: + peri = cv2.arcLength(c, True) + approx = cv2.approxPolyDP(c, 0.04 * peri, True) + yield cv2.boundingRect(approx) def parse_tables_in_pdf(pages): return zip(map(parse, pages), count()) -def annotate_image(image, stats): - for x, y, w, h, area in stats[2:]: - if w > 10 and h > 10: - cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 255), 2) - - for i, (s, v) in enumerate(zip(["x", "y", "w", "h"], [x, y, w, h])): - anno = f"{s} = {v}" - xann = int(x + 5) - yann = int(y + h - (20 * (i + 1))) - cv2.putText(image, anno, (xann, yann), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 255), 2) +def annotate_boxes(image, rects): + for rect in rects: + (x, y, w, h) = rect + cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) return image @@ -49,10 +48,10 @@ def annotate_tables_in_pdf(pdf_path, page_index=1): page = pdf2image.convert_from_path(pdf_path, first_page=page_index + 1, last_page=page_index + 1)[0] page = np.array(page) - _, stats = parse(page) - page = annotate_image(page, stats) + asd = parse(page) + page = annotate_boxes(page, asd) fig, ax = plt.subplots(1, 1) fig.set_size_inches(20, 20) ax.imshow(page) - plt.show() + plt.show() \ No newline at end of file