それでは、いよいよここからは、インペインティングの実現方法の説明を始めることにしましょう。
インペインティングの手法
インペインティングを実現する手法としては、主に以下の3つの方法があります。
- パッチベースの手法
- スパース表現による手法
- 偏微分方程式・変分法による手法
今回は2と3の手法の説明は割愛させて頂き、この中で一番よく応用されている1の「パッチベースの手法」に絞って紹介していきます。まずはパッチベースの手法の基本的なアルゴリズムを紹介し、その後、高速化されたパッチベースの対応パッチ探索手法「パッチマッチ(Patch Match)」という手法を紹介していきます。
パッチベースの手法
コンピュータビジョンでは、画像中の小さな矩形領域を「パッチ」と呼びます(少し大きめの矩形領域の場合は「ウィンドウ」と呼ぶことも多いです)。パッチベースのインペインティング手法では、まず準備として入力画像中において欠損領域を綺麗に指定しておいきます。そして、指定した欠損領域以外の領域(ソース領域)のパッチから、欠損領域のある場所にコピーした際に最も見え方が自然となるパッチを探索し、その探索したパッチをコピーして配置して欠損領域を埋めること事を繰り返すことで、自然な見た目のままの欠損領域の穴埋めを順番に行っていく処理になっています。
インペインティング処理をもう少し詳しくみていくために、まずは入力画像の各領域に名前をつけて、インペインティングを用いてどのような問題を解きたいかを定義して整理することにします。まず、入力画像を「I」とします。次に、入力画像の中で、穴(Hole)埋めを行いたい領域である欠損領域を「H」とし、欠損領域を埋めるためのパッチを取得してくる入力画像中でのH以外のソース(Source)領域を「S」とします。ここで、欠損領域Hがすべて埋まったインペインティング後の出力画像をI'とすると、「出力画像I'とソース領域Sが、全体として一番見た目が一貫している出力画像I'を作成する」ことがインペインティングの目的(問題設定)となります。
この「画像全体の一貫性」は、ソース領域から取得してきたパッチと、出力画像上でそのパッチと同じ場所にあるパッチのあいだの類似度を、それぞれ計算し、それらの画像全体での和として表現することができます。この「各欠損領域Hのパッチを埋めるのに用いた類似度の総和(=2つの画像間での一貫性の高さ)」が最も高くなるような穴埋めを行うことで、画像の一貫性が最も高い「それらしい見た目の出力画像」が自動的に作成できるようになります。
ソース領域からのパッチの切り取り箇所は、特段位置揃えなどは行わずに、ソース領域上の自由な場所から取得してきます。一方で、選んだパッチを欠損領域にあてはめる際には、グリッド(等しい長さの格子)を欠損領域中に配置して、グリッドの各1マスに埋める手段を取ることが多いです(パッチごとにコピーしてきて埋めるのと、グリッドごとのパッチの値全体の適応具合を計算しやすいため)。
この欠損領域へのパッチの切り取りと貼り付けは、以下の手順を繰り返すことで行います。
- 探索:ある欠損領域パッチに対して、ソース領域Sで類似度が一番高いパッチを探索します。探索する候補と欠損領域中の現在のパッチの間で、パッチ同志の画像の差を全て評価して投票し、その中で一番差が小さくなったパッチ探索結果とします
- 更新:探索が完了したパッチにより対象とする欠損領域のパッチ部分の穴埋めを行い、別の欠損領域中のパッチで1からの処理を行います
これら2つの処理を繰り返すことで、入力画像でのソース領域Sと出力画像Iの間での各パッチごとの類似度の和が最大となる(=入力画像と出力画像の間の一貫性が一番高くなる)ように、欠損領域中の各部分を順番に埋めていくことができます。
この2つの処理を繰り返す際に、その穴埋めする場所の順序をどうするか考えることになるのですが、その一番単純なものを考えるとすると「欠損領域の輪郭に沿って、順番に少しずつ隣にずれながらパッチを埋めて行く」という順序になると思います。しかしこの場合、例えば「空と地上の境界部分(図の青色と緑色の境界部分)」において、地上側の輪郭から順番に穴埋めをすると、先に地上のテクスチャのみによるパッチで欠損領域を埋めてしまって空の部分を浸食してしまいます。こうなると、本当は空の部分のテクスチャで埋められて欲しい場所も地上のテクスチャで埋まってしまうという不都合が起きてしまいます。
そこでインペインティングでは「優先度(Priority)」というものを導入してこれを防ぎます。優先度は、先程の空と地上の例のように、境界線が存在する部分を先に優先して埋めて行く処理を実現するための評価値(判断基準の値)です。欠損領域の輪郭方向と垂直な方向に境界線のエッジが存在していれば、そのパッチを埋める優先度は高くなり、一方テクスチャ変化の無い平坦なテクスチャのパッチは、優先度が低くなります。この優先度を用いて、境界が存在しているパッチから先に埋めておき、その後に平坦なパッチを埋めていくことで、境界部分がそれらしい見え方になる事を保つことができるようになっています。
以上、優先度を用いて、繰り返し欠損領域の各部分を埋めて行く手続きが、パッチベースのインペンティング手法の基本的な処理手順でした。