3DSlicerによるmarkupsを用いたDIRの方法

OS: linux Kubuntu 22.04 LTS

3D Slicer v5.0.2

Extension: SlicerRT

ここでは3DSlicerとSlilcerRTのPlastimatchモジュールを用いて, いわゆるFiducial markerを用いたDIRの方法を説明します. 少し把握しきれていないパラメータもありますが, 実行はできると思いますので色々試してご確認ください.

準備

必要なのはもちろん3DSlicerです. またExtensionマネージャーからSlicerRTを入れておいてください. 私の使用したバージョンは5.0.2ですが, Stabelですでに5.0.3が出ています. 方法は変わらないと思いますし,さらに古い v4系でも一緒だと思います.

まず,画像の読み込みを行っておきます. 画像自体はおそらくあまり影響しないと思いますが, マーカーを設定するのに画像領域が必要ですので, 適当な画像をDIR-DBから読み込みました.

画像読み込み

表示は点が取りやすいように4画面で上下2画面で1つのCTデータを表示しています.

対象点の設定

DIRの対象点のポイントリストを作成します. 作成にはMarkupsモジュールを使用します.

Markupsモジュール

Markupsモジュールは, 点や線, 領域など設定できますが今回は点を対象としたDIR(おそらく点でないとできないのではと思います)ですので, Point Listを選びます.

MarkupsモジュールでのPoint Listの選択

ボタン下のNode一覧が示されているところに新しいPointListが現れますので名前をわかりやすく変更しておきます. DIRする上でReferenceとなるPointListとMovingのPointListが必要になりますので区別できる名前としてReference用としてPL_Refとしました. また, PointListを作成した時点ですでに1つ目の点を設定できるようになっています. 画像上にマウスカーソルを持っていくとピンクの点がカーソル先端に手でいると思います. 画像上にクリックすることで1つ目の点の位置が決定となります. その位置の座標値(RAS座標系)が下の部分に表示されます.

ちなみに, 下の画像ではクロスヘアラインを表示させて点を設定する位置を確認しています. クロスヘアラインを出すには上部アイコンの右から4番目のアイコンをクリックすれば出せます. クロスヘアラインはマウスには連動してません. キーボードのシフトを押しながらマウスを動かすとマウスに追随してくれます.

PointListの作成

2点以上の点を設定するには, 画像上で右クリックして下図のようにメニューを出し「Place」を選択します. すると新たな点がマウスカーソル先端に出てきますので, 再度位置を確定させれば追加されます. 点の名前はPointListの名称の最後にハイフンと数字がついたものになります.

点の追加

同様にmovingとなる点を設定します. reference, movingともに3点設定しました. movingのPointListの名称を点の位置を設定してから変更したのでF_1-1などになっています.

間違えた場合は, RAS座標が示された上にアイコンがあるので, それらで一つ消す, 全部消す, コピー&ペーストなど可能となります. RAS座標の数値を直接編集することも可能ですし, マウスで画像上のポイントドラッグして位置をずらすことも可能です. アイコンなどにマウスを持っていくとtool tipsが出るので参考にしてください.

注意として, referenceとmovingで指定した点の対応は, PointListの順番でなされるようです. つまり, referenceで1番目の点とmovingの1番目の点といった具合です(おそらく, 要確認).

LandmarkWarp

作成したMarkupsを用いてDIRを行います. 使用するのはSlicerRTに含まれているPlastimatchのLANDMARKWARP Landmark Deformable Registrationです. ModulesからPlastimatchの「LANDMARKWARP Landmark Deformable Registration」を選択してください.

LANDMARKWARPの設定画面は比較的シンプルです. referenceとなるvolumeをFixed volumeに, movingとなるvolumeをMoving volumeに, さらにFixed Fiducialsに作成したreferenceのPointList, Moving fiducialsにmovingのPointlistを指定します. あとは出力画像としてOutput volume, DVFとしてOutput Vector field(vtkMRMLGridTransformNodeとなる)を指定する.

あと気にしなければならないのはNumber of ClustersがPointListの点(ペア)の数になっているかくらいです. Basis functionは補間の関数, その半径がRBF radius, Stiffnessは正規化の強度(重み付け)になりますので, 大きく変形するときは0.0に近い値にしておくほうがいいと思います. 0.1に下だけでだいぶ正規化が効くようになります.Default Pixel Valueの値はどう影響するのかわかりません.

設定が良ければ「Apply」ボタンを押して実行してください. ボタンの上に秒数が出るので計算されていることがわかると思います. Completedになると終了です. 私の環境ではこの設定で30秒程度かかりました.

LANDMARKWARP モジュール

結果の確認

結果の確認は, 変形された画像(Output Volumeでしたいしたデータ)も表示されるので変形した画像はその場で確認できます.

DVFを確認したい場合は, Transformsモジュールを使って確認します. モジュール画面の一番上にあるActive Transformに先程出力させたDVFを指定します.

次にDisplayタブを展開しvisibility, visibility in slice view にチェックを入れます. それによってDVFがヒョじされます. 下図ではグリッドを選んでいますが, 矢印や等高線を選択できます.

変形のDVFを確認すると, PointListで設定した点周辺のみが変形されていることがわかると思います. つまり他のところは変形対象にはならないみたいです.

Transformsモジュールによる結果の確認

上記の画像では, せっかく設定したPointListの点が変形前のままですので, moving用のpointlistをDVFにしたがって移動させ確認します. これはTransformsモジュールでそのままできます. Displayタブの下にあるApply transformタブを展開しTransformableにあるmovingのPointlist(PL_mov)を緑の矢印ボタンを使ってTransformedに移します. これで移動された点が表示されます. その位置で保存したければ緑の→下のメッシュが重なっているようなアイコンをクリックして確定させます.

変形された画像, DVFはすでにSlicerのsceneに含まれていますので, Sceneを保存すればファイルに保存されます.