Извлеките данные из изображения, содержащего сетку таблицы, используя python - PullRequest
0 голосов
/ 28 мая 2020

У меня есть изображения, подобные приведенному ниже. Мне нужно извлечь данные в сетке вместе с табличной структурой и преобразовать их в dataframe / csv.

enter image description here

Я использую OCR для извлечения текста вместе с координатами, но для извлечения структуры таблицы я хотел бы извлечь горизонтальные и вертикальные линии сетки.

Есть ли в OpenCV метод, который бы хорошо обобщал?

До сих пор я встречал следующие подходы: 1. Hough Lines 2. Извлечение Прямо angular контуры 3. Построение вертикальных и горизонтальных контуров

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вы можете определить структуру сетки и извлекать информацию из всей отдельной области с помощью openCV, проверьте эту статью Алгоритм обнаружения Box для любого изображения, содержащего коробки

Все прекрасно объяснено

1 голос
/ 28 мая 2020

При всем уважении к @Chrys Bltr, решение по ссылке немного излишне. Вот более простое решение, поэтому я думаю:

import numpy as np
import cv2
import matplotlib.pyplot as plt

img_rgb = cv2.imread('your/image')
img = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)

th = cv2.adaptiveThreshold(img,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,3)

_, ctrs, _ = cv2.findContours(img,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
im_h, im_w = img.shape
im_area = im_w * im_h
for ctr in ctrs:
    x, y, w, h = cv2.boundingRect(ctr)
    # Filter contours based on size
    if 0.01 * im_area < w * h < 0.1*im_area:
        cv2.rectangle(img_rgb, (x, y), (x+w, y+h), (0, 255, 0), 2)

plt.imshow(img_rgb, cmap='gray', vmin=0, vmax=255)

Вы можете сохранить информацию о прямоугольнике в процессе фильтрации выше, а затем выполнить OCR в каждой отдельной области прямоугольника angular.

...