图像修复技术与应用 - 从经典方法到深度学习
什么是图像修复 - 填充缺失区域的技术
图像修复(Inpainting)是自动填充图像中缺失或损坏区域的技术,使填充结果与周围内容自然融合。
应用场景:
- 物体移除:从照片中移除不需要的物体(路人、电线、垃圾桶),自然填充背景
- 照片修复:修复老照片的划痕、折痕、水渍等损伤
- 水印移除:去除图像上的水印或文字叠加
- 图像编辑:移除遮挡物后填充被遮挡的内容
- 视频修复:去除视频中的 Logo、字幕或移动物体
技术挑战:填充区域需要在纹理、结构和语义上与周围一致。小区域修复相对容易,大面积缺失需要理解场景语义才能生成合理内容。
输入与输出:输入 1 是待修复的图像 (包含缺失区域),输入 2 是掩码图像 (用白色指定需要修复的区域),输出是缺失区域被自然填充后的图像。
技术难点:图像修复本质上是一个不良设定问题 (ill-posed problem)。修复几个像素的细小划痕相对容易,但修复大面积区域 (超过图像的 20%) 非常困难,需要对画面语义的理解。
方法分类:基于扩散的方法把周围的像素值向缺失区域扩散 (Navier-Stokes、Telea);基于块的方法在图像内部搜索相似的块并复制过来 (PatchMatch、Criminisi);基于深度学习的方法用神经网络生成语义上一致的内容 (Partial Conv、LaMa)。根据修复区域的大小与内容的复杂程度选择合适的方法非常重要。
经典扩散方法 - 从边缘向内传播
扩散方法将已知区域的信息沿等照度线(isophote)向缺失区域内部传播。适合修复细小的划痕和裂缝。
代表算法:
- Bertalmio 方法(2000):沿等照度线方向传播信息,模拟画家修复壁画的过程
- Navier-Stokes 方法:将图像修复类比为流体力学,用 Navier-Stokes 方程描述信息传播
- 快速行进法(FMM):从边界开始,按距离顺序逐像素填充。速度快但质量一般
特点:
- 适合细小缺失(划痕、细线):边缘信息足以指导填充
- 不适合大面积缺失:无法生成新的纹理或结构
- 计算简单,可实时处理
OpenCV:cv2.inpaint(img, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
两种经典实现:Navier-Stokes 法 (cv2.INPAINT_NS) 由 Bertalmio et al. (2001) 提出,灵感来自流体力学的 Navier-Stokes 方程;Telea 法 (cv2.INPAINT_TELEA) 由 Alexandru Telea (2004) 提出,是基于快速行进法 (FMM, Fast Marching Method) 的方法。
OpenCV 中的写法:result = cv2.inpaint(img, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)。其中 inpaintRadius 是修复每个像素时参考的邻域半径 (像素),一般取 3-5;取值越大结果越平滑,但处理时间也随之增加。
性能对比:对 1,920 × 1,080 的图像、掩码面积 1% 时,Telea 法约 50ms,NS 法约 200ms。质量方面,NS 法在保持边缘上更好,Telea 法在均匀区域的修复上更好。掩码面积超过 5% 时,两种方法的质量都会急剧下降,得到模糊的结果。
基于块的方法 - 从图像中借用纹理
基于块(Patch-based)的方法从图像的已知区域搜索相似的纹理块,复制到缺失区域。可处理较大的缺失。
代表算法:
- Criminisi 方法(2004):基于优先级的块填充。优先填充结构边缘处的块(保持结构连续性),再填充纹理区域
- PatchMatch(2009):快速近似最近邻搜索算法。随机初始化 + 传播 + 随机搜索,极快地找到最佳匹配块
Photoshop 的「内容感知填充」就是基于 PatchMatch 的改进版本。
优势:
- 可生成逼真的纹理(从图像自身借用)
- 处理中等大小的缺失效果好
- 不需要训练数据
局限:
- 无法生成图像中不存在的内容(如被遮挡的人脸)
- 大面积缺失时可能产生重复纹理伪影
- 对结构复杂区域(如建筑透视线)的连续性保持不够好
处理步骤:(1) 计算边界像素的优先级 (置信度 × 数据项)。(2) 以优先级最高的像素为中心设定一个块 (9x9 左右)。(3) 用 SSD (Sum of Squared Differences) 在已知区域中搜索最相似的块。(4) 把找到的块的对应部分复制到缺失区域。(5) 更新边界后重复。这类方法对纹理的再现能力强,对中等大小的缺失区域 (图像的 5-15%) 能生成高质量结果。
PatchMatch (2009):Barnes et al. 提出的快速近似最近邻块搜索算法。随机初始化为每个块分配随机偏移;传播把邻接块的好匹配传递给自身 (利用好匹配在空间上倾向于连续的性质);随机搜索则在当前匹配的周围以指数方式缩小范围进行探索。通常 5-6 次迭代即收敛,能以全搜索的 100-1000 倍速度找到近似最近邻。
性能:1,920 × 1,080 图像、掩码面积 10% 时约 2-5 秒 (CPU);GPU 实现可加速到 200-500ms。
深度学习修复 - 语义理解与生成
深度学习方法通过大量图像训练,学习场景的语义结构,可以生成缺失区域中合理的新内容。
代表模型:
- DeepFill v2:门控卷积处理不规则掩码,上下文注意力从远处区域借用特征
- LaMa(2022):大掩码修复的突破。使用快速傅里叶卷积(FFC)获得全局感受野,处理大面积缺失效果出色
- MAT(2022):基于 Transformer 的修复。多头注意力理解全局语义关系
- Stable Diffusion Inpainting:利用扩散模型的生成能力,可生成高度逼真的填充内容
训练策略:
- 随机生成掩码(矩形、不规则形状、笔刷形状)覆盖正常图像
- 网络学习从被遮挡的图像恢复原始内容
- 损失函数:像素损失 + 感知损失 + 对抗损失 + 风格损失
Partial Convolution (2018):NVIDIA 提出的方法,使用一种忽略掩码区域的特殊卷积运算。普通 CNN 会受到掩码区域零值的影响,而 Partial Conv 只用有效像素做归一化卷积,从而抑制掩码边界处的伪影。Gated Convolution (2019) 是 Partial Conv 的改进,通过可学习的门控机制动态判断每个像素的有效性。
LaMa (Large Mask Inpainting, 2022):目前性能最高的修复模型之一。它使用快速傅里叶卷积 (Fast Fourier Convolution, FFC) 高效地获得大的感受野,能够在考虑整幅图像结构的前提下进行修复;即使图像缺失 50% 以上也能生成自然的结果。
性能对比 (FID 分数,越低越好):Telea 法 FID 45-60 (仅对小掩码有效)、PatchMatch FID 25-35、Partial Conv FID 15-20、LaMa FID 8-12、Stable Diffusion FID 5-10 (但在一致性上仍有课题)。
视频修复与实时应用
视频修复需要在帧间保持时间一致性,避免填充内容在连续帧之间闪烁。
视频修复的挑战:
- 时间一致性:相邻帧的填充内容必须连贯,不能逐帧独立处理
- 运动补偿:背景和前景都在运动,需要跟踪运动来保持填充的一致性
- 计算量:视频帧数多,需要高效的处理方法
方法:
- 光流引导:利用光流将相邻帧的已知内容传播到当前帧的缺失区域
- 3D 卷积/Transformer:同时处理多帧,在时空维度上保持一致性
- 传播 + 修复:先用光流传播尽可能多的已知信息,再对剩余缺失区域进行修复
实时应用:视频会议中的背景替换(实质是前景分割 + 背景修复)、直播中的 Logo 移除。需要轻量级模型和 GPU 加速。
物体移除的掩码:掩码的制作可以使用分割模型 (SAM: Segment Anything Model),自动检测要移除的对象。小物体用 Telea 法就足够,大物体 (超过图像的 10%) 则需要 LaMa 或 Stable Diffusion。
水印去除:学界正在研究估计水印的 alpha 值并反算原始图像的方法 (Blind Watermark Removal)。
时间一致性与数据增广:用光流 (Optical Flow) 保证时间一致性的方法 (Video Inpainting) 已有不少研究,STTN (Spatial-Temporal Transformer Network) 等给出了高质量的结果。在机器学习中,为增加训练数据的多样性,也会随机遮挡图像的一部分再用修复还原 (Cutout + Inpainting)。
实用工具与部署方案
从研究模型到实际可用的修复工具,了解各种部署选项。
桌面工具:
- Adobe Photoshop:内容感知填充(Edit → Fill → Content-Aware)、修复画笔、仿制图章
- GIMP:修复工具(Heal Tool)、克隆工具
- Topaz Photo AI:AI 驱动的自动修复
在线工具:
- Cleanup.pictures:基于 LaMa 的在线物体移除工具
- Magic Eraser:移动端 AI 物体移除应用
编程实现:
- OpenCV:
cv2.inpaint(经典方法,适合小缺陷) - LaMa(PyTorch):开源模型,可本地部署。
pip install simple-lama-inpainting - Stable Diffusion Inpainting:通过 diffusers 库调用,质量最高但速度较慢
部署考虑:LaMa 在 GPU 上约 100ms/张(512x512),适合服务端批处理。移动端需要模型量化和优化。
自动生成掩码:分割方面,用 SAM (Segment Anything Model) 点击 1 次即可生成物体的掩码;目标检测方面,用 YOLO 检出边界框并把框内作为掩码;文字检测方面,用 EAST 或 CRAFT 检出文字区域,生成用于去除文字的掩码。这些能力已被 Photoshop、GIMP 以及各类 Web 应用广泛采用。
掩码的膨胀:检测得到的掩码往往紧贴对象的边界,为提升修复质量,通常把掩码向外膨胀 (dilate) 3-5 个像素。
质量评价指标:PSNR / SSIM 用于原始图像已知时的数值评价,PSNR 在 30dB 以上、SSIM 在 0.95 以上可视为高质量的目标值;FID (Frechet Inception Distance) 衡量生成图像的分布与真实图像的分布之间的距离;LPIPS (Learned Perceptual Image Patch Similarity) 衡量知觉上的相似度。