去水印工具(Watermark Remover)
去除图片、PDF、Word(.docx)、PPT(.pptx)、视频中水印的通用技能。核心逻辑封装在
scripts/remove_watermark.py(一个不依赖 GUI 的 CLI,输出 JSON 结果,便于自动化
与断言验证)。优先用脚本完成,不要手动用 cv2 现写处理逻辑。
触发时机
- 用户提到“去水印 / 去除水印 / 去掉水印 / remove watermark / 抹掉水印/LOGO”等, 输入为图片、PDF、Word、PPT、视频文件时,本技能适用。
- 用户给的是文件路径(或待处理文件在工作目录/附件目录中)时,直接调用脚本。
- 输入格式不明时先按扩展名自动判断(
--type auto是默认值)。
依赖
运行时需可用:python(>=3.8)、opencv-python-headless、numpy、
PyMuPDF(pymupdf)、lxml(docx/pptx 是 zip+xml,可选)、ffmpeg + ffprobe
(视频混流音频时用;没有 ffmpeg 也能出无声视频)。
安装示例:
python -m pip install opencv-python-headless numpy pymupdf
如缺 ffmpeg:apt-get install -y ffmpeg 或 conda install -c conda-forge ffmpeg。
快速上手
脚本路径:scripts/remove_watermark.py。运行前先确认脚本存在,必要时
pip install 上述依赖。
图片
python scripts/remove_watermark.py 带水印.png -o out.png
python scripts/remove_watermark.py 带水印.png -o out.png --bbox 600,450,780,560
python scripts/remove_watermark.py 带水印.png -o out.png --bbox 10,10,200,90 --method mirror
- 默认自动检测(平铺文字水印 / 角落 LOGO),检测不到会报错并提示用
--bbox。 --method mirror:镜像填充,对角落 LOGO效果通常比 inpaint 好。- 验证效果:
--reference <干净原图>会输出psnr_db,一般 >= 20dB 表示修复质量好。
python scripts/remove_watermark.py 带水印.pdf -o out.pdf --text "内部资料"
python scripts/remove_watermark.py 带水印.pdf -o out.pdf # 自动识别跨页重复文字
- 优先
--text:基于文本层精准删除该文字(保持矢量、体积小)。 - 不传
--text时自动识别“多页重复出现”的文字并按水印删除。 - 若没有可删除的文本水印(比如 PDF 是扫描图+图片水印),自动回退为
“整页栅格化 + 图像去水印 + 重建 PDF”,可用
--bbox指定水印区域提高效果。
Word / PPT
python scripts/remove_watermark.py 带水印.docx -o out.docx
python scripts/remove_watermark.py 带水印.pptx -o out.pptx
python scripts/remove_watermark.py 带水印.docx -o out.docx --text "机密"
- docx:删除页眉/页脚中的
v:shape(behindDoc 文字水印)与页面背景水印。 - pptx:删除幻灯片/母版/版式中内容匹配水印关键词的 shape(文本或名称含
水印/机密/confidential/draft 等)。建议传
--text精确匹配,避免误删正文。
视频
python scripts/remove_watermark.py 带水印.mp4 -o out.mp4 --bbox 20,20,180,60
python scripts/remove_watermark.py 带水印.mp4 -o out.mp4 # 自动检测首帧
python scripts/remove_watermark.py 带水印.mp4 -o out.mp4 --bbox 20,20,180,60 --reference clean.mp4
- 对固定位置水印逐帧 inpaint;有音频时自动用 ffmpeg 保留原音频。
- 建议视频必传
--bbox(水印位置固定时最稳);自动检测只在首帧做,可能漏检。
输出与验证
脚本成功时输出一行 JSON,例如:
{"ok": true, "type": "image", "input": "...", "output": "...",
"kind": "tiled", "mask_area_ratio": 0.02, "psnr_db": 28.4}
kind:tiled(平铺文字水印)/corner(角落水印)/bbox(手动指定)。psnr_db:传--reference时给出,>=20dB 视为修复效果良好。- 输出文件默认
<原名>_nowatermark.<ext>,可用-o覆盖。
注意事项 / 边界
- 诚实评估:自动检测不是万能的。脚本检测不到水印时会直接报错(不会假装成功);
此时改用
--bbox/--text重试,并把失败情况如实告诉用户。 - 对“半透明平铺文字”效果最好;“水印盖住重要内容”的情况,修复后会留下 inpaint 痕迹,需向用户说明这是物理可恢复性的极限,无法做到无损。
- docx/pptx 只改 OOXML 结构,不动正文内容;但若水印被做成普通文本段落,
需要用户提供
--text精确删除。 - 视频逐帧处理较慢:先确认水印区域(首帧截图 + 视觉查看或问用户 bbox)再跑, 避免处理整段视频后发现区域不对。
- 不要处理加密/受密码保护的 PDF、DRM 视频;文件无法打开时报错即可。
- 结果文件必须真实生成并核对存在后再交付;脚本
ok:false时不要谎报成功。
Scan to join WeChat group