基于 OpenCV + Flask 的智能图片去水印 Web 应用,支持手动框选、自动检测和批量处理三种模式,内含 7 种水印检测策略、EAST 深度学习文字检测、FFT 频域分析、LAB 色彩校正。
- 手动框选模式 — 鼠标拖拽选中水印区域,一键去除
- 自动检测模式 — 7 种检测策略加权融合,智能识别水印
- 批量处理模式 — 多张图片一键处理,实时进度展示,结果打包 ZIP 下载
- 平台预设 — 针对抖音、B站、微博、小红书优化检测参数
- AI 文字检测 — 可选下载 EAST 深度学习模型,大幅提升文字水印识别率
- FFT 频域检测 — 通过频域分析检测周期性半透明水印
- LAB 色彩校正 — 修复后自动匹配周围区域颜色,消除色差
- 智能修复 — 羽化迭代修复 + 泊松融合 + 纹理复制 + 边缘羽化,大面积水印也能处理
前往 Python 官网 下载 Python 3.8 ~ 3.12(建议 3.10 或 3.11)。
安装时 务必勾选 "Add Python to PATH",然后点 Install Now。
验证安装:
python --version
# 输出类似 Python 3.11.9 即成功方式一:用 Git 克隆
git clone https://github.com/你的用户名/watermark-remover.git
cd watermark-remover方式二:直接下载 ZIP
- 在 GitHub 仓库页面点绿色 Code 按钮 → Download ZIP
- 解压到任意目录,用终端进入该目录
pip install -r requirements.txt如果网络慢,可以用国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplepython app.py看到以下输出说明启动成功:
==================================================
[v4] Image Watermark Remover
Platforms: Douyin / Bilibili / Weibo / Xiaohongshu / General
AI Model: NOT DOWNLOADED (download from web UI)
URL: http://localhost:5000
==================================================
浏览器打开 http://localhost:5000 即可使用。
在页面顶部点击「下载 AI 模型 (~90MB)」按钮,等待下载完成。模型存放于 models/ 目录,下载一次后续自动加载。
以下以 Ubuntu 20.04/22.04 为例,CentOS 把 apt 换成 yum 即可。
sudo apt update
sudo apt install -y python3 python3-pip python3-venv gitgit clone https://github.com/你的用户名/watermark-remover.git
cd watermark-removerpython3 -m venv venv
source venv/bin/activatepip install -r requirements.txtOpenCV 的
cv2.dnn模块需要系统有 GUI 库支持。如果服务器无桌面环境,安装 headless 版本:pip install opencv-python-headless>=4.8.0
python app.py浏览器访问 http://服务器IP:5000,确认能正常打开。
方式 A:systemd 服务(推荐)
创建服务文件:
sudo tee /etc/systemd/system/watermark.service << 'EOF'
[Unit]
Description=Watermark Remover Web App
After=network.target
[Service]
User=www-data
WorkingDirectory=/opt/watermark-remover
ExecStart=/opt/watermark-remover/venv/bin/python app.py
Restart=always
RestartSec=5
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
EOF把项目放到 /opt/watermark-remover,确保权限正确:
sudo cp -r watermark-remover /opt/
sudo chown -R www-data:www-data /opt/watermark-remover启动服务:
sudo systemctl daemon-reload
sudo systemctl enable watermark
sudo systemctl start watermark
sudo systemctl status watermark方式 B:nohup 简单后台运行
nohup python app.py > app.log 2>&1 &Nginx 反向代理配置
sudo apt install -y nginx创建配置文件:
sudo tee /etc/nginx/sites-available/watermark << 'EOF'
server {
listen 80;
server_name your-domain.com; # 换成你的域名或 IP
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF启用配置并重启 Nginx:
sudo ln -s /etc/nginx/sites-available/watermark /etc/nginx/sites-enabled/
sudo nginx -t # 检查配置语法
sudo systemctl restart nginx现在通过 http://your-domain.com 即可访问。
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com按提示操作即可自动配置 HTTPS + 自动续期。
适合已知水印位置的情况:
- 点击「📁 上传图片」或直接拖拽图片到页面
- 确认当前为「✏️ 手动框选」模式(默认)
- 在图片上按住鼠标左键拖拽,画出水印所在的矩形区域(红色虚线框)
- 可以画多个选区,支持「↩️ 撤销」和「🗑️ 清除选区」
- 点击「🚀 去除水印」,等待处理完成
- 右侧显示结果,点击「💾 下载」保存
适合不确定水印位置的情况:
- 点击「📁 上传图片」或拖拽图片
- 点击切换到「🔍 自动检测」模式
- 选择 平台(抖音 / B站 / 微博 / 小红书 / 通用),不同平台的水印位置和样式不同,选对平台检测更准
- 调整 灵敏度(1-10),默认 5。值越大检测越激进,可能误检更多;值越小越保守
- 勾选 🤖 AI 检测(需先下载 AI 模型),可显著提升文字水印的检测精度
- 点击「🚀 去除水印」
- 处理完成后可点击「👁️ 显示检测区域」查看 AI 检测到了哪些区域
适合一次去除多张图片水印的情况:
- 点击切换到「📦 批量处理」模式
- 拖拽多张图片到上传区域,或点击「点击选择文件」多选图片(支持 JPG / PNG / WEBP)
- 选择 平台、调整 灵敏度、决定是否启用 AI 检测(与自动模式相同)
- 点击「🚀 开始批量处理」
- 文件列表实时显示每张图片的处理状态:⏳等待中 → 🔄处理中 → ✅完成 / ❌失败
- 顶部进度条显示整体进度
- 处理完成后点击「📦 全部下载 (ZIP)」打包下载所有结果
- 也可以点击右侧结果网格中的单张图片单独下载
- 如果有失败的图片,修改设置后点击「🔄 重新处理失败项」可只重试失败的
提示:批量处理串行执行每张图片,大图可能需要几秒。处理过程中可随时点「⏹ 停止」中断。
| 灵敏度 | 效果 |
|---|---|
| 1-3 | 保守检测,只识别最明显的水印,适合水印清晰的图片 |
| 4-6 | 均衡模式,大多数场景适用 |
| 7-10 | 激进检测,能发现微弱水印,但可能误伤图片细节 |
自动检测模式使用 7 种策略并行检测,加权融合后生成最终水印 mask:
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 平台专属 | HSV 颜色筛选 + 角落区域定位 | 已知平台的固定水印样式(抖音/微博等) |
| 透明文字 | 高通滤波 + 自适应阈值 + 颜色过滤 | 半透明叠加水印 |
| MSER | 最稳定极值区域检测 + 连通域分析 | 任意位置的文字水印 |
| 频域分析 | 拉普拉斯算子 + 低饱和度区域 | 边缘锐利的叠加水印 |
| FFT 频域 | DFT 频谱分析 + 异常频率峰值检测 | 周期性半透明水印(如满屏斜纹水印) |
| 底部横条 | Sobel 梯度 + 横向形态学 | 底部版权横条(抖音/小红书) |
| AI-EAST | 深度学习文字区域检测 + 角落过滤 | 复杂背景下的文字水印 |
水印检测完成后,根据 mask 面积自动选择最优修复策略:
| 面积占比 | 策略 | 说明 |
|---|---|---|
| < 2% | NS inpaint + 边缘羽化 | 小面积文字水印,Navier-Stokes 方法边缘更平滑 |
| 2% ~ 15% | 羽化迭代修复 + 泊松融合 | 多轮递减半径 inpaint,每轮羽化混合消除接缝 |
| > 15% | 分块多尺度 + 纹理复制 + 泊松融合 | 低分辨率粗修复 → 纹理填充 → 分块精细修复 → 泊松融合 |
每种策略最后都会经过:
- 边缘羽化 — 距离变换生成渐变 alpha,消除修复区域和原图的接缝
- 泊松融合 —
cv2.seamlessClone保持梯度连续,匹配边界颜色 - LAB 色彩校正 — 将修复区域的亮度/色彩分布匹配到周围区域,消除色差
| 层级 | 技术 |
|---|---|
| 后端 | Python 3 / Flask |
| 图像处理 | OpenCV (inpaint / seamlessClone / MSER / DNN / distanceTransform) |
| 频域分析 | NumPy FFT / OpenCV DFT |
| 色彩校正 | OpenCV BGR↔LAB 色彩空间转换 |
| AI 模型 | EAST 文字检测 (TensorFlow frozen graph, ~90MB) |
| 前端 | 原生 HTML / CSS / JavaScript (Canvas API) |
| 批量下载 | JSZip (客户端 ZIP 打包) |
watermark-remover/
├── app.py # Flask 后端,包含所有检测和修复算法(~1100 行)
├── requirements.txt # Python 依赖
├── LICENSE # MIT 开源协议
├── README.md # 项目说明(本文件)
├── UPLOAD_GUIDE.md # 项目上传 GitHub 教程
├── templates/
│ └── index.html # 页面模板
├── static/
│ ├── style.css # 样式
│ └── app.js # 前端交互逻辑(含批量处理)
├── uploads/ # 上传文件临时目录(自动创建,已 gitignore)
└── models/ # AI 模型存放目录(自动创建,已 gitignore)
┌─────────────┐ ┌──────────────────────────────────┐
│ 上传图片 │────→│ 7 种检测策略并行运行 │
└─────────────┘ │ ① 平台专属 ② 透明文字 ③ MSER │
│ ④ 频域分析 ⑤ FFT频域 ⑥ 底部横条│
│ ⑦ AI-EAST │
└──────────┬───────────────────────────┘
▼
┌──────────────────────┐
│ 加权融合 + 自适应阈值 │
│ + 噪点清理 + mask膨胀 │
└──────────┬───────────┘
▼
┌──────────────────────┐
│ 根据面积选修复策略 │
│ NS/羽化迭代/分块多尺度│
└──────────┬───────────┘
▼
┌──────────────────────┐
│ 边缘羽化 + 泊松融合 │
│ + LAB 色彩校正 │
└──────────┬───────────┘
▼
┌─────────────┐
│ 输出结果 │
└─────────────┘
Q: 处理后图片模糊怎么办? A: 水印区域越大,修复效果越难保证。尝试用手动模式精确框选水印文字部分,而不是整个水印区域。大面积水印建议分多次小区域处理。
Q: 自动检测没找到水印? A: 试试调高灵敏度,或切换到正确的平台预设。如果水印是半透明叠加的,FFT 策略可能更有效;如果是纯色文字,勾选 AI 检测效果更好。
Q: 检测到了但修复后有色差? A: 已内置 LAB 色彩校正。如果仍有轻微色差,可能是因为水印覆盖了复杂纹理区域,可以尝试手动框选更精确的区域重新处理。
Q: AI 模型下载失败?
A: 模型托管在 GitHub(~90MB),国内网络可能较慢。可以手动下载后放到 models/frozen_east_text_detection.pb:
wget -O models/frozen_east_text_detection.pb https://github.com/oyyd/frozen_east_text_detection.pb/raw/master/frozen_east_text_detection.pbQ: 批量处理时某张图片失败了? A: 修改设置后点击「🔄 重新处理失败项」可只重试失败的图片,已完成的不会重复处理。
Q: 能处理视频水印吗?
A: 当前版本只支持图片。可以写脚本用 ffmpeg 拆帧 → 调用 /auto-detect API → 重新合成视频。
MIT License