2012年11月20日火曜日

Level Set 法

はじめに

ずいぶん昔になりますが、Level Set 法を実装しました。今回はこれを公開します。

デモ

こんな感じです。


 

検証環境(Mac)

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

検証環境(Windows)

  1. Windows XP Professional Version 2002 Service Pack 3
  2. プロセッサ:Pentium(R) D CPU 3.20GHz
  3. メモリ:3GB
  4. Visual Studio 2005
  5. boost-1.51.0(VS2005用バイナリ版)

ソース

こちらです。上記2つの検証環境で動作確認しました。

使い方

実行ファイ名は、LevelSetMethod(Windowsの場合はLevelSetMethod.exe)です。引数なしで実行すると以下を出力します。 上記引数を使い分けながら計算を進めます。大まかな計算手順は以下の通りです。
  1. 入力画像の大きさを知る。
  2. 初期閉曲線を設定する。
  3. LevelSet法を実行する。
各項目の詳細を解説していきます。

①入力画像の大きさ


初期閉曲線を設定するには入力画像の大きさを知る必要があります。以下のコマンドを実行します。 入力画像(./input/sample3.jpg)の幅と高さが表示されます。

②初期閉曲線の設定


以下のコマンドで中心座標(X, Y)、半径Rの円を描きます。 ここで、-Cは円の色を表わします。値域は[0,255]です。入力画像に円を追加した画像が出力フォルダ(./output)内に保存されます。名前はinitial_loop.jpgです。 この円が初期閉曲線となります。初期閉曲線をオブジェクトの外側に設定する場合と内側に設定する場合とがあります。前者の場合、LevelSet法は初期閉曲線を内側に向かって収縮させ、後者の場合、外側に向かって膨張させます。試行錯誤により適切な(X, Y, R)の値を見つけます。

③LevelSet法の実行


最初にLevelSet法に渡す各種パラメータの値を設定ファイルに書き込む必要があります。名前は任意です。ここではparamsとします。以下にparamsの例を示します。 各パラメータの意味は以下の通りです。
  1. time_step: 時間発展の刻み幅
  2. time_step_number: 時間発展の繰り返し数
  3. space_step: 空間刻み幅。x軸方向、y軸方向ともに同じです。
  4. constant_speed: 速度関数の定数部分の値(後述)。
  5. epsilon: 速度関数に現れるεの値(後述)。
  6. sigma: 入力画像に施すガウスぼかしの度合い。
当該アプリで使用している速度関数 は以下で定義されます。

ここで、 は曲率です。constant_speed に相当します。閉曲線を内側に向かって収縮させるなら負の値を、その逆なら正の値を設定します。また、epsilon に相当します。
設定ファイルparamsを作成したら、以下を実行します。 -Fの後ろにparamsへのパスを書きます。実行している間、プログレスバーが表示されます。今の場合、時間発展は400ステップ行われ、10(-Tの後ろに記した整数値)ステップごとに画像が保存されます。保存先はディレクトリ./output、ファイル名はfront_xxx.jpgです。ここでxxxは整数値です。標準出力の末尾に計算時間(画像保存時間も含む)が表示されます。上の場合、40枚の画像が保存されます。これらの画像をffmpegで動画にしたものが最初に示したデモです。

理論

理論は こちらにまとめました。当該アプリではNarrow Band法を採用しています。

三次元実時間対応にしたいですね(追記)。

0 件のコメント:

コメントを投稿