求推荐Python OCR工具及技巧:处理老旧扫描表格生成CSV
处理老旧扫描表格的Python OCR方案与优化技巧
推荐的Python OCR包
- Tesseract + pytesseract:开源可定制性强,支持自定义字符训练,是处理老旧扫描文档的首选工具
- EasyOCR:开箱即用,无需复杂配置,对低分辨率、模糊文本的基础识别表现稳定
- PaddleOCR:自带表格结构识别模块,对中文和数字的鲁棒性出色,适合批量处理表格类扫描件
针对核心问题的处理技巧
1. 数字可读性差导致识别不准确
预处理优化
- 灰度化:将彩色扫描图转为灰度图,减少干扰:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 自适应阈值二值化:自动区分数字与背景,解决扫描明暗不均问题:
cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - 降噪:用中值滤波去除扫描斑点:
cv2.medianBlur(thresh, 3) - 字符增强:通过形态学膨胀操作强化数字边缘:
cv2.dilate(blur, cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)), iterations=1)
OCR配置优化
- 指定字符白名单:限制Tesseract仅识别数字和必要符号,避免误识别:
--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789., - 自定义训练:若数字磨损严重,可使用Tesseract训练工具制作专属数字数据集,进一步提升识别精度
2. 表格线被识别为/、(、)等乱码字符
预处理阶段去除表格线
- 形态学操作消线:创建水平线/垂直线核,通过开运算去除表格线条:
# 去除水平线 horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1)) detect_horizontal = cv2.morphologyEx(blur, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] for c in cnts: cv2.drawContours(img, [c], -1, (255,255,255), 2) - 使用专业表格OCR:直接调用PaddleOCR的表格识别接口,自动提取表格结构并忽略线条
后处理修正
- 字符黑名单:在Tesseract配置中屏蔽易误识别的字符:
-c tessedit_char_blacklist=()/ - 正则替换:批量清理识别结果中的乱码字符:
re.sub(r'[()/]', '', text)
实操示例代码
import cv2 import pytesseract import csv import re # 读取扫描图片 img = cv2.imread('old_scanned_table.jpg') # 预处理流程 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) blur = cv2.medianBlur(thresh, 3) # 去除表格水平线 horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1)) detect_horizontal = cv2.morphologyEx(blur, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] for c in cnts: cv2.drawContours(img, [c], -1, (255,255,255), 2) # OCR识别,配置数字白名单 custom_config = r'--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789.,' raw_text = pytesseract.image_to_string(img, config=custom_config) # 后处理清理乱码 clean_text = re.sub(r'[()/]', '', raw_text) # 转换为CSV格式写入文件 rows = [line.strip().split() for line in clean_text.split('\n') if line.strip()] with open('digitized_table.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(rows)
内容的提问来源于stack exchange,提问作者Aron Kübler
相关产品推荐
相关产品推荐

