運動解析プログラム VMAPについて

気泡の追跡 前記事の続きですhttps://ghost.mydns.jp/wordpress/%e9%81%8b%e5%8b%95%e8%a7%a3%e6%9e%90%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0-vmap%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/

左上のノズルから水中に吹き込まれた空気によってできた気泡の動きを捉えた動画です。これは普通のAVIファイルです。

ここから8個のROIを定義して、それらを独立して追尾(トレース)した結果が次の動画です。

途中トレースが途切れたり、ジャンプしたりしているのは他の気泡に隠れたりしたケースです。その場合は一致度が高いトレースが切れるわけです。ここで一致度というのは、相関値で評価されますが、この場合の相互相関値(Zero-mean Normalized Cross-Correlation: ZNCC)は次の式で与えられます。

ここで二つのROIで示される部分画像領域\(f_i\)と\(g_j\)において、\(\overline{f}\)\(\overline{g}\)はそれぞれROI内の\(f_i\)\(g_j\)平均値を表します。この式をよくよく眺めてみると、平均値でノーマライズされていますけど、画素数の次元数を持ったベクトル\(\vec{f}\)とベクトル\(\vec{g}\)と見なすことができます。3次元以上のn次元空間に置かれたベクトル\(\vec{f}\)とベクトル\(\vec{g}\)というのは想像しにくいかもしれません。ROIに含まれる画素の数が縦10ピクセル横10ピクセルで100画素ならば、100次元空間の一つのベクトルということになります。その仮定で、再度上の式を眺めると、分子はベクトル\(\vec{f}\)とベクトル\(\vec{g}\)の内積、分母はベクトル\(\vec{f}\)のノルム(大きさ)ベクトル\(\vec{g}\)のノルムの積ということになります。

こう表現すると、ピンと来ますよね。正規化相関値というのは、二つのROIに含まれている画素値を持ったベクトルとベクトルのなす角度の\(\cos\)であるということに…..。なので、二つのベクトルが一致したら、相関値は1でなす角度は0となり同じ方向を向いているということを意味します。数学的意味はそうなのですが、これを計算するのは膨大な積和計算が必要となります。ROIが多数あれば負荷も増えていきます。

VMAPについては詳しくは筆者が大昔に書いた論文等を参考にしてください。Versatile Motion Analysis Programとかのキーワードでなんとか検索に引っかかると思います。

この記事では正規化相関値について述べました。VMAPは20年以上たった今も少しのメンテナンスを経て、最新版のC++ Builder CEでBuildできます。大昔のテクノロジーであるVideo for WindowsとかDDEとかが今でも動くというのはありがたいことです。もっともDDEについてはIgor Proのサポートは今のバージョンでは打ち切られているはずです。上で膨大な積和計算と書きましたが、それなりの工夫をしないと高速化はできませんので、後にC++ Builderから離れて、OpenMPとかCudaへ浮気したのでした。その話は別記事で書くかもしれません。

コメント