Image Inpainting
L'inpainting delle immagini riempie le regioni mascherate, danneggiate o rimosse con contenuti plausibili, usando metodi classici, basati su patch, GAN o diffusione.
L'inpainting delle immagini consiste nel riempire una regione mascherata, per esempio un graffio, un oggetto rimosso o una porzione mancante, con contenuto che si integra con ciò che la circonda. Ogni metodo riceve due input, l'immagine e una maschera binaria che indica i pixel da sostituire, e lascia invariato tutto ciò che si trova al di fuori della maschera. Il termine deriva dal restauro artistico, in cui i restauratori ritoccano i dipinti danneggiati; Marcelo Bertalmío, Guillermo Sapiro, Vicent Caselles e Coloma Ballester lo hanno introdotto nella visione artificiale digitale a SIGGRAPH 2000 con un metodo che estende nell'area mancante linee di uguale luminosità a partire dal bordo della lacuna. I pixel sotto la maschera sono sconosciuti, quindi una regione ricostruita è sempre un'invenzione plausibile, mai il recupero di ciò che c'era.
Metodi classici, basati su patch e appresi#
I metodi classici propagano colore e bordi verso l'interno, partendo dal contorno della maschera. OpenCV include due metodi nel suo modulo di inpainting: il fast marching method del 2004 di Alexandru Telea (cv2.INPAINT_TELEA) e il metodo di Navier-Stokes del 2001 di Bertalmío, Andrea Bertozzi e Sapiro (cv2.INPAINT_NS). Funzionano bene su polvere, graffi e sovrapposizioni di testo sottili, ma sulle aree vuote grandi sfocano l'immagine fino a creare una macchia. Il frammento di codice qui sotto fornisce al metodo di Telea lo stesso numero di pixel mancanti due volte: una volta sotto forma di graffi sottili e una volta come un unico quadrato:
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")Stampa un errore medio di 9,1 livelli di grigio per 18.432 pixel di graffi e di 36,5 per un blocco di 18.225 pixel. Ogni pixel graffiato ha pixel adiacenti noti a uno o due pixel di distanza, mentre il centro del blocco è a 67 pixel dal pixel reale più vicino, quindi la stessa area mancante comporta un errore quattro volte maggiore.
I metodi basati su patch copiano texture da altre parti dell'immagine invece di sfumarle. L'algoritmo basato su esempi del 2004 di Antonio Criminisi, Patrick Pérez e Kentaro Toyama riempie un'area vuota una patch alla volta, partendo dai punti in cui vi entrano bordi marcati; la ricerca di patch più vicine PatchMatch, introdotta da Connelly Barnes e colleghi nel 2009, ha reso l'approccio abbastanza veloce per l'uso interattivo ed è alla base di Riempimento in base al contenuto di Photoshop. I metodi basati su patch eccellono con erba, mattoni e cielo, ma non funzionano quando il contenuto mancante non compare in nessun'altra parte dell'immagine.
I modelli appresi deducono il contenuto da ciò che hanno visto durante l'addestramento. I Context Encoders di Deepak Pathak e colleghi (CVPR 2016) hanno addestrato una rete neurale convoluzionale con una funzione di perdita avversaria, ripresa dalle reti generative avversarie, per completare una regione centrale mascherata. LaMa di Samsung AI (WACV 2022) usa convoluzioni veloci di Fourier, il cui campo recettivo copre l'intera immagine fin dal primo layer, e viene addestrato con grandi maschere casuali; per questo completa grandi aree vuote e strutture ripetitive come recinzioni e finestre. I modelli di diffusione riempiono un'area vuota denoisizzandola in base ai pixel visibili e, facoltativamente, a un prompt: i checkpoint di inpainting di Stable Diffusion forniscono alla U-Net cinque canali di input aggiuntivi per la maschera e la rappresentazione latente dell'immagine mascherata, mentre RePaint di Andreas Lugmayr e colleghi (CVPR 2022) usa un modello di diffusione non modificato, sostituendo a ogni passaggio la regione nota con una copia originale a cui è stato aggiunto rumore. Nel 2023 Generative Fill di Adobe ha portato l'inpainting guidato da prompt da testo a immagine in Photoshop.
Maschere e rimozione di oggetti#
La rimozione di oggetti consiste nella segmentazione delle immagini seguita dall'inpainting: una maschera seleziona l'oggetto e l'inpainting riempie l'area vuota che lascia. Le maschere tracciate troppo a ridosso di un oggetto lasciano un alone dei pixel del bordo, dell'ombra e del riflesso, quindi gli editor dilatano la maschera di alcuni pixel e la estendono sull'ombra. La segmentazione di istanze genera una maschera per ogni oggetto, ed è quindi la fonte abituale delle maschere per la rimozione; i modelli basati su prompt come SAM 2 di Meta trasformano un clic in una maschera per oggetti che non rientrano in alcun elenco di classi. I modelli di segmentazione YOLO26 restituiscono il contorno di ogni oggetto come poligono in result.masks.xy; cv2.drawContours lo rasterizza con cv2.FILLED in una maschera per l'inpainting, lo stesso passaggio usato dalla guida per isolare gli oggetti tramite segmentazione per ritagliare gli oggetti.
L'inpainting video aggiunge la dimensione temporale: il riempimento deve essere coerente tra i fotogrammi, altrimenti sfarfalla; perciò gli strumenti di editing video con IA propagano le maschere tramite il tracking e recuperano pixel dello sfondo rivelati nei fotogrammi adiacenti quando la videocamera si muove.
Attività correlate#
- Outpainting: Usa gli stessi modelli per estendere un'immagine oltre i suoi bordi originali, usando come maschera la nuova area della tela.
- Super-risoluzione: Aggiunge dettagli a tutta l'immagine aumentando la risoluzione, senza usare maschere.
- Denoising: Rimuove il rumore distribuito su ogni pixel mantenendo la scena, anche in questo caso senza usare maschere.
- Interpolazione dei fotogrammi: Sintetizza interi fotogrammi intermedi di un video a partire dai fotogrammi adiacenti.
Applicazioni e provenienza#
Il restauro fotografico maschera crepe, polvere e strappi nelle stampe digitalizzate; il restauro delle pellicole fa lo stesso fotogramma per fotogramma sui graffi delle riprese d'archivio. Il ritocco e la fotografia di prodotto rimuovono oggetti estranei, linee elettriche e imperfezioni. Nell'analisi di immagini satellitari, il riempimento delle lacune è un classico problema di inpainting: il correttore delle righe di scansione di Landsat 7 si è guastato il 31 maggio 2003, lasciando strisce a forma di cuneo che coprono circa il 22% di ogni scena acquisita in seguito.
L'inpainting appreso viene valutato su immagini tenute da parte, con maschere sintetiche, usando la distanza di Inception di Fréchet (FID) per misurare il realismo, poiché un buon riempimento può differire dai pixel originali ed essere comunque corretto. Questo stesso realismo rende l'inpainting uno strumento per i deepfake e la rimozione di filigrane; nelle immagini mediche, scientifiche o forensi, una struttura inventata può cambiare una diagnosi o un verdetto. Le Content Credentials registrano queste modifiche in metadati firmati e Adobe le associa alle immagini modificate con Generative Fill.










