如何用fft npainting lama移除图片物品?详细步骤+代码实例
1. 引言:图像修复技术的应用背景
在数字图像处理领域,图像修复(Image Inpainting)是一项关键任务,旨在通过算法自动填充图像中被遮挡或需要移除的区域,使修复后的图像在视觉上自然连贯。近年来,基于深度学习的图像修复方法取得了显著进展,其中LaMa(Large Mask Inpainting)因其对大范围缺失区域的优秀修复能力而受到广泛关注。
本文将围绕一个基于FFT + npainting + LaMa的二次开发项目展开,详细介绍如何使用该系统实现图像中物品的智能移除。该项目由开发者“科哥”进行WebUI封装与功能优化,极大降低了使用门槛,适合工程落地和快速应用。
本教程属于实践应用类文章,涵盖环境部署、操作流程、核心原理简析及可运行代码示例,帮助读者从零开始掌握图像修复系统的使用与扩展。
2. 系统架构与技术选型
2.1 核心技术栈解析
该项目融合了多种图像处理与深度学习技术:
- LaMa 模型:基于傅里叶卷积(Fourier Convolution)的生成式修复网络,擅长处理大面积缺失。
- FFT 预处理机制:利用快速傅里叶变换增强纹理结构信息,提升修复质量。
- npainting 后处理模块:自定义后处理逻辑,用于边缘平滑与颜色校正。
- Gradio WebUI:提供可视化交互界面,支持画笔标注、实时预览与一键修复。
2.2 为何选择此方案?
| 方案 | 优势 | 局限性 |
|---|---|---|
| OpenCV 基于PatchMatch | 轻量、无需GPU | 仅适用于小区域修复 |
| DALL·E 或 Stable Diffusion | 创造性强 | 易引入不合理内容 |
| LaMa (本方案) | 结构保持好、边缘自然 | 需要较高算力 |
结论:LaMa 在保持原始图像结构一致性方面表现优异,特别适合用于水印去除、物体移除等真实场景。
3. 环境部署与服务启动
3.1 准备工作
确保服务器满足以下条件:
- 操作系统:Linux(Ubuntu/CentOS)
- Python 版本:3.8+
- GPU:NVIDIA 显卡(推荐 ≥ 8GB 显存)
- 安装依赖:CUDA、PyTorch、Gradio、OpenCV
3.2 克隆并配置项目
git clone https://github.com/kege/cv_fft_inpainting_lama.git cd cv_fft_inpainting_lama pip install -r requirements.txt3.3 启动 WebUI 服务
执行启动脚本:
bash start_app.sh成功启动后输出如下提示:
===================================== ✓ WebUI已启动 访问地址: http://0.0.0.0:7860 本地访问: http://127.0.0.1:7860 按 Ctrl+C 停止服务 =====================================此时可通过浏览器访问http://<服务器IP>:7860进入图形化操作界面。
4. 图像修复操作全流程
4.1 上传待修复图像
支持三种方式上传图像:
- 点击上传区选择文件
- 拖拽图像至上传区域
- 复制图像后粘贴(Ctrl+V)
支持格式:PNG、JPG、JPEG、WEBP
建议分辨率不超过 2000×2000,以保证处理效率。
4.2 标注修复区域(Mask 绘制)
使用左侧工具栏中的画笔工具进行区域标注:
- 白色区域表示需要修复的部分
- 可调节画笔大小以适应不同尺寸目标
- 若误标,可用橡皮擦工具清除
技巧:为避免边缘残留,建议将标注范围略大于实际需移除区域,系统会自动羽化过渡。
4.3 执行图像修复
点击"🚀 开始修复"按钮,后台将执行以下流程:
- 图像预处理(BGR→RGB转换、归一化)
- FFT 特征提取(增强频域结构信息)
- LaMa 模型推理(生成填补内容)
- npainting 后处理(颜色匹配、边缘融合)
处理时间根据图像大小通常为 5–60 秒。
4.4 查看与保存结果
修复完成后,右侧显示修复结果,并在状态栏提示:
完成!已保存至: /root/cv_fft_inpainting_lama/outputs/outputs_20260105142312.png用户可前往该路径下载图像,或通过前端直接另存为本地文件。
5. 核心代码实现解析
5.1 图像修复主函数
以下是简化版的核心推理代码片段,位于inference.py中:
import cv2 import numpy as np import torch from models.lama import LaMaModel from utils.fft_processor import apply_fft_enhancement def inpaint_image(image_path, mask_path, output_path): # 读取图像与掩码 image = cv2.imread(image_path) mask = cv2.imread(mask_path, 0) # BGR to RGB image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 归一化 image = image.astype(np.float32) / 255.0 mask = (mask > 128).astype(np.float32) # FFT 增强(保留高频结构) enhanced_image = apply_fft_enhancement(image, mask) # 转换为张量 image_tensor = torch.from_numpy(enhanced_image).permute(2, 0, 1).unsqueeze(0) mask_tensor = torch.from_numpy(mask).unsqueeze(0).unsqueeze(0) # 加载模型并推理 model = LaMaModel(config="config/lama.yaml") model.load_state_dict(torch.load("weights/big-lama.pt")) model.eval() with torch.no_grad(): result_tensor = model(image_tensor, mask_tensor) # 后处理 result = result_tensor.squeeze().permute(1, 2, 0).cpu().numpy() result = np.clip(result * 255, 0, 255).astype(np.uint8) # 保存结果 result_bgr = cv2.cvtColor(result, cv2.COLOR_RGB2BGR) cv2.imwrite(output_path, result_bgr) return output_path代码说明:
- 使用
apply_fft_enhancement提升纹理连续性 - 掩码二值化处理确保输入规范
- 模型输出经 Clip 和类型转换后保存
5.2 FFT 增强模块实现
# utils/fft_processor.py import numpy as np def apply_fft_enhancement(image, mask): """ 利用FFT在频域增强图像结构,辅助修复 """ # 转换到频域 fft_img = np.fft.fft2(image, axes=(0, 1)) fft_shift = np.fft.fftshift(fft_img, axes=(0, 1)) # 构建低通滤波器(保留中心低频) h, w = image.shape[:2] center_h, center_w = h // 2, w // 2 Y, X = np.ogrid[:h, :w] dist_from_center = (X - center_w)**2 + (Y - center_h)**2 mask_freq = dist_from_center <= (min(h, w) // 4)**2 # 应用滤波 fft_shift_filtered = fft_shift * mask_freq[..., None] # 逆变换回空间域 fft_unshift = np.fft.ifftshift(fft_shift_filtered, axes=(0, 1)) filtered_image = np.fft.ifft2(fft_unshift, axes=(0, 1)).real # 融合原图与滤波结果(加强结构) enhanced = image * 0.7 + filtered_image * 0.3 return np.clip(enhanced, 0, 1)作用:通过保留低频成分并抑制噪声,使修复区域更符合整体图像的频率分布特征。
6. 实际应用场景演示
6.1 场景一:去除水印
操作流程:
- 上传带有角标水印的图片
- 使用中号画笔完整涂抹水印区域
- 点击“开始修复”
- 观察背景纹理是否自然延续
效果评估:对于纯色或简单纹理背景,修复效果极佳;复杂图案下可能需微调。
6.2 场景二:移除行人或车辆
挑战点:
- 目标占据较大面积
- 背景存在透视变化
应对策略:
- 分块多次修复
- 每次修复后重新上传中间结果
- 结合裁剪功能聚焦局部
6.3 场景三:修复老照片划痕
优势体现:
- 小面积瑕疵可精准定位
- LaMa 能学习周围像素模式进行合理填充
- 支持批量处理历史影像资料
7. 使用技巧与性能优化
7.1 提高修复质量的关键技巧
- 精确标注:避免遗漏边缘,防止出现“半修复”现象
- 适度扩大mask:让系统有足够上下文进行推断
- 分步修复:对多个独立区域逐个处理,避免干扰
- 优先使用PNG:减少压缩伪影影响
7.2 性能优化建议
| 优化方向 | 措施 |
|---|---|
| 内存占用 | 使用FP16精度推理model.half() |
| 推理速度 | 启用TensorRT加速(需额外编译) |
| 多图处理 | 批量加载时限制并发数 ≤ 3 |
| 缓存机制 | 对重复风格图像缓存特征 |
8. 常见问题与解决方案
| 问题 | 原因分析 | 解决方法 |
|---|---|---|
| 修复后颜色偏暗 | BGR/RGB通道错误 | 检查色彩空间转换逻辑 |
| 边缘明显痕迹 | mask边界太硬 | 扩大标注范围,启用羽化 |
| 处理卡住无响应 | 显存不足 | 降低图像分辨率或启用CPU fallback |
| 输出文件未生成 | 权限不足 | 检查/outputs目录写权限 |
| WebUI无法访问 | 端口未开放 | 配置防火墙规则放行7860端口 |
9. 总结
9.1 实践经验总结
本文详细介绍了基于FFT + npainting + LaMa的图像修复系统在实际项目中的部署与使用方法。通过 Gradio 封装的 WebUI 界面,非技术人员也能轻松完成图像去水印、物体移除等任务。
核心价值体现在:
- 易用性:图形化操作,无需编程基础
- 高质量修复:LaMa 模型保障结构完整性
- 可扩展性强:开源代码便于二次开发
9.2 最佳实践建议
- 先小试再放大:首次使用建议从小图测试起,验证效果后再处理正式数据。
- 保留原始文件:所有操作均为不可逆修改,务必备份源图。
- 结合人工校验:自动修复虽强大,仍需人工检查细节合理性。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。