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é.
[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
Détection linéaire par conversion Huff d'OpenCV
Extraction en ligne droite avec conversion Huff
Extraire uniquement les lignes droites horizontales avec la conversion Huff
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
Comme la partie en pointillé ne réagit pas, elle est connectée verticalement
Recommended Posts