顺手处理自己拍的照片:背景里的路人、桌面上的杂物、老照片的划痕,或者自家产品图早期压的旧水印------这些都属于"图像修复(Inpainting)"问题。本文实测两条主流技术路线:OpenCV 内置的 inpainting 传统算法,和近年被广泛采用的 LaMa 深度学习模型,看看它们的原理差异和实际效果边界。(注:请仅处理拥有版权的图片,去除他人版权作品的水印涉嫌违法。)
一、原理:一个在"扩散",一个在"脑补"
OpenCV inpainting 提供两个经典实现:INPAINT_TELEA(Telea,2004,基于快速行进法 FMM)和 INPAINT_NS(基于 Navier-Stokes 流体力学方程)。核心思想一致:把待修复区域边界上已知的像素,沿等照度线(亮度梯度方向)逐步向内扩散、插值。
本质是数学插值:它不知道"这里本来应该是什么",只知道"周围长什么样"。因此对细划痕、窄文字条效果尚可,但面对大块缺失区域,结果就是模糊的色块糊在一起。
LaMa(Large Mask Inpainting,Suvorov 等,2021,arXiv:2109.07161)是生成式模型路线。三个关键设计:
- FFC(快速傅里叶卷积) :普通卷积的感受野是局部的,逐层缓慢扩大;FFC 在频域做卷积,天然具有全图级感受野------修复画面中央的一大块区域时,网络能"看到"整张图的全局结构(比如断掉的栏杆、桌沿的直线走向)。
- 高感受野感知损失:用带空洞卷积的判别器约束修复结果,保证大尺度结构连贯。
- 大遮罩训练:训练时故意遮挡 10%~50% 的大面积区域,逼模型学会真正的语义补全,而不是只会贴邻域纹理。
简单说:OpenCV 在"把边界像素抹进来",LaMa 在"根据语义猜这里本来是什么"。
二、代码实测
环境 :Python 3.10+,pip install opencv-python simple-lama-inpainting
两边的输入都是:原图(3 通道)+ 掩码图(单通道二值图,白色 255 = 待修复区域)。
OpenCV 路线(3 行核心代码):
python
import cv2
img = cv2.imread("photo.jpg")
mask = cv2.imread("mask.png", cv2.IMREAD_GRAYSCALE)
result = cv2.inpaint(img, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
cv2.imwrite("result_cv.jpg", result)
LaMa 路线(simple-lama-inpainting 封装包):
python
from simple_lama_inpainting import SimpleLama
from PIL import Image
lama = SimpleLama() # 首次运行自动下载 big-lama 预训练权重
image = Image.open("photo.jpg")
mask = Image.open("mask.png") # 白色区域将被修复
result = lama(image, mask)
result.save("result_lama.png")
掩码可以用任意画图工具把要消除的区域涂白来制作;生产环境更常见的做法是配合 SAM 等分割模型自动生成掩码,本文不展开。
三、实测结论与选型建议
在细划痕、窄条水印这类小面积、背景简单的场景,两者差距不大,甚至 OpenCV 更快更稳------开源工具 lama-cleaner 的官方文档也明确提到:cv2 无需 GPU,简单背景下结果甚至可能优于 AI 模型。
但大面积遮罩(半透明大水印、完整人物、成片杂物)下分化明显:
| 维度 | OpenCV inpainting | LaMa |
|---|---|---|
| 小划痕/窄区域 | 够用,毫秒级 | 同样优秀 |
| 大面积缺失 | 糊成色块 | 语义级补全(栏杆、直线能接上) |
| 依赖 | 仅 CPU,opencv 一个包 | 需下载预训练权重,CPU 秒级/张 |
| 可解释性 | 数学过程确定 | 生成式,极端场景可能"幻觉" |
| 适用场景 | 批量轻量处理 | 质量敏感的成品图 |
选型结论:背景纯净、区域小 → OpenCV;结构复杂、区域大 → LaMa;拿不准 → 两个都跑一遍对比,成本很低。
四、不想装环境?直接用在线版
上面两条路线都需要本地配置 Python 环境、准备掩码文件。如果只是偶尔处理几张图,可以直接用封装了 LaMa 模型的在线工具------智能便民工具箱的「AI 消除」,浏览器里上传图片、涂抹要消除的区域即可,免费、无需注册:
https://www.itptg.com/tools/magic-eraser.html

总结
OpenCV inpainting 和 LaMa 代表了图像修复的两个时代:前者是确定性的数学扩散,胜在轻量快速;后者是生成式语义补全,胜在大遮罩下的结构连贯。按场景选型,比迷信"AI 一定更好"更务实。
参考 :Suvorov et al., Resolution-robust Large Mask Inpainting with Fourier Convolutions, arXiv:2109.07161;OpenCV Inpainting 文档;simple-lama-inpainting (PyPI)。