Image Inpainting
图像修复会使用传统方法、基于图块的方法、GAN 或扩散方法,为图像中被遮罩、损坏或移除的区域填充合理内容。
图像修复是指填补图像中的遮罩区域,例如划痕、移除的物体或缺失的图像块,并使填补内容与周围区域自然融合。每种方法都需要两个输入:图像和一张标记要替换像素的二值遮罩;遮罩外的所有内容都会保持不变。这个术语源自艺术品保护领域,修复师会对受损画作进行修补。Marcelo Bertalmío、Guillermo Sapiro、Vicent Caselles 和 Coloma Ballester 于 2000 年在 SIGGRAPH 上将这一概念引入数字计算机视觉,提出一种从缺失区域边界向内部延伸等亮度线的方法。遮罩下的像素是未知的,因此修复区域始终只是合理的生成内容,而不是对原始内容的还原。
经典方法、基于图块的方法与学习式方法#
传统方法会从掩码边界向内传播颜色和边缘。OpenCV 在其修复模块中提供了两种方法:Alexandru Telea 于 2004 年提出的快速行进法(cv2.INPAINT_TELEA),以及 Bertalmío、Andrea Bertozzi 和 Sapiro 于 2001 年提出的 Navier-Stokes 方法(cv2.INPAINT_NS)。它们很适合处理灰尘、划痕和细小的文字叠加层,但遇到大面积孔洞时会模糊成一片。下面的代码片段让 Telea 方法处理两次相同数量的缺失像素:一次是细小划痕,一次是单个方块:
import cv2
import numpy as np
from skimage import data
image = cv2.cvtColor(data.astronaut(), cv2.COLOR_RGB2BGR) # 512x512 sample photo
# Two masks with about the same pixel count: thin scratches and one solid block
scratches = np.zeros(image.shape[:2], np.uint8)
for y in range(40, 512, 40):
cv2.line(scratches, (0, y), (511, y + 30), 255, thickness=2)
block = np.zeros_like(scratches)
side = int(np.sqrt(np.count_nonzero(scratches)))
block[200 : 200 + side, 200 : 200 + side] = 255
for name, mask in [("scratches", scratches), ("block", block)]:
restored = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)
# Mean error inside the mask, where every pixel was reconstructed
error = np.abs(restored.astype(int) - image.astype(int))[mask > 0].mean()
print(f"{name}: {np.count_nonzero(mask)} masked pixels, mean error {error:.1f} gray levels")输出结果显示,对于 18,432 个划痕像素,平均误差为 9.1 个灰度级;对于 18,225 个像素的色块,平均误差为 36.5。每个划痕像素周围一两个像素内都有已知邻居,而色块中心距离最近的真实像素有 67 个像素,因此相同的缺失面积会带来四倍的误差。
基于图块的方法会从图像其他位置复制纹理,而不是通过平滑来填补。Antonio Criminisi、Patrick Pérez 和 Kentaro Toyama 于 2004 年提出的基于样例算法会逐块填补孔洞,从强边缘进入孔洞的位置开始;Connelly Barnes 等人于 2009 年提出的 PatchMatch 最近图块搜索让这种方法快到足以交互使用。它也是 Photoshop“内容识别填充”的基础。图块方法特别适合草地、砖墙和天空;如果缺失内容在图像其他位置都不存在,这种方法就会失效。
学习模型会根据训练时见过的内容推断缺失区域。Deepak Pathak 等人在 Context Encoders(CVPR 2016)中使用对抗损失训练卷积神经网络,这种损失借鉴自生成对抗网络,用于补全被掩码遮住的中心区域。Samsung AI 的 LaMa(WACV 2022)使用快速傅里叶卷积,其感受野从第一层起就覆盖整张图像,并使用大型随机掩码进行训练,因此能够补全大孔洞以及栅栏、窗户等重复结构。扩散模型通过对孔洞去噪来填补内容,去噪过程以可见像素为条件,也可以选择以提示词为条件:Stable Diffusion修复检查点为 U-Net 增加了五个输入通道,用于输入掩码和被掩码图像的潜变量;Andreas Lugmayr 等人在 RePaint(CVPR 2022)中使用未经修改的扩散模型,并在每一步都用原图已知区域的加噪副本替换已知区域。Adobe 于 2023 年将提示词驱动的文本到图像修复功能 Generative Fill 引入 Photoshop。
掩码与对象移除#
对象移除就是先进行图像分割,再进行修复:掩码选中对象,修复则填补对象留下的孔洞。紧贴对象边缘绘制的掩码会留下边缘像素、阴影和反射,形成残影,因此编辑器会将掩码向外膨胀几个像素,并将掩码延伸到阴影上。实例分割会为每个对象生成一个掩码,因此通常用来生成移除掩码;Meta 的 SAM 2 等可提示模型则能通过一次点击,为类别列表之外的对象生成掩码。YOLO26分割模型会将每个对象的轮廓作为多边形返回到 result.masks.xy 中,cv2.drawContours 使用 cv2.FILLED 将其栅格化为修复掩码;隔离分割对象指南也采用了这一步骤来抠出对象。
视频修复还要考虑时间维度:填补内容必须在各帧之间保持一致,否则画面就会闪烁,因此AI 视频编辑工具会通过跟踪来传播掩码,并在摄像机移动时借用相邻帧中显露出来的背景像素。
相关任务#
- 扩图:使用相同的模型将图像扩展到原始边界之外,并将新增画布区域作为掩码。
- 超分辨率:以更高分辨率为整张图像补充细节,不需要掩码。
- 去噪:去除分布在每个像素上的噪声,同时保留场景,同样不需要掩码。
- 帧插值:根据视频中间隔帧前后的帧,合成完整的中间帧。
应用与来源#
照片修复会为扫描照片中的裂纹、灰尘和撕裂处创建掩码;胶片修复则会逐帧处理档案影像中的划痕。在修图和产品摄影中,修复可用于移除杂物、电线和瑕疵。在卫星图像分析中,填补缺口是一个经典的修复问题:Landsat 7 的扫描线校正器于 2003 年 5 月 31 日发生故障,导致此后每幅影像都出现楔形条带,覆盖约 22% 的画面。
学习式修复会使用合成掩码在留出图像上进行评估,并通过弗雷歇 Inception 距离(FID)衡量真实感,因为良好的填补结果可能与原始像素不同,但仍然正确。同样的真实感也使修复成为制作深度伪造和移除水印的工具;而在医学、科学或法证图像中,凭空生成的结构可能改变诊断或判决。内容凭证会在签名元数据中记录此类编辑,Adobe 也会为使用 Generative Fill 编辑的图像附加内容凭证。










