Python 识别表格图片:从图像到结构化数据的完整指南

引言

在日常数据处理中,经常遇到印刷或手写的表格图片。手动录入费时费力,而 Python 生态提供了强大的图像处理与 OCR 工具,可以自动化提取表格数据。本文将带你了解主流方法,并给出可落地的代码实例。

技术栈概览

  • 图像预处理:OpenCV(去噪、二值化、倾斜校正)
  • 文字识别:PaddleOCR(中文友好)、Tesseract(轻量)
  • 表格结构提取:Camelot(PDF 表格)、Tabula(PDF)、自定义线条检测
  • 后处理与导出:pandas + excel

实战:识别图片中的表格

步骤1:图像预处理

import cv2
import numpy as np

img = cv2.imread('table.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imwrite('preprocessed.png', thresh)

步骤2:文字识别

from paddleocr import PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang='ch')
result = ocr.ocr('preprocessed.png', cls=True)
for line in result:
    print(line[1][0])  # 输出文字和置信度

步骤3:表格结构重建

如果图片是扫描件且带有明显线条,可以使用 OpenCV 检测横线和竖线:

# 检测水平线
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1))
horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel)
# 垂直线同理
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,40))
vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel)

找到线交点即可划分单元格,再结合 OCR 的坐标信息填充数据。

步骤4:数据组装与导出

import pandas as pd

data = [['姓名','年龄','城市'],['张三','28','北京'],['李四','35','上海']]
df = pd.DataFrame(data[1:], columns=data[0])
df.to_excel('output.xlsx', index=False)

进阶工具推荐

  • Camelot:专为 PDF 中的表格设计,自动检测表格边界。
  • Tabula-py:另一款 PDF 表格提取利器。
  • PaddleOCR 表格识别:内置表格结构预测模型,端到端输出。

性能优化建议

  • 图片分辨率不宜过高,否则 OCR 耗时剧增。
  • 使用 GPU 加速(如 PaddleOCR 支持 GPU)。
  • 先画线检测再 OCR,避免识别无用区域。

总结

Python 识别表格图片已不是难题,关键在于图像预处理与合适的工具组合。对于复杂排版(无框线、非规则表格),推荐使用深度学习模型(如 OCR + 表格检测网络)。希望本文能帮你快速上手表格图片数据提取。