Traitez la ligne pointillée comme une ligne continue avec camelot (conversion de Huff)

introduction

camelot n'est pas bon pour les lignes pointillées et échoue souvent, alors quand je l'ai recherché, j'ai trouvé l'article de référence suivant

Comme camelot est extrait avec opencv, il semble que vous puissiez réécrire la ligne pointillée, j'ai donc extrait la ligne pointillée avec la conversion Huff et l'ai écrasée avec la ligne continue et cela a fonctionné.

référence

L'utilisation de Python facilite l'analyse des PDF contenant du texte ... J'ai eu un moment où je pensais de cette façon

[Traitez la ligne pointillée comme une ligne continue avec camelot](https://needtec.sakura.ne.jp/wod07672/2020/05/03/camelot%e3%81%a7%e7%82%b9%e7%b7%9a % e3% 82% 92% e5% ae% 9f% e7% b7% 9a% e3% 81% a8% e3% 81% 97% e3% 81% a6% e5% 87% a6% e7% 90% 86% e3 % 81% 99% e3% 82% 8b /)

J'utiliserai le PDF en pointillé à côté de cet article

https://github.com/mima3/yakusyopdf/blob/master/20200502/%E5%85%B5%E5%BA%AB%E7%9C%8C.pdf

Conversion de Huff

Détection linéaire par conversion Huff d'OpenCV

data1.png

Extraction en ligne droite avec conversion Huff

houghline.png

PDF de la liste des magasins membres de Go To Eat à Chiba

data1(1).png

Extraire uniquement les lignes droites horizontales avec la conversion Huff

houghline(1).png

programme

import cv2
import numpy as np

import camelot

#Création de patch

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 si horizontal==y2, x1 pour vertical==Filtrer par x2 si
        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

Avant la description du patch

Comme la partie en pointillé ne réagit pas, elle est connectée verticalement Screenshot_2020-11-04 Google Colaboratory(1).png

Après la description du patch

Screenshot_2020-11-04 Google Colaboratory.png

Recommended Posts

Traitez la ligne pointillée comme une ligne continue avec camelot (conversion de Huff)
Visualisez les données d'itinéraires ferroviaires sous forme de graphique avec Cytoscape 2
Traitez les fichiers du dossier dans l'ordre avec le script shell
Tuez le processus avec sudo kill -9
[Python] Créez un programme qui supprime les sauts de ligne dans le presse-papiers + Enregistrez-vous comme raccourci avec Windows
Traitez le contenu du fichier dans l'ordre avec un script shell
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.