档案数字化开发实例手记:盖章遮挡文字识别恢复
一、问题定义:红章之下,文字还在吗?
档案里的印章几乎无处不在:公文红头章、合同骑缝章、证明文件公章、签发页印章……印章经常恰好盖在正文文字上。这带来两个问题:
- 视觉遮挡:印章是红色(或紫、蓝),压在黑色文字上,两者颜色分离,但二值化后章和字糊在一起;
- OCR 误判:印章区域被检测为"红色文本",或把章影当文字、把字当章影,识别结果一团糟。
客户不会因为盖章就不要求识别——他们问的就是"这段被章盖住的字到底写了什么"。这篇讲讲我们评估过的三条技术路线,以及为什么最终选了"部分放弃"。
二、路线一:颜色通道分离(最朴素、最有效的前提步骤)
思路:印章是红色,正文是黑色(或深蓝)。RGB 通道上,红章在 R 通道高、G/B 低;黑字三个通道都低。只要按颜色分离,就能把章"去掉"再识别。
import cv2
import numpy as np
def separate_red_seal(img_bgr):
"""分离出红色印章区域"""
b, g, r = cv2.split(img_bgr)
# 红色判定:R 明显高于 G 和 B
red_mask = (r.astype(int) - g.astype(int) > 40) & \
(r.astype(int) - b.astype(int) > 40) & \
(r > 100)
# 黑色文字:三个通道都低
dark_mask = (r < 100) & (g < 100) & (b < 100)
# 去掉红色后的"正文图":把红章区域置为白
img_no_seal = img_bgr.copy()
img_no_seal[red_mask] = (255, 255, 255)
# 只保留深色文字的"文字图"
text_only = np.zeros_like(img_bgr)
text_only[dark_mask] = (255, 255, 255)
return img_no_seal, red_mask, dark_mask
优点:简单、快、不依赖模型,能解决 60%~70% 的"章字分离"问题——只要印章和正文颜色可区分。
问题:
- 深色印章(蓝色、紫色、黑色印章):颜色通道分不开,直接失效;
- 红色和文字重叠区域:黑色文字被红章压住的部分,像素是"红黑混合",既不是纯红也不是纯黑,两个 mask 都抓不到,成了"灰度区";
- 扫描仪颜色偏差、纸张发黄时阈值要调。
三、路线二:章区域检测 + inpaint 重建被遮挡文字
思路:先定位印章区域,然后把"红黑混合区"视为缺失,用 inpaint 根据周围文字笔画重建。
def restore_text_under_seal(img, red_mask):
"""尝试重建被印章遮挡的文字"""
# 1. 膨胀印章区域,把边缘混合像素也包进来
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
seal_area = cv2.dilate(red_mask.astype(np.uint8), kernel)
# 2. 印章区域内"既非纯红也非纯黑"的像素 = 遮挡区
b, g, r = cv2.split(img)
dark = (r < 100) & (g < 100) & (b < 100)
mixed = seal_area.astype(bool) & ~dark
# 3. 用周围内容 inpaint 重建
mask = mixed.astype(np.uint8) * 255
restored = cv2.inpaint(img, mask, 5, cv2.INPAINT_TELEA)
return restored
评估结果:在文字笔画轮廓清晰的印章上有效,但大面积深色印章下方几乎重建不出原文——inpaint 是"猜",猜出来的笔画常常是错的,甚至"补"出本来不存在的字。对档案这种"内容必须真实"的场景,猜出来的文字是绝对不能用的。
四、路线三:光学原理 + 深度学习(我们最终的生产方案)
最终方案不是"完美重建被遮挡文字",而是分层处理 + 明确告诉客户哪里识别不了:
第一层:能分离的先分离。 颜色通道分离(路线一)解决 60%~70%。
第二层:印章本身也要识别。 印章内容(单位名称、日期、编号)本身就是档案信息的一部分,我们用"印章识别模型"(圆形/椭圆印章的弧形文字展开识别)把章的内容单独提出来——章是信息不是噪声。
第三层:遮挡区标记 + 人工补录。 对真正的"文字被章完全盖住、无法可靠识别"的区域:
- 不做盲目重建;
- 在识别结果里标记
[印章遮挡,待人工补录]; - 系统自动把该区域加入"人工复核队列",档案员对照原件录入。
这样做的理由,也是我们想对所有做档案系统的团队说的:
档案数字化的第一原则是"真实",不是"完整"。 宁可明确标注"此处无法自动识别",也不允许 OCR 或图像处理"猜"出一个可能错误的字混入数据。一个错字进入档案检索库,比十个"待补录"标记危害大得多。
五、实测数据(500 页含章档案)
| 方案 | 遮挡区可读率 | 错误补字率 | 处理耗时 |
|---|---|---|---|
| 仅颜色分离 | 61% | 0%(不处理遮挡区) | 60ms |
| 颜色分离 + inpaint 重建 | 78% | 11%(补错字) | 520ms |
| 分层方案(分离+章识别+人工标记) | 76% | 0%(不猜字) | 300ms |
结论:inpaint 把可读率从 61% 提到 78%,但代价是 11% 的错误补字率——这个代价在档案场景不可接受。分层方案的"可读率 76%"(分离 + 章识别补充)+ "零错误补字"的组合,才是生产可用的。
六、给读者的一句话
如果你在做档案数字化系统,遇到盖章遮挡:
- 先做颜色分离——这是性价比最高的一步;
- 把印章当作信息去识别,不要只当噪声去掉;
- 被完全遮挡的区域,标记待人工补录,绝不自动生成;
- 向客户说清楚"哪些能自动、哪些需要人工",这是专业团队和"万能宣传"团队的差别。
七、小结
- 颜色通道分离解决六成问题,成本最低;
- inpaint 重建在档案场景是"毒药"——11% 的错误补字率不可接受;
- 生产方案 = 分层处理 + 章识别 + 人工补录标记,真实优先于完整。
浙公网安备 33010602011771号