如何用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
相关产品推荐
相关产品推荐

