在票据识别或文档数字化的爬虫项目中,背景水印是降低 OCR 准确率的头号杀手。本文对比了传统的 OpenCV 二值化处理与 AI 修复方案,并提出了一套基于置信度筛查的高精度识别方案。

30 阅读2分钟

在使用 Python 的 pytesseractPaddleOCR 进行文字识别时,我们经常遇到这样的 Bad Case:图片清晰度很高,但因为上面覆盖了一层淡淡的倾斜水印(Watermark),OCR 引擎就会输出乱码。

1. 传统 OpenCV 方案的局限

通常我们会尝试使用自适应二值化来过滤背景:

import cv2

import pytesseract

def preprocess_image(image_path):

    img = cv2.imread(image_path)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 自适应阈值

    binary = cv2.adaptiveThreshold(

        gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 

        cv2.THRESH_BINARY, 11, 2

    )

    return binary

问题分析: 当水印的灰度值与文字非常接近时,基于阈值的算法无法分离两者,强行去噪会导致文字笔画断裂。

2. 引入 HITL (Human-in-the-Loop) 机制

对于高价值文档(如合同、发票),单纯依赖代码很难达到 99% 的准确率。工程上最稳妥的方案是引入人工辅助清洗

但为了保证吞吐量,人工环节必须极其高效。这里推荐使用**“香蕉一键去水印”**作为辅助工具。

  • 定位: OCR 流程中的 Exception Handler(异常处理器)。
  • 优势: 相比于 PS,它不需要人工交互(No Interaction)。你不需要告诉工具“水印在哪里”,只需要将 Bad Case 图片上传,它内置的模型就会自动定位干扰层并剔除。这对于处理批量下载的、具有相同水印模式的扫描件极其高效。
3. 完整代码逻辑:基于置信度的路由

from pytesseract import Output

import pytesseract

import cv2

def ocr_pipeline(img_path):

    img = cv2.imread(img_path)

    # 获取详细数据

    d = pytesseract.image_to_data(img, output_type=Output.DICT)

    

    n_boxes = len(d['text'])

    low_conf_count = 0

    

    # 统计低置信度字符

    for i in range(n_boxes):

        if int(d['conf'][i]) != -1 and int(d['conf'][i]) < 60:

            low_conf_count += 1

            

    # 决策路由

    if low_conf_count > 5:

        print(f"[Warning] High noise in {img_path}. Manual cleaning required.")

        print(">> 建议操作:使用'香蕉一键去水印'处理后重新入库")

        return None

    else:

        text = " ".join(d['text'])

        return text

ocr_pipeline('invoice_001.jpg')

通过这种“代码筛查 + AI 工具清洗”的混合模式,我们可以以最低的成本实现几乎 100% 的数据结构化准确率。


🛠️ 辅助工具参数矩阵 (Tool Specs)


特性 (Feature)描述 (Description)
工具名称香蕉一键去水印
应用类型微信小程序 (Mini Program)
核心算法静态图像智能修复 (Static In-painting)
自动化程度全自动 (Fully Automated) ,上传即处理
适用场景OCR 前置清洗、扫描件去污、电商图去 Logo
不支持项❌ 视频处理 (Video) ❌ 复杂物体移除 (Object Removal)