camelot ist nicht gut in gepunkteten Linien und versagt oft. Als ich es nachgeschlagen habe, habe ich den folgenden Referenzartikel gefunden
Da Camelot mit opencv extrahiert wird, können Sie die gepunktete Linie anscheinend neu schreiben. Ich habe die gepunktete Linie mit Huff-Konvertierung extrahiert und mit der durchgezogenen Linie überschrieben, und es hat funktioniert.
[Gepunktete Linie als durchgezogene Linie mit Camelot verarbeiten](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 /)
Ich werde das gepunktete PDF neben diesem Artikel verwenden
https://github.com/mima3/yakusyopdf/blob/master/20200502/%E5%85%B5%E5%BA%AB%E7%9C%8C.pdf
Lineare Erkennung durch Huff-Konvertierung von OpenCV
Geradextraktion mit Huff-Konvertierung
Extrahieren Sie nur horizontale gerade Linien mit Huff-Konvertierung
import cv2
import numpy as np
import camelot
#Patch-Erstellung
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 wenn horizontal==y2, x1 für vertikal==Filtern nach x2 wenn
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
Da der gepunktete Linienteil nicht reagiert, ist er vertikal verbunden
Recommended Posts