使用Python从图像中提取表格
创始人
2025-07-06 14:00:07
0

大约一年前,我被分配任务从文件中提取和结构化数据,主要是包含在表格中的数据。我之前对计算机视觉没有了解,并且很难找到一个合适的“即插即用”的解决方案。当时可选的方案要么是基于最新神经网络(NN)的解决方案,这些解决方案庞大而繁琐,要么是基于OpenCV的较简单的解决方案,但不够一致。

受现有OpenCV脚本的启发,我开发了一种简单而一致的方法来提取表格,并将其制作成一个开源的Python库:img2table。

链接:https://github.com/xavctn/img2table

我的库有什么作用?

与深度学习解决方案相比,这个轻量级的包不需要训练和最小化参数化。它提供了以下功能:

  • 识别图像和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)

从PDF中提取的表格示例

最后,在简单的情况下,可以通过设置`borderless_tables`参数来执行“无边框”表格的提取。这允许检测那些单元格不需要完全被边框包围的表格。

“无边框”表格提取示例

这就是全部!实际上,库并没有太多复杂的东西,因为目标是尽可能简化,以避免其他可用解决方案可能带来的复杂性。

有关更详细的文档和示例,请查看项目的GitHub页面:https://github.com/xavctn/img2table

底层实现

所有图像处理都使用OpenCV和opencv-python库完成。然而,这仍然相当基础。

算法的骨架是Hough变换,它能够识别图像中的线条,使我们能够检测图像的水平和垂直线条。

cv2.HoughLinesP(img, rho, theta, threshold, None, minLinLength, maxLineGap)

之后,对线条进行一些处理以从线条中识别单元格,然后从单元格中识别表格。

实现算法的简化表示

大多数计算使用Polars进行,以实现良好的性能和速度。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...