camelot에서 점선을 실선으로 처리(허프 변환)

소개



camelot은 점선이 약하고 잘 실패하기 때문에 조사해 보면 아래의 참고 기사를 발견했습니다.

camelot은 opencv로 추출하고 있기 때문에 점선을 다시 쓰면 좋을 것 같습니다.

참고



Python을 사용하면 텍스트를 포함한 PDF의 해석은 간단하다・・・그렇게 생각하고 있던 시기가 나에게도 있었습니다

camelot에서 점선을 실선으로 처리

이 기사 옆의 점선 PDF를 사용하겠습니다.

허프 변환



OpenCV의 허프 변환에 의한 직선 검출



허프 변환으로 직선 추출



지바의 Go To Eat 가맹점 일람의 PDF





허프 변환으로 수평 직선만 추출



프로그램


import cv2
import numpy as np

import camelot

# パッチ作成

def my_threshold(imagename, process_background=False, blocksize=15, c=-2):

    img = cv2.imread(imagename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    edges = cv2.Canny(gray, 50, 150, apertureSize=3)

    lines = cv2.HoughLinesP(
        edges, rho=1, theta=np.pi / 180, threshold=80, minLineLength=3000, maxLineGap=50
    )

    for line in lines:
        x1, y1, x2, y2 = line[0]
        # 水平の場合はy1 == y2、垂直の場合はx1 == x2のifでフィルタする
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 0), 1) 

    if process_background:
        threshold = cv2.adaptiveThreshold(
            gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blocksize, c
        )
    else:
        threshold = cv2.adaptiveThreshold(
            np.invert(gray),
            255,
            cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY,
            blocksize,
            c,
        )
    return img, threshold

camelot.parsers.lattice.adaptive_threshold = my_threshold

tables = camelot.read_pdf("data.pdf", pages="all")

tables[0].df

패치 적요 전



점선 부분이 반응하지 않기 때문에 세로로 결합되어 버리고 있다


패치 적요 후



좋은 웹페이지 즐겨찾기