在档案数字化场景下,OCR 的核心挑战不是“识别”,而是 “还原”。 我们的目标是:在 OCR 介入之前,先把图片修好。这就像修图师修老照片一样,只不过我们要修的是 “文字的骨架”。
1. 痛点一:纸张泛黄与水渍 (Background Noise)
老旧执照最大的问题是 对比度低。 纸张氧化变黄,加上受潮的水渍,导致背景的灰度值(比如 180)和文字的灰度值(比如 120)非常接近。 通用的 全局二值化(Global Thresholding) 算法在这里会彻底失效:设高了,背景全是噪点;设低了,字没了。
工程方案:自适应二值化 (Adaptive Binarization)
我们不能用一个固定的阈值去切分整张图。我们需要 局部阈值。
- 算法选型:推荐使用 Sauvola 算法 或 Niblack 算法(比 OpenCV 自带的 Adaptive Gaussian 效果更好)。
- 原理: 算法会计算每个像素点周边的 局部均值 和 标准差。
- 如果一个像素比它周围的邻居“黑”很多,它就是字。
- 如果它和周围邻居一样“黄”,它就是背景。
- 效果:哪怕纸张左边是黄的,右边是白的,中间有咖啡渍,Sauvola 算法都能把黑色的文字骨架完美提取出来,背景变成纯白。
2. 痛点二:折痕与装订孔 (Physical Damage)
营业执照长期折叠存放,扫描出来后,中间会有一道深深的黑线(折痕)。 OCR 最容易把这道黑线识别成“1”、“I”或者“/”,导致“注册号”多了一位,数据清洗极其困难。
工程方案:形态学操作与连通域分析
我们需要通过几何特征,把“折痕”和“文字”区分开。
- 形态学滤波 (Morphological Filtering):
- 文字的笔画是有一定宽度的(比如 3-5 像素)。
- 折痕通常是细长的线条。
- 操作:先进行 “开运算(Opening)”。用一个小的结构元素(Kernel)去腐蚀图像,细长的折痕会被断开或消失,而粗壮的文字会被保留。
- 连通域分析 (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-ESRGAN 或 SwinIR 模型。
- 训练策略:
- 不需要从头训练。使用预训练的“文本增强”权重。
- Input:模糊、有噪点的低清执照切片。
- Output:4 倍放大的高清重构图。
- 效果:GAN 网络会根据学习到的汉字结构,把断裂的笔画“接上”,把模糊的边缘“锐化”。
- 注意:GAN 有微小的概率会“造字”(把“土”补成“士”),因此置信度阈值要设高。
4. 痛点四:手写与打印混排 (Handwritten Text)
80 年代、90 年代的营业执照,很多是 “手写填空” 的。 印刷体 OCR 模型识别手写体,准确率基本是 0。
工程方案:检测与分流 (Detection & Routing)
- 版面分析: 先用目标检测模型(YOLO)把“填空区域”切出来。
- 分类器: 判断切片是印刷体还是手写体(基于纹理特征或简单的 CNN 分类)。
- 双引擎策略:
- 印刷体 -> 送入
Standard_OCR_Engine。 - 手写体 -> 送入
Handwriting_OCR_Engine(专门在手写数据集上微调过的模型)。
- 印刷体 -> 送入
5. 总结
在档案数字化项目中,营业执照 OCR 的成功率,30% 取决于识别模型,70% 取决于图像处理。
面对那些泛黄、褶皱、快要碎掉的老执照,工程师不应该期待“更强的 AI”来创造奇迹,而应该用扎实的 计算机视觉(CV)工程手段,先把图修好。
这不仅仅是技术问题,更是对历史数据的敬畏——把原本要被丢进碎纸机的“不可读”档案,变成数据库里永存的“资产”。