AI图片去水印 · 像素级验证版
去AI生成图(豆包/即梦/Kolors等)角落的"XXAI生成"白色/半透明角标水印。核心卖点:像素级验证不自我欺骗、双信号交叉定位抗幻觉、多候选客观指标投票覆盖——别人只会"调AI修图然后肉眼说好了",这套是算出来的。
适用场景
- AI生成图角落的"XXAI生成"白字/半透明角标(豆包/即梦/Kolors等)
- 水印压在相对均匀背景上(平整色块/天空/海水/渐变)
- 水印在画面角落而非主体上
完整链路(接力链降错误相关性)
去水印是一条四跳接力链:定位 → 采样背景 → 覆盖 → 验证。每跳独立只错一点,多跳后正确率急剧衰减;同源方法会一起栽同一个坑。彻底版 = 关键节点单独加校验 + 跨原理信号交叉 + 多候选投票。
① 定位(两信号交叉,必须不同原理)
- 信号A 网格放大法:候选区放大画 10x10 红色网格(标 x0-x9/y0-y9),让视觉模型只报"水印在 x几-x几,y几-y几"——只信格子范围,不信它的百分比/像素描述,换算回原图坐标后再像素精扫。
- 信号B 像素密度聚类:不做任何依赖视觉模型的像素分析。白色/半透明色(r>180,g>180,b>180,半透明降到140-150)按行求和找文字密集行段,连续列白像素>3找文字 x 范围。
- A、B都要定位到才锁定水印区域;只有A或只有B → 重新审视,别急着覆盖(跨原理交叉,避免同一视觉模型一起栽坑)。
- 水印可能在角落(如蓝色海水区)而非主体——先全图扫白色/半透明像素密集簇再定坐标。
② 覆盖(多候选投票,不拍脑袋)
生成多个候选人,用客观指标投票选最优:
- 候选1:水印正上方(或左侧)同宽背景条带,垂直拉伸到水印区域(LANCZOS)——复杂背景最自然
- 候选2:左侧/四周均值色填充 + mask 高斯羽化边缘(GaussianBlur 2px)——均匀背景
- 候选3:多向插值
- 投票指标:区域纹理连续性(边缘梯度)+ 颜色统计方差 + 与周围像素欧氏距离。指标最优者胜出,不靠"我觉得哪个好"。
- 覆盖区域加 pad 6-8px,防文字边缘残留。
③ 验证(像素级裁决,隔离视觉误报)
- 像素级 ground truth 跑
scripts/verify_watermark_removed.py:比较原图 vs 处理图在目标区域白色像素数。原图 856 → 处理 2 = 清除✅ - 视觉模型不参与裁决,只报粗定位。它"还有水印"的误报(复杂背景白毛发/水花/火焰亮区)被像素diff隔离在节点外,不拖延进度。
- 残留判断:目标区处理图白色 < 原图 5% 即视为清除。
整链(当分布式系统管)
- 每跳输入输出定死:bbox 字典 / 候选列表 / 指标,可单独测试复原。
- 端到端看:成功率(像素达标率)+ 成本(轮次)+ 可排查性,跟单跳基线比——收益扣掉税仍是正,才真上线。
关键坑(实战踩过)
- 视觉模型会幻觉"还有水印":复杂背景(白色毛发/水花/火焰亮区)下反复误报"右下角有豆包AI生成",即使像素级证明已清除。像素 diff 才是裁决者——数值达标后别被视觉模型带着重做。
- 视觉模型说"右下角"可能指整个右下 1/4 区域,精确坐标必须靠像素分析(行/列白色密度聚类)。
- 画面本身亮色(老虎白毛/瀑布白浪)会干扰白色检测——"原图白且处理图也白"遍布全图时,那不是水印是画面内容。
- 背景复杂时上方背景拉伸覆盖比纯色更自然;纯色只用于均匀背景(如海水)。
- 验证残留判断:目标区域处理图白色 < 原图 5% 即视为清除。
脚本
scripts/verify_watermark_removed.py— 像素级验证水印是否清除(原图vs处理图白色像素对比)
依赖
- Python 3,
PIL+numpy(pip install pillow numpy)
局限(诚实告知)
- 覆盖这环用"周围像素拉伸/均值"填,本质是伪修复。水印若压住真实内容(人脸/产品logo/复杂纹理),覆盖会失真——需接真·AI修复(inpainting/Lama)。
- 本 skill 擅长:AI生成图角标、相对均匀背景、像素级兜底验证。定位+验证最硬。
🙋 关于作者
九品锦锂e | 把踩过的坑封装成"拿来就能跑"的 skill,不写教科书。
这个 skill 是我自己每天在用的版本。用的时候卡住了、想要进阶玩法、或者有别的场景想让我封装成 skill,直接加我微信说,加时备注「SkillHub」我优先通过:

扫码添加作者微信 · 备注「SkillHub」优先通过