档案数字化开发实例手记:盖章遮挡文字识别恢复

一、问题定义:红章之下,文字还在吗?

档案里的印章几乎无处不在:公文红头章、合同骑缝章、证明文件公章、签发页印章……印章经常恰好盖在正文文字上。这带来两个问题:

  1. 视觉遮挡:印章是红色(或紫、蓝),压在黑色文字上,两者颜色分离,但二值化后章和字糊在一起;
  2. 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%"(分离 + 章识别补充)+ "零错误补字"的组合,才是生产可用的。

六、给读者的一句话

如果你在做档案数字化系统,遇到盖章遮挡:

  1. 先做颜色分离——这是性价比最高的一步;
  2. 把印章当作信息去识别,不要只当噪声去掉;
  3. 被完全遮挡的区域,标记待人工补录,绝不自动生成
  4. 向客户说清楚"哪些能自动、哪些需要人工",这是专业团队和"万能宣传"团队的差别。

七、小结

  • 颜色通道分离解决六成问题,成本最低;
  • inpaint 重建在档案场景是"毒药"——11% 的错误补字率不可接受;
  • 生产方案 = 分层处理 + 章识别 + 人工补录标记,真实优先于完整
posted on 2026-09-03 15:56  程序员李铁牛  阅读(10)  评论(0)    收藏  举报