2013年4月6日土曜日

ユーザインタラクティブな領域分割

in English

はじめに

先のページで、OpenCVを使って、GMM(Gaussian Mixture Model)による領域分割を実装しました。今回はこれをユーザインタラクティブな形式に拡張してみます。すなわち、
  1. 分割したい領域をマウスでおおまかに指定する。
  2. 指定された画素から、各領域のGMMを構築する。GMMは画素がその領域に属する確率分布を与える。
  3. 各GMMを全画素に適用し、領域分割を行う。

定式化

いま、ユーザがM個の領域をマウスでおおまかに指定したとする。このとき、M個のサンプル群 が得られる。ここで、各サンプル 個の(R,G,B)を持つとする。 からGMM

を構築する。ここで、 は、与えられた画素値() が領域 に属する確率を表す。M個の確率分布 を求め、最大確率を与える領域にその画素を割り振る。

デモ 1

エイと背景をおおまかに指定する。

実行するとこうなります。
背景
エイ


デモ 2

木、豹(?)、葉をおおまかに指定する。

実行するとこうなります。





デモ 3

背景と鳥をおおまかに指定する。
実行するとこうなります。
背景


開発環境

  1. Mac OS X 10.8.3
  2. プロセッサ:3.06 GHz Intel Core 2 Duo
  3. メモリ:4GB
  4. Xcode4.6.1 with Apple LLVM 4.2(C++ Language Dialect → C++11, C++ Standard Library → libc++)
  5. boost-1.51.0(Apple LLVM 4.1でコンパイルしたもの。こちら
  6. opencv-2.4.3(Apple LLVM 4.2でコンパイルしたもの。こちら

ソース

こちらです。上記の開発環境で動作確認しました。


実行方法

実行ファイ名は、InteractiveImageSegmentationです。引数なしで実行すると以下を出力します。 引数--nclustersはGaussian Mixture Modelで使う成分の数です。上記の定式化の に相当します。
以下を実行すると--inputで指定した画像が表示されます。 0から9までのいずれかのキーを押しながら、画像上でマウスを左クリックのまま動かします。0から9までの数でサンプルを区別します。たとえば、0を押しながら背景を指定し、1を押しながら鳥を指定します。最大10個のサンプル(ピクセルの集合)を指定することができます。続いて"e"を押すと領域分割が実行されます。 2つのサンプルを指定したので、2つのGMMが計算されました。標準出力にはそれぞれの が表示されます。--nclusters 5としたので各GMMに対して5つの3次元ベクトルが出力されています。 "c"を押すと全サンプルが削除されます。もう一度最初からサンプルの採集を行うことができます。

0 件のコメント:

コメントを投稿