はじめに
先のページで、OpenCVを使って、GMM(Gaussian Mixture Model)による領域分割を実装しました。今回はこれをユーザインタラクティブな形式に拡張してみます。すなわち、- 分割したい領域をマウスでおおまかに指定する。
- 指定された画素から、各領域のGMMを構築する。GMMは画素がその領域に属する確率分布を与える。
- 各GMMを全画素に適用し、領域分割を行う。
定式化
いま、ユーザがM個の領域をマウスでおおまかに指定したとする。このとき、M個のサンプル群 が得られる。ここで、各サンプル は 個の(R,G,B)を持つとする。 からGMMを構築する。ここで、 は、与えられた画素値() が領域 に属する確率を表す。M個の確率分布 を求め、最大確率を与える領域にその画素を割り振る。
デモ 1
エイと背景をおおまかに指定する。実行するとこうなります。
背景
エイ
デモ 2
木、豹(?)、葉をおおまかに指定する。実行するとこうなります。
木
葉
豹
デモ 3
背景と鳥をおおまかに指定する。実行するとこうなります。
背景
鳥
開発環境
- Mac OS X 10.8.3
- プロセッサ:3.06 GHz Intel Core 2 Duo
- メモリ:4GB
- Xcode4.6.1 with Apple LLVM 4.2(C++ Language Dialect → C++11, C++ Standard Library → libc++)
- boost-1.51.0(Apple LLVM 4.1でコンパイルしたもの。こちら)
- 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 件のコメント:
コメントを投稿