Mugichoko's blog

Mugichoko’s blog

プログラミングを中心としたメモ書き.

PixMix Inpainting

目標

画像上の欠損領域を同一画像内の他の画素を用いて埋めるPixMix Inpaintingを実装する.

PixMix Inpainting

論文

Jan Herling and Wolfgang Broll, "High-Quality Real-Time Video Inpaintingwith PixMix," Vol. 20, Issue 6, pp. 866 - 879, 2014.

概要

詳しい説明は論文に譲るが,簡単には,欠損領域の画素に類似した画素を欠損領域以外から見つけて埋めていく手法.

この手法の肝は以下の様に思う.

  • 現在よりも以下のコストを下げる画素をランダム探索
    • Spatial Cost:画像上での画素間の距離に関するコスト(重み)
    • Appearance Cost:画素の見た目の違いに関するコスト(重み)
  • ただし,近傍の画素で既に低いコストの画素が見つかっていれば,その結果を用いて現在の画素のコストを初期化
    • つまり,近傍の画素の結果を伝播
  • 画像ピラミッドを用いる
  • 左上から右下,右下から左上,と画素の走査を繰り返す

このInpainting自体は射影変換に弱い様子.論文中の実装では,ホモグラフィ変換を用いて画素をフレーム毎にトラッキングし,前フレームの初期値を用いて,現フレームの画素を見つけるようだ.

コスト関数

※以下の図は,論文から引用した図や式に追記したものです.

「概要」での説明の通り,Spatial Cost関数とAppearance Cost関数があり,以下の様に表される.

f:id:Mugichoko:20180108171633p:plain

Appearance Cost関数は,単なるテンプレートマッチングだと思えばいいので良しとする.Spatial Cost関数に関しては,以下の様に説明されている.下図の式の様に考えて,図をじーっと眺めていると,徐々に意味が分かってくると思う.

f:id:Mugichoko:20180108171648p:plain

伝播

画像ピラミッドのレベルとlvとすると,小さい画像 (lv - 1) から処理をして,その結果を次の大きい画像 (lv) にコピーし,それをlvの初期値として上記のコスト関数を小さくする画素を探索する.

対象画素を左上から右下に走査するとすると,左や上の画素は既に更新済みの画素のはずだ.よって,この結果を現在の画素のヒントにする.

f:id:Mugichoko:20180108172905p:plain

下図にあるように,論文中でこっそりと,あるlvにおいて何度も上記の走査を実行することが示されている.つまり,左上から右下へ走査した後,次は,右下から左上へ走査する.この操作を繰り返して,徐々に画素値を更新していくという寸法だ.

f:id:Mugichoko:20180108172851p:plain

ソースコード

2月か3月頃にGitHubで公開予定.

公開しました!(2018年3月26日) github.com