Open shigetosenoo opened 8 years ago
私の環境はubuntu14.04でgcc version 4.8.4を利用. ソフトウェアは https://www.janelia.org/open-science/optical-flow-time-lapse-microscopy-using-super-voxels からダウンロード.
展開して出来たOpticalFlowの中で mkdir build cd build cmake .. make と実行.大量にエラーが出る.
コンパイラのバージョンによって?ヘッダ等のicludeの追加設定が必要だったり不要だったりするもよう. SLICinterface.cpp にstring.h, SLIC.cppにstring.hとlimits.h, opticalflow.cppにcstdlib, multithreadLBFGS.cppにstdio.h,string.hをinclude.
Makefileの中で"libtools -static -o"とするとエラーが出るので, http://stackoverflow.com/questions/11344547/how-do-i-compile-a-static-library 上記を参考に."ar rcs"と修正.
../generatorがnot found と言われるので,mylib/MY_TIFF/generatorをbuild/mylibへこぴコピー.
これでmakeが成功しopticalflowの実行ファイルが出来る.
README.txtには terminal> opticalFlow syntheticData/rawData/TM00000 syntheticData/rawData/TM00001 syntheticData/rawData/test_backgroundPredictionIlastik_00001 syntheticData/opticalFlowOutput.bin 25 と書いてあるが,これだとSegmentaion faultが起きる. 正しくは, terminal> opticalFlow syntheticData/rawData/TM00000/test_00000 syntheticData/rawData/TM00001/test_00001 syntheticData/rawData/TM00001/test_backgroundPredictionIlastik_00001 syntheticData/opticalFlowOutput.bin 25 と実行する.
求めたフローはsyntheticData/opticalFlowOutput.binに入っているがバイナリのため,そのままでは開けない. 「The optical flow from TM00001 to TM00000 should be stored in binary file syntheticData/opticalFlowOutput.bin. The output binary file is stored in floats and has three channels (x,y,z optical float), with each channel beign the same size as the input images.」とのこと.
瀬尾先生:色々あったけれど、インストールはうまく行って、出力もあった、ということですね。 時間追跡して同一物体がどれかを決める処理がうまく行くのは、プロジェクトの肝なので、よい方法ならぜひ使いたいです。「追跡」がうまくいった後、それを「整数値」分離して4次元ボクセルに直せると、そのあと、別のアプリのアルゴリズムとかに乗せられるのですが、出力の変換も行けそうでしょうか? 山田
山田先生:はい,とりあえず出力までいきました.これの中身を見るとどうやら32bitのfloatになっているようです.xyzの各座標にxyz方向のフローが入っているはずなのですが,一本の数列になっているような状態です.これから並びを特定して可視化してみたいと思います.
test_00000.tifとtest_00001.tifをそれぞれ3D volumeで表示してgifアニメにしたもの.ガンマ補正してノイズを抑制.3Dイメージの大きさは96x128x26,グレースケール.
上の動画像のオプティカルフロー.黒の点がフローの原点で赤の線がフロー(displacement).
フローを描くためのRのコード.恥を恐れずfor文を使う.
#バイナリファイルの読み込み(32bit float)
to.read<- file("opticalFlowOutput.bin","rb")
vec<-readBin(to.read, numeric(),128*96*26*3,size=4)
close(to.read)
#フローのプロット
array<-array(vec,dim=c(96,128,26,3))
carray<-apply(abs(array),c(1,2,3),sum)
xarray<-array[,,,1]
yarray<-array[,,,2]
zarray<-array[,,,3]
coords<-NULL
arrows<-NULL
for(x in 1:96){
for(y in 1:128){
for(z in 1:26){
if(carray[x,y,z]!=0){
coords<-rbind(coords,c(x,y,z))
arrows<-rbind(arrows,rbind(c(x,y,z),
c(x+xarray[x,y,z],y+yarray[x,y,z],z+zarray[x,y,z])))
}
}
}
}
library(rgl)
plot3d(coords,xlab="x",ylab="y",zlab="z",xlim=c(1,96),ylim=c(1,128),zlim=c(1,26))
segments3d(arrows,xlab = "x", ylab = "y", zlab = "z",col="red")
3D+時間=4Dですが、空間2次元(x、y)の解像度と空間1次元(z)と時間次元との解像度に大きな格差があるので、おそらく (A) 4Dで攻める (B) 2D空間特徴量の時間変化を追う のように「3次元物体映画」と「2次元物体映画」との両方を解析の対象とすることになると思います。 そのときに、2次元と3次元とを別立てて解析処理することにすると、初期プロトタイプ段階は楽だとしても、2年後くらいには嫌になると思っています。というわけで、ある意味任意次元にしようと思っていて、そのうえで、以下のような処理が必要になるかなーと思っています(トポロジーについては今のところ不要)。
以下で言うところの「クラスタ」は「時間次元、コミ」の連結成分のつもりです。
11月5日にお会いするときに、詳しく議論できればと思っています。
Voxel x time = 4D data
3D x 1T とする
3Dごとに周縁をメッシュ化する
Fiaringアルゴリズムにて、正球にまで変形する
球面スカラー場とする
球面調和級数関数分解する
スペクトルの時間微分をとる
かたちの比較:スペクトル比較 動きの比較 :スペクトル時間微分の比較
阪大の瀬尾です.
3Dのオプティカルフローについて調べており, Amat, F., Myers, E. & Keller, P. Fast and robust optical flow for time-lapse microscopy using super-voxels. Bioinformatics 29, 373–380 (2013). の論文が,自作のソフトウェアとITKの実装(Demon法)を比較していますので,これを再現+αしてみようと思います.
この論文は,3Dでオプティカルフローを求める際に,SLIC(Simple linear iterative clustering)法 https://www.youtube.com/watch?v=TGaNGktTlhQ を利用したSupervoxelを考えてこれを計算に使うことで計算量を削減しているようです. この著者らの自作のソフトウェアはITKのコードを利用していないかもしれません.