You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+OpenCV提取讲师表格图片每行文本并拆分单元格

提取表格行文本的完整实现方案

嘿,你已经搞定了表格行拆分的第一步,接下来要提取每行的讲师姓名和科目代码文本对吧?我来给你梳理一套实用的实现方案,结合OpenCV的预处理和Tesseract OCR来完成这个需求~

一、补全行拆分逻辑,添加文本提取流程

我先把你给出的代码补全,然后加入文本提取的核心步骤:

import cv2
import numpy as np
import pytesseract

# 如果你系统里没把Tesseract加入PATH,需要手动指定路径
# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

cropped_Image_Location = "/home/shakya/Desktop/Paramore/CM_bot/timeTableDetails/Cropped/"
segmentCount = 0

# 读取裁剪后的表格图片
img = cv2.imread(cropped_Image_Location + "cropped_5.jpg")
if img is None:
    print("无法读取图片,请检查路径是否正确!")
    exit()

# 边缘检测(补全你代码里的省略部分)
edges = cv2.Canny(img, 50, 150, apertureSize=3)

# 检测水平线条,用于分割表格行
lines = cv2.HoughLinesP(
    edges,
    rho=1,
    theta=np.pi/180,
    threshold=100,
    minLineLength=100,
    maxLineGap=10
)

if lines is not None:
    # 提取所有水平线的y坐标并去重排序
    y_coords = sorted(list(set([line[0][1] for line in lines])))
    # 添加图片顶部和底部的坐标,确保第一行和最后一行被包含
    y_coords.insert(0, 0)
    y_coords.append(img.shape[0])

    # 遍历分割每一行
    for i in range(len(y_coords)-1):
        y_start = y_coords[i]
        y_end = y_coords[i+1]
        # 跳过过短的行(可能是噪声线条)
        if y_end - y_start < 20:
            continue
        
        # 提取当前行的图像区域
        row_img = img[y_start:y_end, :]
        segmentCount += 1
        # 可选:保存分割后的行图片用于调试
        cv2.imwrite(f"{cropped_Image_Location}row_{segmentCount}.jpg", row_img)

        # --- 核心:预处理+文本提取 ---
        # 1. 转灰度图
        gray_row = cv2.cvtColor(row_img, cv2.COLOR_BGR2GRAY)
        # 2. 自适应二值化(适配光照不均的情况)
        thresh_row = cv2.adaptiveThreshold(
            gray_row,
            255,
            cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY_INV,
            11,
            2
        )
        # 3. 去除小噪声(可选,根据图片情况调整)
        kernel = np.ones((1, 1), np.uint8)
        clean_row = cv2.morphologyEx(thresh_row, cv2.MORPH_OPEN, kernel, iterations=1)

        # 4. 使用Tesseract提取文本
        # 配置参数:psm 6表示假设行是一个统一的文本块,oem 3使用默认OCR引擎
        custom_config = r'--oem 3 --psm 6'
        # 如果你的科目代码是字母+数字,还可以限制识别字符集提高准确率
        # custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '
        text = pytesseract.image_to_string(clean_row, config=custom_config)

        # 清理提取到的文本(去除多余换行、空格)
        cleaned_text = text.strip().replace('\n', ' ')
        print(f"第{segmentCount}行内容:{cleaned_text}")
else:
    print("未检测到表格行,请检查边缘检测参数或图片质量!")

二、优化OCR准确率的小技巧

如果提取结果有误差,可以试试这些调整:

  • 调整二值化方式:如果图片光照均匀,换成全局阈值+OTSU自动阈值:ret, thresh_row = cv2.threshold(gray_row, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
  • 放大行图片:如果文本太小,可以用cv2.resize(row_img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)放大后再处理
  • 分割列区域:如果每行里姓名和科目代码是分开的两列,可以检测垂直线条,把行拆分成两个区域分别提取文本,避免混淆

三、安装必要的依赖

运行代码前需要安装这些库:

pip install opencv-python numpy pytesseract

还要安装Tesseract OCR引擎:

  • Ubuntu/Debian:sudo apt-get install tesseract-ocr
  • macOS:brew install tesseract
  • Windows:从Tesseract官方仓库下载安装包,安装后记得配置环境变量或者在代码里指定路径

内容的提问来源于stack exchange,提问作者Shakya RDN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:24:34