在档案数字化场景下,OCR 的核心挑战不是“识别”,而是 “还原”。 我们的目标是:在 OCR 介入之前,先把图片修好。这就像修图师修老照片一样,只不过我们要修的是 “文字的骨架”

1. 痛点一:纸张泛黄与水渍 (Background Noise)

老旧执照最大的问题是 对比度低。 纸张氧化变黄,加上受潮的水渍,导致背景的灰度值(比如 180)和文字的灰度值(比如 120)非常接近。 通用的 全局二值化(Global Thresholding) 算法在这里会彻底失效:设高了,背景全是噪点;设低了,字没了。

工程方案:自适应二值化 (Adaptive Binarization)

我们不能用一个固定的阈值去切分整张图。我们需要 局部阈值

  • 算法选型:推荐使用 Sauvola 算法Niblack 算法(比 OpenCV 自带的 Adaptive Gaussian 效果更好)。
  • 原理: 算法会计算每个像素点周边的 局部均值标准差
    • 如果一个像素比它周围的邻居“黑”很多,它就是字。
    • 如果它和周围邻居一样“黄”,它就是背景。
  • 效果:哪怕纸张左边是黄的,右边是白的,中间有咖啡渍,Sauvola 算法都能把黑色的文字骨架完美提取出来,背景变成纯白。

2. 痛点二:折痕与装订孔 (Physical Damage)

营业执照长期折叠存放,扫描出来后,中间会有一道深深的黑线(折痕)。 OCR 最容易把这道黑线识别成“1”、“I”或者“/”,导致“注册号”多了一位,数据清洗极其困难。

工程方案:形态学操作与连通域分析

我们需要通过几何特征,把“折痕”和“文字”区分开。

  1. 形态学滤波 (Morphological Filtering)
    • 文字的笔画是有一定宽度的(比如 3-5 像素)。
    • 折痕通常是细长的线条。
    • 操作:先进行 “开运算(Opening)”。用一个小的结构元素(Kernel)去腐蚀图像,细长的折痕会被断开或消失,而粗壮的文字会被保留。
  2. 连通域分析 (CCA, Connected Component Analysis)
    • OCR 识别前,先计算图中所有黑色块的面积和长宽比。
    • 逻辑
      • if (Height > 500px AND Width < 5px) -> 这是折痕,填白(抹除)
      • if (Area < 5px) -> 这是噪点(灰尘),填白
    • 结果:只保留像“字”一样的像素块。

3. 痛点三:字迹模糊与断裂 (Blur & Stroke Disconnection)

早期的执照打印机(针式打印机)精度低,或者因为受潮,字迹晕染、断裂。 OCR 看到的是一堆断开的点,而不是一个完整的汉字。

工程方案:超分辨率重建 (Super-Resolution GAN)

对于这种分辨率不足(< 150 DPI)的老档案,传统的插值放大(Bicubic)只会让字更糊。 我们需要 AI 脑补

  • 技术栈:部署一个轻量级的 Real-ESRGANSwinIR 模型。
  • 训练策略
    • 不需要从头训练。使用预训练的“文本增强”权重。
    • Input:模糊、有噪点的低清执照切片。
    • Output:4 倍放大的高清重构图。
  • 效果:GAN 网络会根据学习到的汉字结构,把断裂的笔画“接上”,把模糊的边缘“锐化”。
  • 注意:GAN 有微小的概率会“造字”(把“土”补成“士”),因此置信度阈值要设高。

4. 痛点四:手写与打印混排 (Handwritten Text)

80 年代、90 年代的营业执照,很多是 “手写填空” 的。 印刷体 OCR 模型识别手写体,准确率基本是 0。

工程方案:检测与分流 (Detection & Routing)

  1. 版面分析: 先用目标检测模型(YOLO)把“填空区域”切出来。
  2. 分类器: 判断切片是印刷体还是手写体(基于纹理特征或简单的 CNN 分类)。
  3. 双引擎策略
    • 印刷体 -> 送入 Standard_OCR_Engine
    • 手写体 -> 送入 Handwriting_OCR_Engine(专门在手写数据集上微调过的模型)。

5. 总结

在档案数字化项目中,营业执照 OCR 的成功率,30% 取决于识别模型,70% 取决于图像处理。

面对那些泛黄、褶皱、快要碎掉的老执照,工程师不应该期待“更强的 AI”来创造奇迹,而应该用扎实的 计算机视觉(CV)工程手段,先把图修好。

这不仅仅是技术问题,更是对历史数据的敬畏——把原本要被丢进碎纸机的“不可读”档案,变成数据库里永存的“资产”。