提示: 请先上传图片,然后使用笔刷工具涂抹水印区域,最后点击"开始AI修复"进行处理。
使用说明:
- 上传包含水印的图片
- 选择笔刷工具,调整笔刷大小
- 在图片上涂抹水印区域(红色区域表示选中的水印)
- 可以使用橡皮擦工具擦除误选的区域
- 点击"开始AI修复"使用 DeepFill v2 模型进行智能修复
- 查看修复结果并下载
点击或拖拽上传图片
支持 JPG、PNG 格式,建议图片大小不超过 2048x2048px
🔬 算法原理与步骤详解
1. DeepFill v2 深度学习算法
核心思想:上下文感知的图像修复
DeepFill v2 是一种基于深度学习的图像修复算法,它能够理解图像的整体上下文,智能地填充缺失区域。
步骤 1:特征提取
使用卷积神经网络(CNN)从输入图像中提取多层次的视觉特征,包括:
- 低级特征:边缘、线条、颜色
- 中级特征:纹理、形状、模式
- 高级特征:语义信息、物体识别
步骤 2:ExtractImagePatches(局部区域提取)
这是 DeepFill v2 的关键步骤:
- 从图像的已知区域提取多个局部区域(patches)
- 每个 patch 是一个固定大小的图像块(如 32×32 像素)
- 这些 patches 包含了图像的纹理、颜色和结构信息
技术细节:
ExtractImagePatches 操作符从输入图像中提取不重叠的固定大小区域。 例如,从 512×512 的图像中提取 32×32 的 patches,可以得到多个候选区域。 这些 patches 用于后续的相似度计算和内容选择。
ExtractImagePatches 操作符从输入图像中提取不重叠的固定大小区域。 例如,从 512×512 的图像中提取 32×32 的 patches,可以得到多个候选区域。 这些 patches 用于后续的相似度计算和内容选择。
步骤 3:注意力机制
使用注意力机制找到最相关的 patches:
- 计算每个 patch 与缺失区域的相似度
- 相似度基于特征向量的距离(如余弦相似度)
- 选择相似度最高的 patches 作为修复参考
步骤 4:内容生成
基于选中的 patches 生成修复内容:
- 使用生成对抗网络(GAN)生成新的图像内容
- 确保生成的内容与周围区域自然融合
- 保持颜色、纹理和光照的一致性
完整工作流程:
输入图像 + 掩码 →
特征提取网络 →
ExtractImagePatches →
注意力计算 →
内容生成网络 →
输出修复图像
⚠️ 兼容性说明:
DeepFill v2 模型包含 ExtractImagePatches 操作符,但 ONNX Runtime Web(浏览器版本)不支持此操作符。 如果模型加载失败,系统会自动切换到 OpenCV 传统算法。
DeepFill v2 模型包含 ExtractImagePatches 操作符,但 ONNX Runtime Web(浏览器版本)不支持此操作符。 如果模型加载失败,系统会自动切换到 OpenCV 传统算法。
2. OpenCV 传统修复算法(Navier-Stokes)
当 AI 模型不可用时,系统会自动使用 OpenCV 的传统修复算法作为回退方案。
Navier-Stokes 算法原理
该算法基于流体动力学的 Navier-Stokes 方程,将图像修复问题转化为偏微分方程求解:
步骤 1:边界检测
识别缺失区域的边界,确定需要修复的像素点。
步骤 2:等照度线传播
从已知区域向缺失区域传播等照度线(相同亮度的曲线),保持图像的光照连续性。
步骤 3:颜色插值
使用拉普拉斯算子进行颜色插值,确保修复区域与周围区域平滑过渡。
步骤 4:迭代优化
通过多次迭代优化,逐步填充缺失区域,直到达到收敛条件。
数学公式(简化):
其中 I 是图像强度,Δ 是拉普拉斯算子。
这个方程确保修复区域的光照变化最小,从而产生平滑的修复结果。
ΔI = 0 (拉普拉斯方程)其中 I 是图像强度,Δ 是拉普拉斯算子。
这个方程确保修复区域的光照变化最小,从而产生平滑的修复结果。
算法流程:
输入图像 + 掩码 →
边界检测 →
等照度线传播 →
颜色插值 →
迭代优化 →
输出修复图像
3. 算法对比
| 特性 | DeepFill v2 (AI) | OpenCV Navier-Stokes |
|---|---|---|
| 算法类型 | 深度学习(GAN) | 传统算法(偏微分方程) |
| 修复效果 | ⭐⭐⭐⭐⭐ 优秀(理解语义) | ⭐⭐⭐ 良好(平滑过渡) |
| 处理速度 | 较慢(需要 GPU 加速) | 较快(CPU 即可) |
| 适用场景 | 复杂纹理、大区域修复 | 小区域、简单纹理修复 |
| 浏览器兼容性 | ⚠️ 可能不兼容(ExtractImagePatches) | ✅ 完全兼容 |
| 资源需求 | 高(模型文件较大) | 低(无需模型) |
4. 完整工作流程
阶段 1:图像预处理
- 用户上传图片
- 系统加载图片到 Canvas
- 初始化 OpenCV Mat 对象(用于图像处理)
- 创建掩码画布(用于标记修复区域)
阶段 2:区域选择
- 用户使用笔刷工具涂抹水印区域
- 系统实时更新掩码(红色半透明显示)
- 同步更新 OpenCV 掩码矩阵
- 检查是否有足够的选区(启用修复按钮)
阶段 3:模型加载(智能选择)
- 尝试加载 DeepFill v2 AI 模型
- 如果失败(ExtractImagePatches 不兼容),尝试加载 LaMa 模型
- 如果都失败,启用 OpenCV 传统算法回退
- 显示当前使用的算法(按钮文本会更新)
阶段 4:图像修复
如果使用 AI 模型:
- 预处理图像:转换为模型输入格式(归一化、调整尺寸)
- 预处理掩码:转换为单通道二值掩码
- 模型推理:运行 ONNX 模型进行修复
- 后处理:将模型输出转换回图像格式
如果使用 OpenCV 传统算法:
- 调用
cv.inpaint()函数 - 使用 Navier-Stokes 算法(
cv.INPAINT_NS) - 迭代优化直到收敛
- 输出修复结果
阶段 5:结果展示
- 将修复结果绘制到输出画布
- 显示原始图片和修复后图片的对比
- 显示处理统计信息(尺寸、时间、选区像素)
- 提供下载功能
5. 技术实现细节
图像预处理(AI 模型)
输入格式转换:
Canvas ImageData →
OpenCV Mat (BGR, 8UC3) →
Float32Array (RGB, 归一化到 [0,1]) →
ONNX Tensor [1, 3, H, W]
掩码预处理
掩码格式:
Canvas ImageData (RGBA) →
OpenCV Mat (单通道, 8UC1) →
Float32Array (归一化到 [0,1]) →
ONNX Tensor [1, 1, H, W]
后处理
输出格式转换:
ONNX Tensor [1, 3, H, W] →
Float32Array →
反归一化 (×255) →
Canvas ImageData (RGBA) →
显示在 Canvas
执行后端
ONNX Runtime 后端优先级:
1.
2.
3.
1.
WASM - WebAssembly 后端(操作符支持最好)2.
WebGL - GPU 加速(如果支持)3.
CPU - CPU 后端(最后备选)
6. 性能优化策略
- 图像尺寸限制:自动调整到 800×600 以内,减少计算量
- 模型量化:使用量化模型(如果可用)减少内存占用
- 异步处理:所有操作都是异步的,不阻塞 UI
- 智能回退:自动选择最快的可用算法
- 缓存优化:Canvas 上下文使用
willReadFrequently优化