B-Spline FFD with Plastimatch

Plastimatchを用いると, DIRが可能です. ただしコマンドラインでの実行になります.

DIRは細かなパラメータがたくさんありますので, コマンドラインでの指定はなかなか大変なためか, Platimatchも, いちいちすべてのパラメータをコマンドラインで入力しなくていいように, コマンドファイル(command_file.txt)を作成し, そこにパラメータは記載し下のように実行します.

“>plastimatch registrer command_file.txt”

plastimatch: コマンド

register: 第1パラメータ, させたい処理を指定. 他に”add”, “compare”, “segment”, “threshold”などなど一般的な画像処理用のパラメータもあるようです.

command_file.txt: うえで述べた(今回だと)DIRの処理のパラメータを記載したファイル. 名前に .txtと付いているところで分かるように, テキスト形式のファイルです. command_fileのところは, 間違わなければ何でも構いません.

B-splineでDIRさせる際には, Demonsと比べ割と簡単なパラメータ設定で可能なようです. 下がcommand_file.txtの中身です. とは言っても, これはPlastimatchのサイトのドキュメントにあるサンプルそのままです.

 

# command_file.txt
[GLOBAL]
fixed=deojohn250.mha       #基準画像のファイル
moving=deojohn165.mha   #変形される画像ファイル
img_out=deojohn_bspline_warped.mha  #変形後の画像を出力するさいのファイル名
xform_out=deojohn_bspline_coefficients.mha  #今回の結果を元に再度実行する際にxform_inにこのファイルを指定することで, 今回の結果を修正するように実行できる.
vf_out=deojohn_bslpine_vf.mha  #Deformatin vectorのデータ

[STAGE] #粗い解像度から始めて3段階(3Stage)でDIRする設定.そのため[Stage]の設定が3つある. 下に行くほど細かく解像度も上げている.
xform=bspline  #B-splineの指定
impl=plastimatch  #ITKの実装(itkと指定)とplastimatchの実装が使えます.
threading=openmp #マルチコアなCPUを使う際に指定.
max_its=30  #最大繰り返し回数
regularization_lambda=0.005  #正規化の重み係数
grid_spac=100 100 100  #FFDのコントロールポイントのグリッド配置(各軸100 pix ごと)
res=4 4 2 #解像度を x,y,z 軸それぞれ 4 pix, 4 pix, 2 pixをまとめ1 pixにする.

[STAGE]
max_its=30
grid_spac=80 80 80
res=2 2 1

[STAGE]
max_its=30
grid_spac=60 60 60
res=1 1 1

入力ファイル, 出力ファイルともに3DSlicerでサポートされている mha形式にしました. DICOM形式の画像はそのままでは指定できませんので, 3D Slicerなどで読み込んだあとmha形式で保存して使うのがいいかもしれません.

 

 

 

PlastimatchのFDKのフィルター

PlastimatchのFDKコマンドで再構成フィルタとしてrampフィルターが指定できる. ただし, rampフィルターのみ. そのため, どこでフィルタされているか,また別なフィルタを使いたい場合にどこを修正すればいいかコードを確認した.

まず, plastimatchはCUDAが使えるので, CUDA用コードとCUDAなし用コードがある. CUDA用コードは関数名の頭にCUDA_  が付くいて後は同じ名前になっている.

Githubなどからソースは取得済みである前提で.

FDKのソース: plastimatch/reconstruct/fdk.cxx

この中の reconstruct_conebeam(…) でFDK再構成をしている.  また更にこの中で,

proj_image_filter(…) を呼びここで投影像にフィルターを掛けている.

proj_image_filter()は proj_image_filter.cxxで記述されている.

 

Proj_imaeg_filterのソース: plastimatch/util/proj_image_filter.cxx

proj_image_filter()は単にramp_filter()へデータを渡すだけのラッパー.

将来的にここでフィルターの切り替えを考えているのかも.

 

ramp_filterのソース: plastimatch/util/ramp_filter.cxx

ここでramp_filterを実装している. とりあえず, このコードをいじってComplieすれば /ramp指定で書いたフィルタになる.

Plastimatch

コマンドラインで使用するレジストレーションソフトがあります.DIRも可能.  Win, Mac, Linax対応.

http://plastimatch.org/

主にRigid/Deformable レジストレーション処理や, 画像合成や抽出, セグメンテーションも可能です. DICE係数を求める処理もあります. その他, フェルドカンプ法による画像再構成やDigitally reconstructed radiograph 作成もできます. DIRに関しては, ITKのライブラリを用いた処理も可能です.

コマンドライン ソフトであるため慣れていない人には戸惑うことになるのではと思います.  nVidia ボードがささったPCであればCUDAを用いた処理も可能です.

少し使い方

DICOM形式サポートを書かれていますが, ボリュームデータとしては(多分) そのままは扱えないため, ITKで使われる形式(nrrd, mha etc…)などに変換して使うことになります. 変換の仕方は

#plastimatch convert --input dicom-in-dir --output-img outfile.nrrd

dicom-in-dir: DICOM形式のボリュームデータがあるフォルダ

outfile.nrrd: 出力ファイル名. 拡張子で出力ファイル形式を指定.  mhaかnrrdがPlastimatchでは標準のよう.

 

レジストレーション

rigidにしろdeformableにしても registrationはコマンドファイル(処理の設定ファイル)を作る必要があります. コマンドファイル(command_file.txt) を作成したら, plastimatchでのコマンドは単純に下のようになります.

#plastimatch register command_file.txt

command_file.txtの中身が重要で, 色々指定できますが単純には下のようになります. この例はrigid registrationの例.

# command_file.txt
[GLOBAL]
fixed=image_1.mha
moving=image_2.mha
img_out=warped_2.mha

[STAGE]
xform=rigid
optim=versor
max_its=30
res=4 4 2

 

#以降はコメントのようです. fixedで指定されているのが合わせられる画像(参照画像), movingが移動/変形される画像.

img_outが変更後の出力画像. 変形方法にrigidが指定されているので6軸(3軸平行移動, 3軸回転)の変換となります.

optimが最適化の方法を指定するようでうが, 幾つか指定できる種類はあるのですがversorがどのような最適化かは詳しく書かれていません.

max_itsは最適化の最大繰り返し回数, resはおそらく変形を計算する際の解像度だと思います.

 

コマンドラインとしてはちょっと使いづらいという人は3Dslicer というソフトを用いると, 少しだけplastimatchが使いやすくなるようです. 3DSlicerではPlastimatchと連携してレジストレーション処理ができるようです. ただ, コマンドファイルを作らないといけないのは変わらないようです. (処理も大分遅いかも)

 

ImageJ pluginでライブラリがない等のエラーの時

内部でapacheのcommonライブラリを使っているものがあると思います.
また, 開発にNetbeanを使用しているため, netbeanの配布ライブラリも必要な場合があります.
(確実に使っているものは一緒にライブラリファイルへのリンクを書いておきました)

もし,plugin実行時にそれらライブラリがないなどエラーが出たら, これらファイルを解凍してpluginフォルダに一緒に入れてみてください.

Neccessary_jars

Add_DICOMheader (ImageJ plugin)

ImageJで開いている画像(StackでもOK)に別なDICOMファイルからDICOMヘッダーを移植します. ただし内容は確認していませんので, マトリックスサイズやエンディアンなどその値でいいか確認しておいてください.

注意: ファイルは圧縮してあります. 解凍してpluginフォルダに入れてください.

add_DICOMheader.java

OpenCT_withSort (ImageJ plugin)

複数のCT画像(MRI画像も可能かもしれませんが未確認) をイメージ番号順, もしくは位置順に並び替えてStackにして開きます.  ImageJでは一般にファイル名順に開くので, たまにそのままStackにすると画像順が正しくない場合があります. その問題に対応したpluginです.

注意: サイトの制限からファイルはzipで圧縮してあります. 解凍してからImageJのpluginフォルダに入れてください.

OpenCT_withSort.java