首页 > 解决方案 > 如何将从图像中提取的文本数据制成表格?

问题描述

我使用过 OpenCV 并pytesseract从图像中提取文本,但我正在寻找一种将文本数据制成表格的方法,将其提取到 TXT 或 CSV 文件中。目前,Python 的输出以段落形式混合在一起。

输入图像:

到目前为止我使用的代码:

当前代码

这是我现在得到的输出:

电流输出

我期望的输出是:

预期产出

标签: pythonimageopencvtextpython-tesseract

解决方案


我假设,您处理的屏幕截图类似于提供的屏幕截图,即内容——主要是——总是相同的,具有“Lokasi”、“Nama”等字段。

裁剪图像的中央白色部分,然后运行pytesseract。输出——主要是——也应该总是相同的。您会得到一些带有中间双新行的字符串\n\n,您可以将其替换为单个新行\n,然后在新行处拆分字符串。剩下的是对单个提取行的内容进行一些解析,并适当地存储这些值,例如在一些简单的字典中。

这是一些代码:

import cv2
import numpy as np
import pytesseract

# Read image
img = cv2.imread('6cO7N.jpg', cv2.IMREAD_GRAYSCALE)

# Crop central white part from image
mask = (img == 255).astype(np.uint8) * 255
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.full((11, 11), 255))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.full((21, 21), 255))
x, y, w, h = cv2.boundingRect(mask)
img = img[y:y+h, x:x+w]

# Extract text, replace double new lines, and split lines
lines = pytesseract.image_to_string(img).replace('\n\n', '\n').split('\n')


# Helper function to return index of line with given content
def get_idx(texts, target):
    return [idx for idx in range(len(texts)) if texts[idx] == target][0]


# Extract data from lines
idx_nama_no_telefon = get_idx(lines, 'Nama No. Telefon')
nama_no_telefon = lines[idx_nama_no_telefon + 1].split('+')
nama = nama_no_telefon[0][:-1]
idx_tarikh_masa = get_idx(lines, 'Tarikh Masa')
for i in range(idx_nama_no_telefon + 2, idx_tarikh_masa):
    nama = nama + ' ' + lines[i]
tarikh_masa = lines[idx_tarikh_masa + 1].split(' ')

# Store data in some structure - if needed
data = {'Check-in': lines[0],
        'Lokasi': lines[get_idx(lines, 'Lokasi') + 1],
        'Nama': nama,
        'No. Telefon': '+' + nama_no_telefon[1],
        'Tarikh': ' '.join(tarikh_masa[:3]),
        'Masa': ' '.join(tarikh_masa[3:]),
        'Risiko': lines[get_idx(lines, 'Risiko') + 1]}

# Print data as desired
for k, v in list(zip(data.keys(), data.values()))[1:]:
    print('{} : {}'.format(k, v))

由于我不知道名称可以出现多少行(我猜!?),所以有一个循环用于收集它的所有部分。

现在的输出是:

Lokasi : PERSATUAN PERJIRANAN PARKVIEW
Nama : ABBIMANYU A/L CHITHAMBARAM
No. Telefon : +60127658504
Tarikh : May 19, 2021
Masa : 7:32:35 PM
Risiko : Low

注意:这是一个非常硬编码的解决方案,依赖于所述假设。即使输入图像的微小变化也可能导致错误的输出。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19041-SP0
Python:        3.9.1
PyCharm:       2021.1.1
NumPy:         1.19.5
OpenCV:        4.5.2
pytesseract:   5.0.0-alpha.20201127
----------------------------------------

推荐阅读