You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何利用光学字符识别(OCR)将图像中的表格提取为可编辑的Excel表格?

如何利用光学字符识别(OCR)将图像中的表格提取为可编辑的Excel表格?

看起来你遇到了OCR提取表格的典型难题——普通的文字识别只会把表格当成一堆连续文本,没法精准识别单元格的结构,导致没法直接转成CSV/Excel对吧?我之前帮朋友处理过类似的批量表格提取需求,咱们可以从优化现有工具、换用专门工具、预处理图像这几个方向入手解决:

一、先优化你的Tesseract代码,开启表格识别模式

你现在用的pytesseract.image_to_string()默认是提取纯文本,完全忽略了表格的行列结构。其实Tesseract藏着专门的参数和输出格式,能帮你识别表格的结构:

方法1:让Tesseract输出结构化数据

你可以用image_to_data()获取每个字符/单词的位置信息,再根据位置把内容分组到对应的单元格里,这样就能还原表格结构了:

import pandas as pd
import pytesseract
from PIL import Image

# 读取你的表格图像
image = Image.open(image_path)

# 关键参数:--psm 6适合整页都是整齐表格的情况,--oem 3用默认OCR引擎
custom_config = r'--oem 3 --psm 6'

# 提取带位置信息的结构化数据,返回DataFrame格式
data = pytesseract.image_to_data(image, config=custom_config, output_type='data.frame')

# 过滤掉空白的无效行
filtered_data = data[data['text'].notna() & (data['text'].str.strip() != '')]

# 根据位置信息分组,把同一行的内容放到一起
table_rows = []
current_row = []
prev_top = None
# 按行(top值)和列(left值)排序,保证内容顺序正确
for idx, row in filtered_data.sort_values(['top', 'left']).iterrows():
    # 当top值变化超过10像素,说明是新的一行(阈值可以根据你的图像调整)
    if prev_top is None or abs(row['top'] - prev_top) > 10:
        if current_row:
            table_rows.append(current_row)
        current_row = [row['text']]
        prev_top = row['top']
    else:
        current_row.append(row['text'])
# 别忘了加入最后一行内容
if current_row:
    table_rows.append(current_row)

# 转成DataFrame并保存为Excel,第一行作为表头
df = pd.DataFrame(table_rows[1:], columns=table_rows[0])
df.to_excel('extracted_table.xlsx', index=False)

方法2:先预处理图像,提升识别准确率

如果你的图像有模糊、阴影或者对比度低的问题,先做预处理再识别,能大幅降低错误率:

from PIL import ImageEnhance

# 读取图像后先预处理
image = Image.open(image_path)
# 增强对比度(这里设为2倍,你可以根据实际调整)
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(2.0)
# 转成灰度图再二值化,让文字和背景更清晰
image = image.convert('L')
image = image.point(lambda x: 0 if x < 128 else 255, '1')

# 然后再用上面的Tesseract代码识别就行

二、换用专门的表格OCR工具

如果Tesseract还是搞不定复杂的表格(比如有合并单元格、不规则行列的情况),可以试试这些专门针对表格的开源工具:

  • EasyOCR:比Tesseract对表格结构的识别更友好,支持中英文混合识别,API也更简洁,你可以提取文本后结合位置信息分组;
  • TableTransformer:基于深度学习的表格结构检测工具,能精准识别每个单元格的边界,再搭配OCR提取内容,适合批量处理复杂表格;
  • Google Document AI(如果能用到云端服务):Google的云端OCR服务,对表格的识别准确率极高,适合大规模批量处理,不过需要申请API密钥。

给你个EasyOCR的简单示例(支持中英文):

import easyocr
import pandas as pd

# 初始化阅读器,支持中英文
reader = easyocr.Reader(['en', 'zh'])
# 提取文本和对应的位置信息
result = reader.readtext(image_path, detail=1)

# 同样根据每个文本块的左上角坐标(result里的bbox[0])判断行和列,逻辑和Tesseract的类似
# 这里省略分组代码,核心是按行和列的位置排序后拼接内容

三、批量处理的实用小技巧

如果要处理大量表格图像,这些小技巧能帮你提高效率:

  • 把所有图像放到同一个文件夹,用Python遍历文件夹自动批量处理;
  • 对识别后的表格做简单校验,比如检查每行的列数是否一致,及时发现识别错误;
  • 对于特定场景的复杂表格,可以标注少量样本,用小模型微调,针对性提高识别准确率。

最后,你之前手动整理字符串的方法虽然可行,但批量处理肯定不现实,先试试调整Tesseract的参数和预处理图像,应该能解决大部分问题!

备注:内容来源于stack exchange,提问作者UsangR01

火山引擎 最新活动