预处理与参数调优(让识别率从“能看”到“可用”)

目标:解决第一期遇到的"明明人眼能看清,OCR 却认错"的问题。核心手段是图像预处理和识别参数控制。

1. 图像预处理:OpenCV 三件套

OCR 对图像质量非常敏感。灰度化、去噪、二值化是最基础的预处理组合,能显著提升 Tesseract 等传统引擎的识别率。

python

复制代码
import cv2
import numpy as np

def preprocess(image_path):
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 放大:小字变大字,对 Tesseract 尤其有效
    gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

    # 去噪 + Otsu 自动阈值二值化
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    _, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    return binary

processed = preprocess("receipt.jpg")
cv2.imwrite("processed.png", processed)

如果图片有倾斜,可以先用 cv2.minAreaRect 或霍夫变换做纠偏,再送入 OCR。

2. Tesseract 的 PSM 参数:告诉引擎"这是什么版式"

Tesseract 的 --psm 参数控制页面分割模式。默认模式 3 适合标准文档;如果只识别单行(比如身份证号、金额),用 psm 7;如果图片是稀疏的界面截图或小票,psm 11 往往更稳。

python

复制代码
# 只识别单行数字,并限定字符白名单
text = pytesseract.image_to_string(
    Image.open("amount.png"),
    config="--psm 7 -c tessedit_char_whitelist=0123456789."
)

3. 用置信度做过滤

OCR 输出里的置信度分数是调优的重要信号。低于阈值的识别结果,与其硬用,不如标记出来交给人工复核。EasyOCR 和 PaddleOCR 都直接返回置信度,pytesseract 则需要用 image_to_data 获取。

python

复制代码
# EasyOCR 按置信度过滤
filtered = [(bbox, text, score) for bbox, text, score in result if score > 0.5]

第二期的关键认知是:预处理决定了 OCR 的上限,参数决定了能否触达这个上限。同一张图,预处理前后、PSM 不同取值下的结果可能天差地别。https://github.com/0voice

相关推荐
gf13211111 小时前
python_高德地图驾车时长查询
数据库·python·mysql
镜子AI1 小时前
镜子AI技术实践:用 Python 做 GEO 答案的实体提及抽取与归一化(零依赖两阶段方案)
python·ai
I Am a robert girl1 小时前
从点到面:Superquadric 分解中“几何感知内点精修”的工程拆解
python·ransac·点云处理·三维感知·superquadric·几何基元拟合·内点判定
计算机毕业编程指导师1 小时前
计算机毕设推荐:基于深度学习的动物图像识别方法研究(Python+Django+PyTorch)
pytorch·python·深度学习·计算机·毕业设计·课程设计·图像识别
Java后端的Ai之路1 小时前
【AIAgent项目-AI生成PPT-09】灵活排版
前端·vue.js·人工智能·python·powerpoint
泡泡糖的中文规格书1 小时前
HDLbits 2.2 学习笔记 · 多路复用器
java·开发语言
John_Hui1 小时前
第 3 篇:配置 JDK 17 环境
java·开发语言·ubuntu
~~刘杨1 小时前
用 Python 批量处理商品图:抠图、高清放大与图生视频(同步 API 完整示例)
图像处理·python·aigc
小小张说故事1 小时前
Python 拼字符串为什么别在循环里用 +=?拆开 join 的两遍账:191.8 微秒与 6.8 微秒
python