python - 如何将从图像中提取的文本数据制成表格?
问题描述
我使用过 OpenCV 并pytesseract
从图像中提取文本,但我正在寻找一种将文本数据制成表格的方法,将其提取到 TXT 或 CSV 文件中。目前,Python 的输出以段落形式混合在一起。
输入图像:
到目前为止我使用的代码:
这是我现在得到的输出:
我期望的输出是:
解决方案
我假设,您处理的屏幕截图类似于提供的屏幕截图,即内容——主要是——总是相同的,具有“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
----------------------------------------
推荐阅读
- android - ListView 项适配器无法单击
- json - 带有漂亮链接的 Woocommerce 结帐“意外令牌”
- php - 使用链接或按钮下载 Blob 文件
- javascript - 打开和关闭灯箱
- sql - Entity Framework Core PostgreSQL 插入 -2147482647 Id
- c# - 如何让 CefSharp 在 vs 通用库中使用配置 AnyCPU
- ios - 在 CollectionView Swift 上显示 Gif
- java - void 方法不能返回值 -Java
- reactjs - 是否可以为 Draft.js 创建演示数据?
- java - RecyclerView onBindViewHolder indexOutOfBounds 试图在 ArrayList 中绘制元素