一、承接上篇会盖章了但水印还压在文档上上篇的电子签章解决了加盖问题但现实里大量文档本就压着水印、Logo——有的是自己公司的底纹有的是来源平台的角标。要复用、要归档就得把它们干净去掉且不能把底图细节一起抹糊。二、痛点传统去水印的两难传统工具只有两条路要么手动涂抹累且慢遇到几十页的 PDF 直接放弃要么暴力处理把整图细节都磨平字也跟着糊。尤其是大面积 mask还容易留下灰斑、黑斑比水印更难看适得其反。三、双模式修复后端我们设计了双模式修复后端按需求选速度或质量极速模式默认OpenCV 的 cv2.inpaint Telea 算法。对文档类水印效果极佳、无需 GPU、几毫秒完成另提供流体力学 cv2_ns 作为备选。高质量模式IOPaint / LaMa 深度学习修复模型为 lama_fp32.onnx / big-lama.pt适合复杂背景的大面积去除。前端用透明红色画笔做交互式 Mask 标注PDF 则逐页高分辨率渲染 → 去水印 → 重新合并保持清晰度。推理层做硬件自适应CUDA → MPS → CPU 懒加载有卡用卡、无卡用 CPU开箱即用。修复路由示意按质量选算法def inpaint(mask, mode“fast”):if mode “fast”:return cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA) # 极速return lama_model.infer(img, mask) # 高质量四、踩坑实录四个变灰 / 失败的真凶坑 1LaMa 加载失败。 旧版 huggingface_hub 里 diffusers 曾导入已被删除的 cached_download。我们在本地桥接成 hf_hub_download加载恢复正常。坑 2局部去 Logo 后整图变灰。 前端传的是不透明黑白 RGBA Mask其 Alpha255 被后端误当成整图都要涂抹。改为按 Mask 格式解码并让 LaMa 只替换 mask 像素底图安然无恙。坑 3cv2 大面积 mask 留灰 / 黑斑。 采用自适应半径 大 mask 中位背景填充 边缘羽化灰斑消失。坑 4Mask 解码误判。 原逻辑用 max(red, alpha) 判断遇到特定格式就错。改为按格式识别解码彻底修准。极速与高质量怎么选选型并不玄学文档扫描件上的浅色水印、单色底纹OpenCV Telea 几毫秒就能修得干净且完全不需要 GPU是默认首选只有当背景复杂、被遮区域大、用传统算法会留痕时才上 IOPaint / LaMa 这类深度学习修复。模型就位 lama_fp32.onnx / big-lama.pt用质量换时间按需取用。此外 OpenCV 还提供流体力学 cv2_ns 作为备选应对 Telea 处理不佳的特殊纹理而深度学习模式虽慢却能把被水印压住的文字、线条自然补全这是传统算法做不到的。对 PDF则是逐页高分辨率渲染、逐页去水印、再重新合并清晰度不丢。对企业档案室来说去水印往往不是一两张的事而是成千上万份历史资料的统一清理。这时候选型的代价就显现了如果每处水印都要人工涂抹工作量是天文数字如果粗暴处理把字也糊掉资料反而报废。所以我们把极速与高质量两条路都铺好让操作员按资料珍贵程度自行取舍既不浪费算力也不牺牲关键文档的可用度。本地推理还有一层意义敏感档案不需要离开内网合规上说得过去。对运维来说不需要显卡也能跑普通办公机就能扛住日常量级。说到底去水印的底线只有一条只动该动的地方其余原样保留。我们为此在 Mask 解码上花了最多功夫因为一旦把整图误当涂抹区域再好的模型也救不回底图。下一篇我们把视角拉到批量场景看几百份固定位置的扫描件怎么在完全不联网的前提下被一次性清理干净。那才是企业档案部门真正头疼的规模问题。规模一大手动就彻底失灵这正是自动化必须接管的地方也是我们做批量链路的初心。本阶段使用建议文档类水印默认走 Telea 极速模式无需 GPU性价比最高复杂背景、大面积 Logo 再切 LaMa 高质量模式前端透明红画笔标 Mask后端按格式解码、只替换 mask 像素防整图变灰大面积 mask 开自适应半径 中位背景填充 边缘羽化消除灰/黑斑同一份文档先试极速、不满意再升高质量两步切换零成本硬件自适应 CUDA→MPS→CPU 懒加载有卡用卡、无卡用 CPU开箱即用。五、小结去水印的质量红线是只动该动的地方。双引擎 精准 Mask 解码让我们在本地、离线的条件下也能拿到接近商用的修复效果。下期预告单图 / 单 PDF 去水印解决了精准但当资料变成几百张固定位置的扫描件逐张框选就不可行了还绝不允许联网。下一篇讲 AI 批量去水印。标签#去水印 #OpenCV #LaMa #IOPaint #AI修复