惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
S
SegmentFault 最新的问题
量子位
有赞技术团队
有赞技术团队
V
V2EX
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Jina AI
Jina AI
C
Check Point Blog
G
Google Developers Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
T
Tailwind CSS Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
U
Unit 42

博客园 - 程序员李铁牛

赛事报名系统开发总管理中心规划 赛事报名系统开发:角色与权限体系设计 赛事系统报名接龙高并发技术细节处理浅析 档案数字化研发手记:PDF合并内存溢出踩坑 纸质档案数字化管理系统研发手记:法院诉讼档案单套制落地案例复盘——从纸质卷宗到电子卷宗 档案数字化管理系统开发手记:人事档案专项审核与数字化的系统支撑——"凡提必审"下的技术要点 档案数字化研发手记:我们的技术栈选择——档案系统前后端选型理由(含一次"炫技"的教训) 社群团购系统开发分享——工程化(下):资金支付测试策略——资金模块 100% 覆盖,其他 60% 就够 社群团购系统类快团团源码开发——工程化(上):一套让 5 人小团队不出事故的开发规范 社群团购类快团团系统开发——RBAC 权限设计源码分析:当一个微信号有 4 种身份时怎么办 社群团购系统类快团团模式开发——微信小程序登录:code2Session 之后还有 5 件事要做 数字档案管理系统化研发手记:医院病历档案数字化——合规、病案首页 OCR 与调阅提速 数字档案系统研发手记:批量扫描任务调度——TWAIN/SANE 采集驱动的封装实践 档案数字化系统研发源码手记:置信度过滤——把 97% 识别率变成真正可交付的成果 景区运营预约系统开发:景区会员体系怎么搭?3级会员模型+积分玩法 景区门票预约系统全渠道平台库存数据同步技术处理方式 系统宕机了怎么办?景区票务系统应急预案模板 景区门票预约系统开发:接入AI预测客流设计思路分析 景区预约系统开发总结:门票分时预约设计原理和落地方法 设备运维管理系统开发实战:用规则引擎实现可配置的设备告警策略自研轻量引擎 vs Drools 落地对比 设备维修保养系统预测性维护不用深度学习?设备健康度评分的务实实现方案 档案数字化管理系统研发手记:档案权限模型——全宗-门类-案卷-文件四级控制的设计与实践 档案管理信息化系统研发手记:数字水印方案对比——可见水印 vs 盲水印(档案借阅防泄露) 景区票务系统开发实例分析:上云还是本地部署?6个维度判断 档案数字化系统源码研发手记:老旧档案去污点——中值滤波与 inpainting 效果对比 一物一码防伪溯源系统开发全栈源码串联一次扫码的完整链路追踪代码走读 景区门票预约系统票务系统的6个核心模块 景区上线门票预约系统的5个常见翻车点 景区门票预约系统之人脸识别 vs 身份证核验 vs 扫码入园,哪种最适合你? 景区门票预约系统开发深度解析之定价策略功能设计
档案数字化开发实例手记:盖章遮挡文字识别恢复
程序员李铁牛 · 2026-09-03 · via 博客园 - 程序员李铁牛

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

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

  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% 的错误补字率不可接受;
  • 生产方案 = 分层处理 + 章识别 + 人工补录标记,真实优先于完整