Image Inpainting
画像インペインティングでは、古典的手法、パッチベース手法、GAN、拡散モデルなどを使って、マスクされた領域、破損した領域、削除された領域を自然な内容で埋めます。
画像インペインティングは、傷、除去された物体、欠けた部分など、画像のマスク領域を周囲になじむ内容で埋めるタスクです。すべての手法は、画像と置き換えるピクセルを示すバイナリマスクという2つの入力を受け取り、マスクの外側は変更しません。この用語は、修復家が損傷した絵画を補彩する美術品修復に由来します。Marcelo Bertalmío、Guillermo Sapiro、Vicent Caselles、Coloma Ballesterは、SIGGRAPH 2000でデジタルコンピュータービジョンにこの手法を導入しました。彼らの手法は、穴の境界から穴の内部へ、明るさが等しい線を延長します。マスク下のピクセルは未知であるため、インペインティングされた領域は常にもっともらしい創作であり、元の内容を復元したものではありません。
古典的手法、パッチベースの手法、学習型手法#
古典的な手法では、マスクの境界から内側へ色とエッジを伝播させます。OpenCVには、インペインティングモジュールに2つの手法が用意されています。1つはAlexandru Teleaによる2004年の高速マーチング法(cv2.INPAINT_TELEA)、もう1つはBertalmío、Andrea Bertozzi、Sapiroによる2001年のNavier-Stokes法(cv2.INPAINT_NS)です。これらはほこり、傷、細いテキストのオーバーレイには効果的ですが、大きな穴ではぼやけてにじみになります。以下のスニペットでは、Teleaの手法に同じ数の欠損ピクセルを与えます。細い傷として配置した場合と、1つの正方形として配置した場合の2通りです。
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です。傷の各ピクセルには1~2ピクセル先に既知の近傍がある一方、ブロックの中心は最も近い実ピクセルから67ピクセル離れているため、同じ欠損面積でも誤差は4倍になります。
パッチベースの手法は、画像内の別の場所からテクスチャをコピーし、平滑化せずに穴を埋めます。Antonio Criminisi、Patrick Pérez、Kentaro Toyamaによる2004年の事例ベースアルゴリズムは、強いエッジが穴に入り込む位置から、パッチ単位で穴を埋めます。Connelly Barnesらによる2009年のPatchMatch最近傍パッチ検索により、この手法はインタラクティブに使えるほど高速になり、Photoshopのコンテンツに応じた塗りつぶしの基盤となりました。パッチ手法は草、レンガ、空には優れていますが、欠損した内容が画像内のどこにもない場合は機能しません。
学習済みモデルは、学習時に見たデータをもとに内容を推論します。Deepak PathakらのContext Encoders(CVPR 2016)は、畳み込みニューラルネットワークの学習に、敵対的生成ネットワークから取り入れた敵対的損失を用い、マスクされた中央領域を補完しました。Samsung AIのLaMa(WACV 2022)は、受容野が第1層から画像全体に及ぶ高速フーリエ畳み込みを使用し、大きなランダムマスクで学習するため、大きな穴や、フェンスや窓などの反復構造を補完します。拡散モデルは、可視ピクセルと、必要に応じてプロンプトを条件として、ノイズ除去によって欠損領域を補完します:Stable Diffusionのインペインティング用チェックポイントでは、マスクとマスク済み画像の潜在表現を入力するために、U-Netに5つの追加入力チャネルが設けられており、Andreas LugmayrらのRePaint(CVPR 2022)は、変更を加えていない拡散モデルを使用し、各ステップで既知領域を元画像にノイズを加えたコピーに置き換えます。AdobeのGenerative Fillは、プロンプトに基づくテキストからの画像生成を用いたインペインティングを2023年にPhotoshopへ導入しました。
マスクとオブジェクトの削除#
オブジェクトの削除は、画像セグメンテーションの後にインペインティングを行う処理です。マスクでオブジェクトを選択し、インペインティングで残った穴を埋めます。オブジェクトの輪郭にぴったり沿ったマスクでは、エッジのピクセル、影、反射がゴーストのように残るため、編集時にはマスクを数ピクセル膨張させ、影まで覆うように広げます。インスタンスセグメンテーションはオブジェクトごとに1つのマスクを生成するため、削除用マスクの一般的な取得元です。また、MetaのSAM 2のようなプロンプト可能なモデルでは、クラスリストにないオブジェクトもクリックからマスクにできます。YOLO26のセグメンテーションモデルは、各オブジェクトの輪郭をresult.masks.xy内のポリゴンとして返します。これをcv2.drawContoursでcv2.FILLEDとともにラスタライズしてインペインティング用マスクを作成します。これはセグメンテーションオブジェクトの切り抜きガイドでオブジェクトを切り抜く際と同じ手順です。
動画のインペインティングでは時間軸への対応が必要です。フレーム間で補完結果が一致しないとちらつくため、AI動画編集ツールはトラッキングでマスクを伝播させ、カメラの移動に伴い、隣接フレームで見えるようになった背景ピクセルを利用します。
関連タスク#
- アウトペインティング:同じモデルを使って、元の境界の外側まで画像を拡張します。新しいキャンバス領域をマスクとして扱います。
- 超解像:マスクを使わず、より高い解像度で画像全体にディテールを追加します。
- ノイズ除去:マスクを使わず、シーンを維持したまま全ピクセルに広がるノイズを除去します。
- フレーム補間:動画の前後のフレームから、その間にあるフレーム全体を合成します。
用途と由来#
写真の修復では、スキャンしたプリントのひび、ほこり、破れをマスクで指定します。フィルムの修復では、アーカイブ映像の傷に対してフレームごとに同様の処理を行います。レタッチや商品写真では、不要物、電線、傷を取り除きます。衛星画像解析では、欠損部分の補完は典型的なインペインティングの課題です。Landsat 7のスキャンライン補正装置は2003年5月31日に故障し、それ以降の各シーンの約22%を覆うくさび形の縞が残りました。
学習ベースのインペインティングは、合成マスクを用いて保留画像で評価されます。適切な補完結果は元のピクセルと異なっていても正しい場合があるため、リアリティの評価にはフレシェ・インセプション距離 (FID)が使われます。同じリアリティの高さにより、インペインティングはディープフェイクやウォーターマークの除去にも使われます。一方、医療、科学、法医学の画像では、作り出された構造が診断や判決を左右するおそれがあります。コンテンツ認証情報は、そのような編集を署名付きメタデータに記録します。AdobeはGenerative Fillで編集した画像にこれらを付与します。










