Image Inpainting
O preenchimento de imagens completa regiões mascaradas, danificadas ou removidas com conteúdo plausível, utilizando métodos clássicos, baseados em blocos, GAN ou de difusão.
O preenchimento de imagens é a tarefa de preencher uma região mascarada de uma imagem, como um arranhão, um objeto removido ou uma área ausente, com conteúdo que se integre ao entorno. Cada método recebe duas entradas, a imagem e uma máscara binária que indica os pixels a substituir, e mantém inalterado tudo o que estiver fora da máscara. O termo vem da conservação de arte, na qual restauradores retocam pinturas danificadas. Na SIGGRAPH 2000, Marcelo Bertalmío, Guillermo Sapiro, Vicent Caselles e Coloma Ballester trouxeram o termo para a visão computacional digital, com um método que prolonga linhas de igual brilho da borda do buraco para dentro dele. Os pixels sob a máscara são desconhecidos, então uma região preenchida é sempre uma invenção plausível, nunca a recuperação do que estava ali.
Métodos clássicos, baseados em blocos e aprendidos#
Os métodos clássicos propagam a cor e as bordas para dentro, a partir dos limites da máscara. O OpenCV inclui dois deles no seu módulo de reconstrução: o método rápido de propagação de Alexandru Telea, de 2004 (cv2.INPAINT_TELEA), e o método de Navier-Stokes, de 2001, de Bertalmío, Andrea Bertozzi e Sapiro (cv2.INPAINT_NS). Eles funcionam bem com poeira, riscos e sobreposições de texto finas, mas, em buracos grandes, borram a imagem até virar uma mancha. O trecho de código abaixo fornece ao método de Telea o mesmo número de pixels ausentes em duas situações: uma vez na forma de riscos finos e outra como um único quadrado:
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")Ele imprime um erro médio de 9,1 níveis de cinza para 18.432 pixels de riscos e de 36,5 para um bloco de 18.225 pixels. Cada pixel dos riscos tem pixels vizinhos conhecidos a um ou dois pixels de distância, enquanto o centro do bloco fica a 67 pixels do pixel real mais próximo; assim, a mesma área ausente gera quatro vezes mais erro.
Os métodos baseados em patches copiam texturas de outras partes da imagem em vez de suavizá-las. O algoritmo baseado em exemplos de 2004, de Antonio Criminisi, Patrick Pérez e Kentaro Toyama, preenche o buraco patch por patch, começando pelas áreas onde entram bordas fortes. A busca por patches vizinhos PatchMatch, de Connelly Barnes e colegas (2009), tornou a abordagem rápida o bastante para uso interativo; ela serve de base ao Preenchimento sensível ao conteúdo do Photoshop. Os métodos de patches se destacam em grama, tijolos e céu e falham quando o conteúdo ausente não aparece em nenhum outro lugar da imagem.
Os modelos treinados inferem o conteúdo com base no que viram durante o treinamento. Os Context Encoders, de Deepak Pathak e colegas (CVPR 2016), treinaram uma rede neural convolucional com uma função de perda adversarial, inspirada nas redes generativas adversariais, para completar uma região central mascarada. O LaMa da Samsung AI (WACV 2022) usa convoluções rápidas de Fourier, cujo campo receptivo abrange a imagem toda já na primeira camada, e é treinado com máscaras aleatórias grandes, o que permite completar buracos grandes e estruturas repetidas, como cercas e janelas. Os modelos de difusão preenchem um buraco removendo ruído, condicionados pelos pixels visíveis e, opcionalmente, por um prompt: os checkpoints de reconstrução do Stable Diffusion fornecem à U-Net cinco canais de entrada extras para a máscara e a representação latente da imagem mascarada, enquanto o RePaint, de Andreas Lugmayr e colegas (CVPR 2022), usa um modelo de difusão sem modificações e substitui a região conhecida por uma cópia ruidosa da imagem original em cada etapa. O Generative Fill da Adobe levou a reconstrução de texto para imagem baseada em prompts ao Photoshop em 2023.
Máscaras e remoção de objetos#
A remoção de objetos consiste em segmentação de imagens seguida de reconstrução: uma máscara seleciona o objeto, e a reconstrução preenche o buraco deixado por ele. Máscaras traçadas rente a um objeto deixam para trás os pixels das bordas, a sombra e o reflexo, criando um fantasma; por isso, os editores expandem a máscara alguns pixels e a estendem sobre a sombra. A segmentação de instâncias produz uma máscara por objeto, o que a torna a fonte habitual de máscaras para remoção. Modelos que aceitam prompts, como o SAM 2 da Meta, transformam um clique em uma máscara para objetos que não pertencem a nenhuma lista de classes. Os modelos de segmentação YOLO26 retornam o contorno de cada objeto como um polígono em result.masks.xy, que cv2.drawContours com cv2.FILLED rasteriza para criar uma máscara de reconstrução — a mesma etapa usada no guia para isolar objetos segmentados para recortar objetos.
A reconstrução de vídeo acrescenta a dimensão temporal: o preenchimento precisa ser consistente entre os quadros, ou a imagem pisca. Por isso, as ferramentas de edição de vídeo com AI propagam as máscaras usando rastreamento e aproveitam os pixels do fundo revelados nos quadros vizinhos conforme a câmera se move.
Tarefas relacionadas#
- Expansão de imagem: Usa os mesmos modelos para estender uma imagem além das bordas originais, usando como máscara a nova área da tela.
- Super-resolução: Adiciona detalhes à imagem inteira em uma resolução maior, sem usar máscara.
- Redução de ruído: Remove o ruído distribuído por todos os pixels sem alterar a cena, também sem usar máscara.
- Interpolação de quadros: Sintetiza todos os quadros intermediários de um vídeo a partir dos quadros que vêm antes e depois.
Aplicações e origem#
A restauração de fotos mascara rachaduras, poeira e rasgos em impressões digitalizadas, e a restauração de filmes faz o mesmo quadro a quadro para remover riscos de filmagens de arquivo. O retoque e a fotografia de produtos removem objetos indesejados, fios elétricos e imperfeições. Na análise de imagens de satélite, o preenchimento de lacunas é um problema clássico de reconstrução: o corretor de linhas de varredura do Landsat 7 falhou em 31 de maio de 2003, deixando faixas em forma de cunha que cobrem cerca de 22% de cada cena posterior.
A reconstrução com modelos treinados é avaliada em imagens reservadas para teste com máscaras sintéticas, usando a distância de Inception de Fréchet (FID) para medir o realismo, já que um bom preenchimento pode diferir dos pixels originais e ainda assim estar correto. Esse mesmo realismo torna a reconstrução útil para criar deepfakes e remover marcas d'água; em imagens médicas, científicas ou forenses, uma estrutura inventada pode alterar um diagnóstico ou um veredito. As Content Credentials registram essas edições em metadados assinados, e a Adobe as associa às imagens editadas com o Generative Fill.










