如何在 Python 中从图像中提取表格
大约一年前,我的任务是从文档中提取和构建数据,主要包含在表格中。我没有计算机视觉方面的先验知识,很难找到合适的“即插即用”解决方案。可用的选项要么是基于神经网络 (NN) 的先进解决方案,这些解决方案既繁重又乏味,要么是更简单的基于 OpenCV 的解决方案,但和要的效果不一样
受现有 OpenCV 脚本的启发,我开发了一种简单且一致的方法来提取表格,并将其转换为开源 Python 库:img2table。
Library 介绍
该软件包重量轻(与深度学习解决方案相比),无需培训,参数化最小。它提供:
- 图像和 PDF 文件的表格标识,包括表格单元格级别的边界框。
- 通过提供对 OCR 服务/工具(截至目前为 Tesseract、PaddleOCR、AWS Textract、Google Vision 和 Azure OCR)的支持来提取表内容。
- 处理复杂的表结构,如合并的单元格。
- 实现一种纠正图像偏斜和旋转的方法。
- 提取的表作为简单对象返回,包括 Pandas DataFrame 表示形式。
- 将提取的表导出到 Excel 文件的选项,保留其原始结构。
如何使用
您可以通过 pip 安装库,然后就可以开始了:
pip install img2table
识别文档中的表只需要一个函数调用:
from img2table.document import Image
# Instantiation of the image
img = Image(src="myimage.jpg")
# Table identification
img_tables = img.extract_tables()
# Result of table identification
img_tables
[ExtractedTable(title=None, bbox=(10, 8, 745, 314),shape=(6, 3)),
ExtractedTable(title=None, bbox=(936, 9, 1129, 111),shape=(2, 2))]
如果我们想提取表格的内容,则需要 OCR 工具。它可以这样完成:
from img2table.document import PDF
from img2table.ocr import TesseractOCR
# Instantiation of the pdf
pdf = PDF(src="mypdf.pdf")
# Instantiation of the OCR, Tesseract, which requires prior installation
ocr = TesseractOCR(lang="eng")
# Table identification and extraction
pdf_tables = pdf.extract_tables(ocr=ocr)
# We can also create an excel file with the tables
pdf.to_xlsx('tables.xlsx',
ocr=ocr)
最后,对于简单的情况,可以在表格提取方法中通过设置参数来提取“无边框”表格borderless_tables 。这允许检测单元格不需要完全被边框包围的表格。
而且,仅此而已!该库实际上并没有更多内容,因为目标是使其尽可能简单,以避免其他一些可用解决方案可能带来的复杂性。
项目内核
所有图像处理都是使用OpenCV和opencv-python库完成的。然而,它仍然很初级。
该算法的主干是 Hough 变换,用于识别图像中的线条。它使我们能够检测图像的水平线和垂直线。
cv2.HoughLinesP(img, rho, theta, threshold, None, minLinLength, maxLineGap)
之后,进行一些处理以从细胞系中识别细胞,然后从细胞中识别表格。
大多数计算都是使用 Polars 进行的,以实现不错的性能和速度。
结论
该项目旨在为表识别和提取的复杂主题提供现有实现的实用替代方案。
资源:
- img2table:https://github.com/xavctn/img2table
- OpenCV:https://opencv.org/
- Polar:https://www.pola.rs/
点赞关注 二师兄 talk 获取更多资讯,并在 头条 上阅读我的短篇技术文章