Image Inpainting
Восстановление изображений заполняет правдоподобным содержимым замаскированные, повреждённые или удалённые области с помощью классических методов, методов на основе фрагментов, GAN или диффузионных моделей.
Задача заливки изображения — заполнить замаскированную область, например царапину, удалённый объект или отсутствующий фрагмент, содержимым, которое сливается с окружением. Каждому методу нужны два входных объекта — изображение и двоичная маска, отмечающая заменяемые пиксели; всё за пределами маски остаётся без изменений. Термин пришёл из реставрации произведений искусства, где специалисты ретушируют повреждённые картины. Марсело Бертальмио, Гильермо Сапиро, Висенте Касельес и Колома Бальестер перенесли его в цифровое компьютерное зрение на конференции SIGGRAPH 2000, представив метод продолжения линий одинаковой яркости от границы отверстия внутрь него. Пиксели под маской неизвестны, поэтому залитая область всегда представляет собой правдоподобную выдумку, а не восстановление того, что там было.
Классические, основанные на фрагментах и обучаемые методы#
Классические методы распространяют цвет и контуры внутрь от границы маски. OpenCV включает два таких метода в свой модуль ретуширования: быстрый метод распространения фронта Александру Телеа 2004 года (cv2.INPAINT_TELEA) и метод Навье — Стокса 2001 года, разработанный Бертальмио, Андреа Бертоцци и Сапиро (cv2.INPAINT_NS). Они хорошо справляются с пылью, царапинами и тонкими текстовыми наложениями, но на больших областях дают размытую мазню. Приведённый ниже фрагмент применяет метод Телеа к одинаковому числу отсутствующих пикселей в двух случаях: сначала к тонким царапинам, затем к одному квадратному участку:
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")Он выводит среднюю ошибку 9,1 уровня серого для 18 432 пикселей царапин и 36,5 — для блока размером 18 225 пикселей. У каждого пикселя царапины есть известные соседи в одном-двух пикселях от него, тогда как центр блока находится в 67 пикселях от ближайшего настоящего пикселя. Поэтому при одинаковой площади пропусков ошибка возрастает вчетверо.
Методы на основе фрагментов копируют текстуру из других областей изображения, а не сглаживают пропуск. Алгоритм заполнения на основе образцов, предложенный Антонио Криминиси, Патриком Пересом и Кентаро Тоямой в 2004 году, заполняет отверстие фрагмент за фрагментом, начиная с мест, куда входят чёткие контуры. Поиск ближайших фрагментов PatchMatch, созданный Коннелли Барнсом и коллегами в 2009 году, сделал этот подход достаточно быстрым для интерактивной работы; на нём основана функция Content-Aware Fill в Photoshop. Методы на основе фрагментов отлично подходят для травы, кирпичной кладки и неба, но не работают, если отсутствующее содержимое больше нигде на изображении не встречается.
Обученные модели восстанавливают содержимое на основе того, что они видели при обучении. Контекстные кодировщики (Context Encoders) Deepak Pathak и его коллег, представленные на CVPR 2016, обучали свёрточную нейронную сеть с состязательной функцией потерь, заимствованной у генеративно-состязательных сетей, чтобы заполнять центральную замаскированную область. LaMa от Samsung AI (WACV 2022) использует быстрые свёртки Фурье, чьё рецептивное поле охватывает всё изображение уже с первого слоя, и обучается на больших случайных масках, поэтому хорошо заполняет крупные пропуски и повторяющиеся структуры, например заборы и окна. Диффузионные модели заполняют пропуск, удаляя шум с учётом видимых пикселей и, при необходимости, текстового запроса: контрольные точки Stable Diffusion для ретуширования добавляют U-Net пять входных каналов для маски и латентного представления замаскированного изображения, а RePaint Андреаса Лугмайра и коллег (CVPR 2022) использует неизменённую диффузионную модель, на каждом шаге заменяя известную область зашумлённой копией оригинала. В 2023 году Generative Fill от Adobe добавила в Photoshop ретуширование по запросу на основе генерации изображений по тексту.
Маски и удаление объектов#
Удаление объекта — это сегментация изображения, за которой следует ретуширование: маска выделяет объект, а ретуширование заполняет оставшееся отверстие. Если маски обводят объект слишком плотно, его краевые пиксели, тень и отражение остаются и выглядят как призрак, поэтому редакторы расширяют маску на несколько пикселей и захватывают тень. Сегментация экземпляров создаёт отдельную маску для каждого объекта, поэтому обычно именно её используют для удаления объектов. Модели с поддержкой запросов, например SAM 2 от Meta, превращают щелчок в маску объекта, даже если его нет ни в одном списке классов. Модели YOLO26 сегментации возвращают контур каждого объекта в виде многоугольника в result.masks.xy; cv2.drawContours с помощью cv2.FILLED растеризует многоугольник в маску для ретуширования — этот же шаг используется в руководстве по изоляции объектов сегментации, где объекты вырезают из изображения.
Ретуширование видео требует учитывать время: заполнение должно совпадать между кадрами, иначе возникает мерцание. Поэтому инструменты редактирования видео с помощью ИИ переносят маски с помощью трекинга и используют пиксели фона, открывающиеся на соседних кадрах при движении камеры.
Связанные задачи#
- Расширение изображения: использует те же модели, чтобы продолжить изображение за исходными границами; маской служит новая область холста.
- Сверхвысокое разрешение: добавляет детали по всему изображению и повышает его разрешение; маска не нужна.
- Шумоподавление: удаляет шум, распределённый по всем пикселям, сохраняя сцену; маска также не нужна.
- Интерполяция кадров: создаёт целые промежуточные кадры видео на основе кадров до и после них.
Применение и происхождение#
При реставрации фотографий с отсканированных отпечатков масками выделяют трещины, пыль и разрывы, а при реставрации плёнки так же обрабатывают царапины на каждом кадре архивных записей. Ретуширование и предметная съёмка помогают удалять случайные объекты, линии электропередачи и дефекты. В анализе спутниковых изображений заполнение пропусков — классическая задача ретуширования: корректор строк сканирования на Landsat 7 вышел из строя 31 мая 2003 года, оставив клиновидные полосы, которые покрывают около 22% каждой последующей сцены.
Качество обученных методов ретуширования оценивают на отложенных изображениях с синтетическими масками, используя расстояние Фреше — Инцепшн (FID) для оценки реалистичности: качественное заполнение может отличаться от исходных пикселей и при этом оставаться правильным. Та же реалистичность делает ретуширование инструментом для создания дипфейков и удаления водяных знаков. А в медицинских, научных и судебно-экспертных изображениях вымышленная структура может повлиять на диагноз или вердикт. Content Credentials фиксируют такие изменения в подписанных метаданных, и Adobe добавляет их к изображениям, отредактированным с помощью Generative Fill.










