Image Inpainting
了解图像修复如何使用掩码、分割、OpenCV、YOLO26 和生成式模型来恢复或移除内容——以及关键应用和局限性。
图像修复是一种计算机视觉技术,用于重建图像中缺失、损坏或被故意遮挡的区域,使完成后的区域与周围环境融为一体。修复系统不仅仅是简单地覆盖不需要的像素,而是从临近的纹理、场景结构以及生成系统中学到的视觉模式中估计出合理的替代内容。常见的应用目标包括修复受损照片、移除物体或文字以及填补在图像编辑过程中产生的空白。
图像修复的工作原理#
图像修复工作流通常有两个输入:原始图像和一个用于标识待替换像素的掩膜。系统会保留掩膜外部的像素,同时在掩膜内部合成或重建内容。不同的工具采用的掩膜约定有所不同,因此开发者必须确认白色、黑色、零或非零像素代表可编辑区域。
传统的计算机视觉方法将颜色、边缘和纹理从掩膜边界向内传播。例如,OpenCV image inpainting workflow使用相邻像素填充被掩膜遮挡的区域,并提供旨在延续周围结构的算法。这些方法效率高,通常适用于划痕、灰尘、细小文字和小孔。(docs.opencv.org)
基于学习的系统会推断更高层次的上下文。模型可能会识别出被掩膜遮挡的区域位于砖墙、草地、衣物或人脸上,并生成与该解释一致的内容。然而,输出的结果是合理的推测,而非恢复未知的原始像素。
掩膜与模型方法#
掩膜的质量会严重影响结果。过小的掩膜可能会留下物体边缘或阴影,而过大的掩膜则会移除有用的上下文。精确的掩膜可以手动创建,也可以通过图像分割生成。实例分割尤其有用,因为它能为每个对象生成单独的像素级掩膜。
Ultralytics SAM 2 documentation介绍了用于交互式选择对象的点提示和框提示分割。对于已知对象类别,Ultralytics YOLO segmentation task可返回对象掩膜和多边形坐标。团队还可以使用Ultralytics Platform annotation editor创建和精细化多边形掩膜,该编辑器支持手动标注、SAM 辅助标注和 YOLO 辅助标注。
有几种模型系列可以执行实际的填充工作:
- 经典方法延伸附近的像素、轮廓或平滑的强度模式。scikit-image restoration API包含针对掩膜区域的双调和修复功能。
- **生成对抗网络**通过生成器网络和判别器网络之间的竞争,学习生成视觉上逼真的补全效果。
- **扩散模型**迭代地将掩膜内部的噪声转换为以可见图像以及可选的文本提示为条件的内容。
图像修复与相关任务的对比#
图像修复的定义特征是局部替换。相关任务的目标则有所不同:
- 对象移除是图像修复的一种应用:通过分割选择对象,然后通过图像修复填补产生的空洞。
- 图像分割用于识别哪些像素属于某个对象或类别,但不会替换它们。
- 去噪可减少普遍存在的噪声,同时通常会保留场景内容。
- 画幅扩展将内容延伸到原始画布之外,而不是修复内部区域。Google Cloud mask-based image editing guide区分了插入、移除、扩展和替换内容的操作。
- 超分辨率用于提高图像分辨率和细节,而不是针对用户定义的掩膜。
文字移除遵循与对象移除相同的工作流。文字被掩膜覆盖,然后系统预测被遮挡的背景。如果文字覆盖了独特的面部、符号或文档细节,则无法可靠地恢复原始信息。
实际应用#
**零售图像清理:**在线卖家可以从产品照片中分割出杂乱的电缆、反光、支撑架或背景物体,并对该区域进行图像修复。小的瑕疵可能适合使用Adobe Content-Aware Fill,而Adobe generative image editing可以处理更大、语义更复杂的区域。(helpx.adobe.com)
**图像恢复:**档案馆和影像团队可以对扫描照片和显微摄影帧中的划痕、灰尘斑点、传感器缺陷或丢失的像素进行掩膜处理。这可以提高可读性和展示效果,但重建的区域不应被视为观察到的证据。在医学、科学或取证图像中,虚构的结构可能会改变解读结果,因此必须清晰记录。
实践工作流与局限性#
以下示例使用YOLO26创建人员掩膜并使用 OpenCV 填充该区域。使用 pip install ultralytics opencv-python numpy 安装依赖项。
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Select the first detected person and convert its polygon to a mask.
class_ids = result.boxes.cls.cpu().numpy().astype(int)
person_index = next(i for i, class_id in enumerate(class_ids) if class_id == 0)
contour = result.masks.xy[person_index].astype(np.int32)
contour = contour.reshape(-1, 1, 2)
image = result.orig_img.copy()
mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.drawContours(mask, [contour], -1, 255, cv2.FILLED)
inpainted = cv2.inpaint(image, mask, 3, cv2.INPAINT_TELEA)
cv2.imwrite("inpainted.jpg", inpainted)这结合了对象定位与从分割轮廓构建掩膜的记录模式。经典填充可能难以处理大型对象、重复几何图形、阴影、反光或面部。生成方法可以处理更广泛的上下文,但可能会引入虚构的细节。请保留原件,在全分辨率下检查边界,并使用诸如C2PA Content Credentials等溯源机制记录重大编辑,尤其是在真实性至关重要的时候。NIST guidance on synthetic-content transparency也强调溯源和标记是应对有意义篡改媒体的重要保障措施。(c2pa.org)






