Image Inpainting
マスク、セグメンテーション、OpenCV、YOLO26、生成モデルを使用してコンテンツの復元や削除を行う画像インペインティングの仕組みと、主な応用例および制限について学びます。
画像インペインティングは、画像の欠損、破損、または意図的にマスクされた領域を再構築し、完成した領域が周囲と自然に馴染むようにするコンピュータビジョン技術です。不要なピクセルを単に隠すのではなく、インペインティングシステムは、近隣のテクスチャ、シーン構造、および生成システムの場合は学習された視覚パターンから、妥当な置換コンテンツを推測します。一般的な目的には、破損した写真の復元、オブジェクトやテキストの削除、画像編集中に作成された隙間の埋め合わせなどが含まれます。
画像インペインティングの仕組み#
インペインティングのワークフローには通常、元の画像と、置き換えるピクセルを特定するマスクという2つの入力があります。システムはマスクの外側のピクセルを保持しながら、マスクの内側のコンテンツを合成または再構築します。マスクの規則はツールによって異なるため、開発者は白、黒、ゼロ、またはゼロ以外のピクセルのどれが編集可能な領域を表しているかを確認する必要があります。
従来のコンピュータビジョンの手法では、マスクの境界から内側に向けて色、エッジ、テクスチャを伝播させます。たとえば、OpenCV image inpainting workflowは、近隣のピクセルを使用してマスクされた領域を埋め、周辺の構造を継続するように設計されたアルゴリズムを提供します。これらのアプローチは効率的であり、引っかき傷、ほこり、細いテキスト、小さな穴に対してよく機能します。(docs.opencv.org)
学習ベースのシステムは、より高レベルのコンテキストを推論します。モデルは、マスクされた領域がレンガ積み、芝生、衣類、または人物の顔の上にあることを認識し、その解釈に一貫したコンテンツを生成する場合があります。ただし、出力は未知の元のピクセルの復元ではなく、妥当な推測にとどまります。
マスクとモデルのアプローチ#
マスクの品質は結果に強く影響します。小さすぎるマスクでは、オブジェクトのエッジや影が残る可能性があり、大きすぎるマスクでは有用なコンテキストが失われます。正確なマスクは、手動で作成するか、画像セグメンテーションを使用して生成できます。インスタンスセグメンテーションは、各オブジェクトに対して個別のピクセルレベルのマスクを生成するため特に便利です。
Ultralytics SAM 2 documentationでは、オブジェクトを対話式に選択するためのポイントおよびボックスプロンプトによるセグメンテーションについて説明しています。既知のオブジェクトクラスの場合、Ultralytics YOLO segmentation taskはオブジェクトマスクとポリゴン座標を返します。チームはまた、手動、SAMアシスト、およびYOLOアシストの注釈をサポートするUltralytics Platform annotation editorを使用して、ポリゴンマスクを作成および洗練することができます。
実際の埋め合わせを実行できるモデルファミリーには、次のようなものがあります。
- 古典的な手法は、近隣のピクセル、輪郭、または滑らかな輝度パターンを拡張します。scikit-image restoration APIには、マスクされた領域に対するバイハモニックインペインティングが含まれています。
- **Generative adversarial networks**は、生成ネットワークと識別ネットワークの競合を通じて、視覚的にリアルな補完を生成することを学習します。
- **Diffusion models**は、マスク内のノイズを、可視画像およびオプションでテキストプロンプト条件付けられたコンテンツに反復的に変換します。
画像インペインティングと関連タスクの比較#
インペインティングは局所的な置換によって定義されます。関連するタスクには異なる目的があります。
- オブジェクト削除はインペインティングのアプリケーションです。セグメンテーションがオブジェクトを選択し、インペインティングが結果として生じた穴を埋めます。
- 画像セグメンテーションは、どのピクセルがオブジェクトまたはクラスに属しているかを特定しますが、それらを置き換えることはありません。
- ノイズ除去は、通常はシーンのコンテンツを保持しながら、広範囲にわたるノイズを軽減します。
- アウトペインティングは、内部領域を修復するのではなく、元のキャンバスを超えてコンテンツを拡張します。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)






