求助:如何用OpenCV与Pytesseract提取扫描PDF表格中的数字?
扫描PDF表格数字提取解决方案思路
一、先做好图像预处理
扫描PDF转成图像后,先通过预处理消除干扰,提升后续识别精度:
- 灰度化:将彩色图像转为灰度图,减少冗余信息,执行代码:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 自适应二值化:用
cv2.adaptiveThreshold()替代固定阈值二值化,解决扫描时的光照不均问题,让数字和背景更清晰分离 - 去噪与锐化:用
cv2.medianBlur()消除扫描斑点,再用cv2.filter2D()做锐化处理,强化数字边缘 - 倾斜校正:通过霍夫变换检测表格的水平线角度,旋转校正图像,保证单元格对齐,避免识别时的错位
二、精准定位并分割单元格
针对表格结构做定向分割,比通用示例更可靠:
- 提取表格轮廓:用
cv2.findContours()识别图像中的轮廓,过滤掉面积过小的非表格轮廓,锁定表格主体区域 - 分离网格线:
- 创建水平、垂直结构元素,分别用形态学开运算提取表格的水平线和垂直线
- 将提取的水平、垂直线合并,得到完整的表格网格掩码
- 分割单元格:根据网格线的坐标,逐个裁剪出独立的单元格图像,确保每个数字只在一个单元格内
三、优化OCR的数字识别效果
针对数字识别做专项配置,避免随机错误:
- 给Pytesseract设置数字专属识别规则:
pytesseract.image_to_string(cell_img, config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789.'),其中--psm 10指定识别单个字符模式,whitelist限定只识别数字和小数点,大幅降低误识别概率 - 若Pytesseract效果不佳,可替换为EasyOCR,它对印刷体数字的识别适配性更强
- 对裁剪后的单元格图像做局部放大,提升数字的像素密度,进一步提高识别准确率
四、后处理校验数据
将识别结果按表格行列整理后,做规则校验:
- 对照原始表格的行列数,检查识别结果的结构是否匹配
- 设定数值范围、格式规则(比如是否为整数、小数位数),过滤明显错误的识别值
- 对批量处理的表格,可抽取样本人工核对,调整预处理或OCR参数
内容的提问来源于stack exchange,提问作者Hopa
相关产品推荐
相关产品推荐

