3D Slicerによる計測 Markups

2024年9月17日

OS: ubuntu 22.04

Slicer version 5.7.0

3D Slicerで長さを測りたい, 角度やROIを用いた面積・体積を測りたい場合などMarkupsモジュールを使うことで可能となる. Markupsは3D Slicerの標準機能なので追加のインストールは必要ない. Markupsモジュールはポイントを設定したり, ラインを描いたりすることに使われるが, 単にそれだけなく計測をすることも可能になっている.

メニューのModuleのプルダウンをMarkupsに合わせるとしたのような画面になる. ほとんど直感的に使用できるため, 1度使ってみてはと思います. 一例として, 曲線の長さを測る場合を示します.

まず, 上記画面のようにModuleのリストからmarkupsを選択して, markupsの画面(左画面)を出します.

上記ボタンが出ていなければ, [Create Markups]の左にある黒三角をクリックすれば表示されるはずです.この左画面のいくつかのボタンはそれぞれポイント(point list), 直線(Line), 角度(Angle), 曲線(Curve), 閉曲線(Closed Curve), 面(Plane), 関心領域(ROI)を作るボタンになります. 使いたいものを作って(描いて)それを計測に使うことになります.

今回曲線の距離を測るので, [Curve]を選択しました. ボタン1回押すごとに, 上記画像の下部にある[OC]という項目が増えていきますので注意してください. このOCが今回計測するための曲線になります.

次に画像が表示されている画面上で点を取っていきます. このあたりはどのようなソフトでも同様です. 最後はダブルクリックで終点が設定されます.

上記画面ではすでに曲線に関する数値が出ていますが, それらの表示項目を設定するのが, 次の[Measurements]の設定になります. したの画像のような画面が出ていなかれば[Measurements]横の黒三角をクリックするとこで表示されます.

Measurement settingにある項目は, 選択したmarkupの種類, 今回は[Curve]を選択したので, それに合わせて測定できる項目が変わります. [Curve]には, length, curvature mean, curvature max, torsion mean, torsion maxが選択できます. ここでチェックをつけた項目が[Measurement setting]の上の部分に数値が表示されます. また,画像上でも表示されることになります.

今回の例では, たわんだボーラスの長さを計測していますが, 結果は276 mmとなっています.

計測した数値は自身でメモる必要があります. [Measurements]の少ししたに[Export/Import Table]という項目があるので結果を表に出せそうに見えますが, こちらはmarkupを形成するポイントの情報を表示出力してくれるだけになります. それらは[Control points]で見れる情報と同じです. つまり,markup自体を外部保存したり取り込んだりするための機能のようです.

これら計測は直感的ですので, その他の設定項目やmarkupの種類など自身で試して確認してみてください.

3DSlicerの日本語化

2022.10.04

OS: ubuntu Linux 22.04

3DSlicer version: 5.1.0

概要

3DSlicerはデフォルトで設定できる言語が英語かフランス語です. 以前Twitterで知らせたように最近多言語化が進められています. その中で現状の翻訳を用いて日本語化するExtensionが公開されています. 本来は多言語での翻訳に使うためのものですが, これによって日本語化できますのでその方法を記しておきます.

また, 現状の翻訳を用いてと言ったように, 翻訳が完璧ではない場合もあります. 翻訳はWeblateで行われています. googleアカウントでログインすることができ翻訳の修正も可能になります. おかしな翻訳を見つけたら, ぜひ翻訳に参加してもらえればと思います.

準備

準備は,ちょっと初心者には難しいかもしれませんがQtというライブラリに収められた翻訳のための処理をする実行ファイル( lrelease, windowsであればlrelease.exe )を見つけるもしくはQtのライブラリをインストールしておくことになります. この記事で使用しているubuntu 22.04では,

/usr/lib/qt5/bin

にありました. またWindowsでは, Qt5を入れる必要がありますが, Cドライブ直下のQtフォルダにインストールした際には, 下のパスにありました.

C:\Qt\5.15.2\winrt_x64_msvc2019\bin

もう一つの準備として, 3DSlicerで国際化を可能にしておく必要があります. こちらは3DSlicerのメニューから「Edit」→「Application settings」を選び出てくる画面の左にある項目で「Internationalization」を選択します. Enable internationalization: という項目一つだけチェックリストであると思いますので, そこにチェック入れておいてください. 変更すると再起動が必要になります.

この設定をしておかないと, あとの日本語化のところでいくら設定しても日本語化されません.

Internationalization の設定

Language Packs extensionのインストール

3DSlicerのExtension Managerを開き, LanguagePacksというExtensionをインストールします. Language PacksはExtension Manager画面の左側カテゴリの「Utilities」のなかにあります. 下のアイコンがLanguage Packsになります. Language Packsは多言語の翻訳ファイルを読み込むためのExtensionになりますので, これだけで日本語化ができるわけではありません.

また最近Extension managerにextensionが表示されないこともあるので, ファイルからインストールす方法も記事にしておきましたので参考にしてください.

Language Packs extension

日本語化

3DSlicerの再起動後, Language Packsのモジュールを開きます. Modulesのプルダウンから,「Utilities」→「LanguageTools」を選択してください.

このモジュールで「Input Translations」のタブを展開するといくつか選択があります. その中から一番上のWeblateを選択肢, Languages: のところを「ja_JP」を選択してください.

次にSettingsタブを展開してQt “lrelease” tool path: に準備のところで確認したlreleaseがあるフォルダを指定します. その他の項目はおそらくそのままで大丈夫だと思います.

それらの設定を確認して, 「Update translation files」ボタンをクリックしてください. 日本語化に必要なファイルがダウンロードされます. ファイル容量は大きくないはずですので, すぐ終わるのではと思います. 私の環境では, 秒で終わりました. この日本語化のファイルが翻訳ファイルになります. Weblateのサイトで更新があった際に再度ここで「Update translation files」をすれば最新のものと置き換わります.

この時点でやっとボタンの下のApplication Languageが変更できるようになります. EnglishからJapaneseに変更して, 最後に「Restart the application」ボタンをクリックした3DSlicerを再起動させて終了になります.

Language Tools

Restart the applicationの下にあるテキストボックスには, Update translation filesボタンを押した際に進捗状況が表示されます. うまく日本語化できれば下のようになります.

日本語化後の表示

日本語の表示が分かりにくい, 文字化けするなどでもとの英語に戻したい場合は, 3DSlicerのメニューの「編集」→「アプリケーション設定」を選択し, 出てきた設定画面(一般の項目)にある言語を「Japanese」から「English」に変更し再起動してください. 一度上の設定をしたなら日本語に戻す際も同様に変更できます.

ちなみに, Language ToolsのモジュールにFind text タブがありますが, その中の内容は翻訳作業に使われるものになりますので, 今回単に日本語化するだけであれば使用しません.

3DSlicerのExtension ManagerにExtensionが出てこない場合の対処

OS: ubuntu linux 22.04LTS

3DSlicer version: 5.0.2 or 5.1.0

概要

3D Slicerは頻繁にアップデートを行っています. 現在5.1系であれば毎日新しいものが出ています(次のNightly build). そうするとよくExtensionを入れようとExtension Managerを開いてもExtensionが何も表示されないということがあります(特にLinux版で経験しています). そのような場合Extensionのファイルをダウンロードしてインストールすることが可能です. 今回その方法を記載していきます.

症状

3D Slicerを立ち上げExtensionをインストールしようとすると, 下のようにExtension Managerで一つもExtensionが表示されないことがあります. 通常であれば, 左側にextensionのカテゴリ分類のメニュー,右側にExtension のアイコンと名称が表示されるはずですが, 新しいバージョンを追っかけながらインストールしていると, このように何も表示されないことがまあまあの確率で起こります.

version 5.1.0のExtension画面での何も表示されない画面

この場合, 右上検索の隣に, 「Install extension from file」と吹き出しが出るフォルダのアイコンがあると思います. 上の図では日本語化されて「ファイルからインストール」になっていますが同じ位置にあると思います. このようなExtensionが表示されない場合でも, これを使ってインストールできます.

準備

ファイルからExtensionを入れるので, インストールしたいExtensionのファイルが必要になります. ExtensionのファイルはKitwareのサイトからダウンロードすることになります. ダウンロード先はもちろんURL直打ちでもいけますが, 3DSlicerのバージョンによって異なりますので, 使用している3DSlicerのバージョンに合わせる必要があります(バージョンが異なっても動く可能性はあります).

Extensionのダウンロードサイトに行く方法ですが, 3DSlicerの設定画面から移動することができます. 3DSlicerのメニューの「Application Setting」を選択して下さい.

Application Setting

ついで出てきた設定画面で左側のカテゴリからExtensionsを選択し, 右側の「Open Extensions Catalog website…」をクリックしてください.

Application settings のExtensions

そうするとブラウザが立ち上がり, 通常のExtension Managerと同様の画面をした下のようなWebサイトが表示されると思います. 下の図ではカテゴリでUtilitiesを選んでいるところです. 右上に今回の例ではLinux を使っているのでLinuxとなっていますが, Windowsの場合はWindowsになっていると思います. 間違っていた場合でもここを切り替えることで正しいOS用のものを選ぶことができます.

また, もう一つ3DSlicerのExtension Managerを開いたときは各Extensionの下には「Install」というボタンが表示されていたと思いますが, ここはダウンロードサイトなので直接インストールはできません. そのためボタンが「Download」になっています.

ここから必要なExtensionのファイルをダウンロードしてください. またダウンロードされたファイルがどこにあるか把握しておいてください.

Downloadサイトから必要なExtensionをdownloadする

Install

インストールは3DSlicerのExtension Managerから行いますので, 3DSlicerにもどります. 最初に確認した「Install extension from file」のアイコンをクリックしてファイル選択ウィンドを出して先程」ダウンロードしたExtensionのファイルを指定します. 通常ダウンロードしたファイルは「ダウンロード」フォルダなどに入っていると思いますので探してみてください. またファイル名にextensionの名前が含まれています(逆に言うと他の番号などもついています)のでわかるかと思います.

Extensionのファイルは複数のファイルがまとめられた圧縮ファイルになっています. そのためファイルタイプの指定は各種圧縮ファイルになっています.

Extensionファイルの指定

以上で終了です.

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を保存すればファイルに保存されます.

3D Slicerのビルド (Linux版)

2022.3.29

OS: Ubuntu 20.04

3D Slicer: Preview Release 4.13.0 revision 30742 built 2022-3-27

3D SlicerはOpen Sourceなソフトです. そのためソースコードが公開されています. ソースコードをもとに改変することも可能です. ビルドの情報は以外にたどり着きにくいところに置いてあったりします. もちろん英語で, ある程度プログラミングに慣れていないと理解できない記載も多いです.

はじめに注意事項

今回の記事では, 基本的には3DSlicerのDocumentationにあるDeveloper GuideのBuild Instractionsに書かれている内容を少しわかりやすく情報を追加して記載しています.

この記事の対象はLinux版です. (そのうち別記事でWindows版も載せたいと思います.)

ソースコードの取り寄せやすさから, バージョンは4.13 preview版としています(現在Release版は4.11). Preview版のため, 日々バグフィックスされて更新されていきます. 記事で対象としたソースコードは「3D Slicer: Preview Release 4.13.0 revision 30742 built 2022-3-27」ですが, 更新されるとrevision番号やbuiltの日付が変わって行きます. ビルドがうまく行かない場合は, revisionが上がるのを待つのも手かと思います.

Linux版の要件

まずはLinux版をビルドする場合, OSから注意が必要です. UbuntuなどDebian系のLinuxであれば一番問題が少ないと思います. その他に必要なソフトやライブラリがあったりします. Build instractionsに記載されている内容が下になります.

  • Git and Subversion for fetching the code and version control.
  • GNU Compiler Collection (GCC) for code compilation.
  • CMake
  • GNU Make
  • GNU Patch
  • Qt5 ver. 5.15.2
    • Multimedia
    • UiTools
    • XMLPatterns
    • SVG
    • WebEngine
    • Script
    • X11Extras
    • Private
  • libXt

この中で意識しないといけないのはおそらくGit, CMake, Qt5 くらいかと思います. Ubuntu20.04で他のソフトやライブラリを入れた覚えはありません(デフォルトで入っている)

Qt5ですが, Ubuntuのフレーバーによっては入っていないことがあります. Synapticsなどアプリをインストールするソフトで確認してみてください. その際, バージョンも確認することをお忘れなく. Ubuntu20.04は特に問題にはなりませんでしたが, あまり古いもの, 新しすぎるものもまたエラーになる可能性があります.

CMakeはコンパイルのための昔で言うMakefileを作ってくれるソフトになります. これもバージョンによってうまく行かない場合もあったりしますので, バージョンの確認をしておく必要があると思います. 最新リリース版は現時点3.22.3, RC版が3.23.0-rc5となっています. SynapticsやaptでインストールできるCMakeがあればそれで十分かと思いますが, 気になるもしくは問題がああった場合などから3.22.3を使ってはと思います. またコマンドライン版(cmake)とGUI版(cmake-gui)がありますが好きな方を使えばいいと思います.

Gitは, ここでの使い方はソースコードを取り寄せるソフトとなります. 正確にはバージョン管理ソフトですが, 今はソースコードを取り寄せる以外には使わないのでこう思っていても構いません. Gitはビルドにあまり関わりませんので, バージョンを気にする必要はないかと思います.

その他のソフトに関しても基本的にバージョンは把握しておいたほうが問題があった場合の解決の糸口になったりします.

ソースコードの取り寄せ (Gitの使用)

ソースコードはGithub.comで公開されています. 通常のファイルのようにダウンロードすることも可能ですが, ここは3D SlicerのガイドにそってGitで取り寄せます.

初めてGitを使う人はレポジトリを作成する必要があります.適当なところにディレクトリ(フォルダ)を作り, そこをローカルリポジトリにすればいいと思います. 私の場合はホームディレクトリに「repos」とディレクトリを作りました. そのディレクトリをGitで初期化します. 具体的な作業はターミナル(端末ソフト, WindowsでいうPowerShell)で行います. ターミナルを立ち上げてプロンプト(下では#マーク)に以下のコマンドを入力します. (1行1行実行します. そのため1行入力したらEnterキーを押してください)

# cd
# mkdir repos
# cd ./repos
# git init

1行目のcdは念の為です. ホームディレクトリなどレポジトリとなるディレクトリを作りたいディレクトリにいれば必要ありません. ホームディレクトリの下にreposディレクトリを作る予定でしたので, ホームディレクトリに戻るコマンドになります.

2行目でディレクトリ作成と3行目でそのディレクトリに入って, git initでレポジトリを初期化しています.

次にreposの下に3D Slicerのソースコードを取り寄せます. 上記処理した後, 以下のコマンドを入力してください.

# git clone https://github.com/Slicer/Slicer.git

これで逐次処理工程が表示され終われば, 「Slicer」というディレクトリが出来ており, その中に更に「Slicer」というディレクトリがありそこにソースコードがクローン(ダウンロード)されているはずです.

SlicerのBuild Instractionsではソースコードのクローン後, したのようにSetupForDevelopment.shを実行するようにありますが, 私の場合はこのような記載があることを気がついていなかったため, 無視して以下を実施しましたが, 特に問題はなかったです. 内容をざっとみるかぎり, Githubのユーザー設定等のようですので, 今回の処理にはあまり影響しないかと思います.

# cd Slicer/Slicer
#./Utilities/SetupForDevelopment.sh

ビルド環境の構築と設定(CMake)

ビルドは直接ソースコードをクローンしたディレクトリで行うのではなく, ビルド用のディレクトリを作りそこでビルドしていきます. ここでは, そのディレクトリをslicer413_buildとします. 下のようにディレクトリを作り, その中に入ります.

# mkdir ./Slicer/slicer413_build
# cd ./Slicer/slicer413_build

現状下のようなディレクトリの構造になっていると思います.

[ホーム]— repos–+– Slicer –+– Slicer –+– (ソースコードのディレクトリ群)
|
+– slicer413_build

現在, 空っぽのslicer-bディレクトリにいる(処理対象になっている)と思います. ここでCMakeを使って必要なソースコードの取り寄せや, ビルドの環境確認, 設定を行います.

ここからCMakeを使いますが, わかりやすいようにGUI版を使います. デスクトップのメニュー等からcmakeを選ぶか, ターミナルでcmake-guiを起動してください. ターミナルでは下のように入力します.

# cmake-gui

CMakeとソフト名を書いていますが, 実行ファイルは小文字ですし, Windowsとはことなり大文字小文字は区別されますので間違わず小文字で入力してください.

起動したら下のようなウィンドウが現れると思います. ここでまず指定するのが赤丸で印をつけた2つの項目です. 上がソースコードのあり場所, 下がビルドのためのディレクトリの場所を指定します. それぞれ右の「browse」ボタンから選択すればいいと思います. 下の例では, ともに /home/at/repos/… から始めっていますが, 自身の環境にわせて変更してください. これまでの説明の通りに実施してきたのであれば, repos/ から下は同じになっていると思います.

cmake-gui

ディレクトリ設定できれば, とりあえず左下の「Configure」ボタンを押します. すると下図のようにmakeファイルの形式を聞いてくるのですが, ubuntu(たいがいのlinux)であればそのまま(Unix Makefilkeのまま)「Finish」ボタンを押せば構いません.

「Finish」ボタンを押すと, 「Configure」ボタンの下のメッセージボックスに処理の状況が流れて最終的には下のように真っ赤になって終わると思います.

cmake-guiでは, 自動で設定した設定項目や何らかエラーがある項目が赤くなります. 自動設定された内容は問題ない場合がほとんどですので, 再度「Configure」ボタンを押せば白背景になります.

ここで赤背景の設定項目が残っている, もしくは下のメッセージボックスに赤字でエラーが出ている場合はエラーのある設定項目を修正するもしくは設定項目を追加するなど対処してください. そのような場合の多くが設定項目の名前になっているライブラリが無い(見つけられない)などですので, 手動で入力するか本当に無いのであればインストールするなりすることになります.

下のようにメッセージボックスに「Configuring done」と出ていればOKです. ただし, まだこの段階では環境設定は終わっていません.

ついで, 「Generate」ボタンを押して完了になります. 「Generate」ボタンを押すことで, Makefileが書き出され, ビルドのための環境が保存されます. 見にくいですが「Generate」ボタンを押した後にGenerating doneと出れば終わりです. cmake-guiのウィンドウを閉じても構いません.

これでslicer413_buildの中に多数のディレクトリやファイルが出来ていると思います.

Slicerのビルド

あとはビルドするだけになります. ビルドはmake一発です.

gitでクローンしたターミナルでも, cmake-guiを立ち上げたターミナルでも構いませんので, ビルドのためのディレクトリに移動してmakeを実行します.

# cd ~/repos/Slicer/slicer413_build
# make

makeコマンド後は, だいぶ時間がかかります. 私の環境で5, 6時間かかりますので気長に待ちましょう.

ビルド中にエラーがでたら, 基本的には何らか設定がおかしいことが考えられますので, cmakeから確認することになります.

無事終了したら, slicer413-buildの中のSlicer-buildの中に「Slicer」という実行可能ファイルが出来ていると思います. それを起動してうまく動くか確認してみてください.

リリース版へ

この記事のままビルドしたのなら, ビルドはデバッグバージョンでビルドされています. ビルドが問題なく終了し, 出来上がった3DSlicerも問題なく起動・ 処理を実施できることが確認できたらリリース版で再ビルドする必要があります. デバッグ版でも動きますが, 実行ファイルの容量が大きかったり目盛などリソースを無駄に費やしたりします.

リリース版にするためには一旦cmake-guiでの設定に戻りますのでcmake-guiを再度起動してください.

cmake-guiの設定画面で, 上部にある「Advanced」にチェックを入れてください. そうすると設定項目が増えたと思います. その中から「CMAKE_BUILD_TYPE」という設定項目を探してください (Advancedよこの検索で探しても可). 現在その項目に「Debug」が指定されていると思いますが, そこを「Release」に変更してください.

「CMAKE_BUILD_TYPE」を変更したら, 再度「Configure」ボタン→「Generate」ボタンを押して再度makeしてください.

makeが無事終われば同様に「Slicer」の実行ファイルがリリース版に置き換わっているはずです.

Package化

実際に出来上がった3D Slicerは「Slicer」だけでは実行できません. 必要なライブラリなどがありますが, ビルドしたフォルダ内にどのファイルが実行するためにいるものかよくわからないと思います. パッケージ化してひとまとめにすることで, 好きなところにインストールでき余分なファイルもなく便利になります.

パッケージ化もmakeを使います. ただし, makeを実行するディレクトリが異なりますし, パラメータも指定します.

実行ファイル「Slicer」があるSlicer-buildのディレクトリに移動します. そこでmakeを下のように実行します.

# cd ~/repos/Slicer/Slicer/Slicer-build/
# make package

うまく行くと, Slicer-4.13.0-2022-03-23-linux-amd64.tar.gz など圧縮してひとまとめになったファイルが出来上がります.

インストールするときは, このファイルをインストールしたいディレクトリに解凍すれば終わりです.

3DSlicer によるStructureごとのICE値の統計

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

JacobianとICEの求め方では全体の平均値や標準偏差などしかわかりませんでした. そのため, 次回にはStructure 毎の値を出す方法を書くように書きましたが, その方法はSegment Statisticsを使う方法で, すでに書いていることを忘れていました. ただ, Segment Statisticsの回では, ICEのデータを使ってという話ではなかったので, ざっくり流れと注意点のみ記載していきます. 具体的な処理は以前の記事を見てください.

Structureごとの値を取るのに, なによりすでにICEが求まっている必要があるので, そのやり方は下の記事を見てください.

またSegment Statistics モジュールの使い方は, 下の記事にあります.

Segment StatisticsでICE値の統計を取る際の注意点

Segment Statisticsで処理するのはScalar Volumeになります. RegistrationQAを用いて計算したデータであればScalar Volumeになっていますが, 他のソフトで計算したデータを3D Slicerに読み込んで統計を取ろうとした場合, Data モジュールでそのデータがvtkMRMLScalarVolumeNodeになっているか確認してください. 下はScalar VolumeになっているICEのデータの例です.

Segment Statisticsで統計データを求める下のように値が計算され表としてまとめられます.

ICEの結果の表

この表で, MinimumやMaximum, Mean, Median, Standard… がそれぞれStructureごとの最小値, 最大値, 平均値, 中央値, 標準偏差になります. 注意は, データ値をもととした平均などの値ですので, その単位はもとのデータに依存します. ICEの場合距離値となるのでScalar Volumeに保存されているのがcm単位なのか, mm単位なのか事前に確認しておく必要があります. Segment StatisticsはあくまでもScalar Volumeの画素値をLabelmap (Structureのデータを変換して作る)ごとに分けて平均などを取ってくれるに過ぎません.

結果の表は保存すると, Tab separate value(.tsv)かComma separate value(.csv)で保存されるのでExcelなどで読み込めます.

3DSlicerによるJacobianとICEの求め方

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

3D Slicerを用いてJacobian Determinant (jacobian)画像 およびInverse Consistency (ICE) 画像を計算する方法を記載します.

それぞれの画像から値を取る方法はまた別に記載します.

また, DIRの評価ですので, DIRがすでに終えている状態からの処理になります.

前準備

JacobianやICEを計算するために, RegistrationQA Extensionを使用します. 事前にExtension Managerからインストールしておいてください. 画面をキャプチャした時がたまたまなのかわかりませんが, アイコン画像が表示されませんでした(下のような感じです).

RegistrationQA Extension

前準備2つ目は, DIRで得られたDVF (3D SlicerでDIRした場合TransformNodeでも可)データをRegistrationQAの計算に使えるよう, VectorVolumeデータに変換します.

まずはDIR後のデータを一覧します. ReferenceをCT1, MovingをCT2としたDIRが順方向とし, deformedCT2が変更後のCT画像, ???_goとなっているものがDVFデータです. ICEを計算するのに逆方向も必要ですので逆方向で変形したdeformedCT1が変形画像, ???_returnとついているものがDVFデータです.

DIR後のデータ

順方向のDVFデータ, Transform_goと DVF_goどちらでもいいのですが, 今回名前の短く, モジュール名と重ならないDVF_goを使います.逆方向も同様です.

DVF_go, およびDVF_returnをTransformデータからVectorVolumeデータに変換します. 変換はTransformモジュールを使用します.

Transformモジュールに切り替えると, 下のようなパネルになります. その中で「Active Transform:」(図中上部赤丸)に変換したいDVFデータを指定します. 下の例ではDVF_goが選択されています. 逆方向の場合はここはDVF_returnとなります.

次に間の項目は無視して, Convertの見出しまで飛びます. Convertの設定項目で, Reference Volumeとoutput displacement fieldを入力します.

Reference Volumeは先に指定したDVFを得たときの(DIRしたときの)Reference画像を指定します. ここでは順方向のReference画像はCT1ですので, CT1を指定しています.

Output Displacement Fieldは変換後のデータ名となります. ここで注意ですが, 出力できるデータ形式は次の3つがあります.

Transformデータ(もとのDVF_goの形式と同じ), Volumeデータ, VectorVolumeデータ

必ず「Create new VectorVolume」もしくは「Create new VecorVolume as…」を選んでVectorVolumeに変換するようにしてください. 下の例では「Create new VecorVolume as…」を選んでDVF_go_scalarと言う名前になっています.

以上を設定したら, 後はApplyボタンを押すだけです. これも変換にしばらく時間がかかりますので気長に待ってください.

DVFデータの変換

Jacobian, ICEの計算

モジュールをRegistrationQAに切り替えます. モジュールの中の「Registration」の中に「Registration Quality Assurance」があるので, 選択してください. 事前にRegistrationQA Extensionを入れていればあると思います.

下がRegistration Quality Assuranceを選択した際のパネルです. 今回使うのは今まだ非アクティブですが, 下の方の「Jacobian Determinant」と「Inverse Consistency」ボタンです. 必要なデータが登録されるとアクティブになります.

RegistrationQAのパネル

次に, 使用するデータを登録していきます. この方法が直感的でなく, わからなくなるところです.

使用するデータを登録するにはパネル上部にある「Node」の一覧表で右クリックして出てくるメニューで「RegistrationQA」→「Assign node to:」と選んでいき, それぞれ適切なデータを適切な種類にassignしなくてはなりません.

下の画像では, CT1をReference Imageであるとして登録しました. その他Image系では, Moving image, Forward warped Image, Backward warped imageを登録します. 今回順方向ではCT2をmovingにしましたので, 同様な方法でCT2をMoving imageに登録しました.

データのassign

Forward warped imageは順方向での変形後の画像,Backward warped imageは逆方向での変形後の画像を指定すると思われます. Reference, Movingは順方向(もしくは逆方向)でのセットなのに, 変形後の画像は順方向, 逆方向両方を登録できることになります.

さらに 混乱を招くところですが, パネル一番上の項目にParameter Setというのがありますが, その下のプルダウン(下の図では「RegistrationQAParameters」を広げると「RegistrationQAParameters_Backword」というのが選択しにあります. おそらく, ReferenceとMovingを逆にして登録すればいいと思いますが, 再度変形後の画像を登録するのか, 登録知るのならどっちがforwardになるのか, よくわかりません.

Vector FieldへDVFを登録する際ですが, 方法はCTと変わらず登録するデータを一覧表から選んで右クリックし, 「Assign node to」で「Vector Field」を選んで登録します. Vector Fieldには「Forward」と「Backward」があり(!?) それぞれに, 前準備で変換したVectorVolumeのデータを登録します. Transformデータも登録できてしまうのですが, 計算はされません(しかもなんのエラーも出ません).

今回のようにJacobianとICEを求める場合は, Vector Fieldをassignすれば計算できます. CT画像も必要ありません. JacobianはForwardかBackwardのどちらかさえ登録すればアクティブになります.

データ登録がされると, パネル下方のTableの項目にAssignしたデータ名が表示されます. この表の続きには, JacobianやICEを計算したあとにそれぞれの値(平均や最大, 最小など)が入る項目もあります.

必要なデータの登録がすんだら「Jacobian Determinant」「Inverse Consistency」ボタンが有効になっているはずですので, それぞれをクリックして計算させてください. 一つ一つ計算させることになりますが, この計算もまた少し時間がかかります. 計算が終わるとそれぞれ計算された画像が表示されます. (下図はJacobianを表示)

また, Tableの中に「Jacobian (for)」と「Jacobian (Back)」があり, その並びに数値が入っていると思います.

さらに, データ一覧(パネル上部のIOの表) に, Vector FeildにassignしたDVFデータの尾末に 「-jacobian」や「-invConsist」とついたデータが出来ていると思います. これでJacobianやICEのデータが画像データとして作成されたことになります.

ここまでで, JacobianとICEを画像データとして作成できました. ただし, まだストラクチャに対して個別にそれぞれの値をとることが出来ていません. 次の投稿ではSegment statisticモジュールを使って数値を読む方法を記載します.

Plastimatch のExtension(SlicerRT)でDaemonsができるよう改良しました

OS: Ubuntu 20.04(Linux版はExtensionがInstall出来ない不具合が見つかりました), Windows10

3DSlicer Version: 4.13

Extension SlicerRT1.0.0

今回は具体的な話はさておき, 結果のみの記載しています.

以前PlastimatchのRegistrationのためのExtensionで, B-Splineしか出来ないと書きました. せっかくのポテンシャルがもったいないと思い, SlicerRT Extension (現在PlastimatchのExtensionはSlicerRTに統合されています) のソースコードを覗いたのですが, 実際やっていることはPlastimatchのコマンドの文字列(オプション含む)を作ってPlastimatchに送っているだけでした.

そのため, じゃあその文字列をDaemonsでDIRできるよう変更してやればDaemonsでDIRができるだろうとなりました.

ただし, B-Splineで有効なパラメータとDaemonsで有効なパラメータが若干違うのでその判別ができるようにする必要もありました. ただ, 主なパラメータはB-Splineのほうが多く, B-SplineのパラメータをDaemonsでは無効にすることで行けそうでした.

最終的に,

  1. 今のExtensionの画面を最大限利用して, Daemonsへの切り替えができるようにして, Daemonsに指定できないパラメータはB-Splineだけであることを明示する(値は入れれるけど, いれても無効になる)ようにパラメータ画面を変更する.

2. Daemons用のコマンド文字列を作るようソースをいじる.

3. いじったExtensionのソースも一緒にビルドしてSlicerRT Extensionをデフォルトで入っている状態にする.

としました. ソースコードはGITHUBから最新版をダウンロードしたのでSlicerは4.13になっています.

出来上がったのが, 下の画像です. Algorithmという選択項目が増えて, B-SplineかDaemonsを選べます.(あ, つづりが間違っている)

パラメータの設定が下のようになっています. (Only for B-Spline)とある項目がB-Splineの際にのみ有効な設定項目です.

Daemonsで実行してもちゃんと結果が出ます. 本当にDaemonsで処理されている? と疑問もあるかとおもいますが, 基本的に文字列作っているだけなので, そのコマンド文字列で動いているということはちゃんとDaemonsでDIRされているのだと思います. B-SplineとDaemonsの違いがどれだけかはまだ確認していませんが, 今後の予定です.

3D SlicerのSegment Statisticsの使い方

3D Slicerである点の画素値などを得る場合, マウスのある点の値はSlicerのウィンドウ左下にあるパネルで確認できます.

ある領域の画素値の平均などは, Segment Statistics モジュールを使うことで得ることができきます. 放射線治療のデータで言うと, ある輪郭への線量の平均値などを得るときにもこの Segment Statisticsモジュールが使えます. 単純にセグメントごとに対象データの統計的な値を出してくれるので何かと重宝するのではと思います.

今回はSegment Statisticsモジュールの使い方について記載します.

前準備 Labelmapを作る

Segment Statisticsで使用する”Segment”はBinary Labelmap のことになります. Segment Editor で作成したデータは基本的にvtkMRMLSegmentationNodeなので, labelmapではありません. そのため, SegmentをLabelmapに変換しておく必要があります.

まずDataモジュールで, 対象としたいSegment(ここではRTStructure)を選びます. 目玉マークが目が開いている(表示されている)ものがLabelmapに変換されますので, 必要な輪郭を表示, いらないものを非表示にしておいてください.

その後, SegmentationNodeで右クリックすると下図のようにメニューが出ますので,「Export visible segments to binary labelmap」を選択してください. 少し時間がかかる場合がありますが, これだけで変換は終わりになります. Dataモジュールの一覧に選択したvtkMRMLSgmentationNodeの名前(下図では「1:RTSTRUCT:ANON」)に「-label」と末尾についたvtkMRMLLabelmapVolumeNode (1:RTSTRUCT:ANON-label) が出来ていることを確認してください. ただし, もとのsegmentのようにpatientやGTVなどには別れていません.

DataモジュールでSegmentationNOでをLabelmapに変換

Segment Statisticsでのデータのとり方

Segment Statisticsで得られるのは統計的な値です. つまり平均値や最大値, 最小値, 標準偏差などになります.

ここで重要なのは, 出力されるデータの単位は対象とするデータ(vtkMRMLScalarVolumeNode)によることになります.

つまり, 線量分布を保存するScalarVolumeNodeを対象とすれば, 値はGyなど線量を示す値で出されます. 長さを表すScalarVolumeNodeであれば, mmやmなどの単位となります. そのため, 結果には単位が表記されません. 単位については対象データの方でしっかり確認しておく必要があります(とくに, mmなのかcmなのか, など同じものだけど桁が違う場合もありえます).

Segment Statisticsで対象にできるデータは, vtkMRMLScalarVolumeNode, vtkMRMLBinaryLabelmapNode, vtkMRMLClosedSurfaceNodeとなります. それぞれいられる出力は選択できるので,試して確認してみてください.

今回は, 治療計画のデータからSegmentごとの線量値の平均値などを取りたいと思います.

まず, Segment Statisticsモジュールですが, モジュールのプルダウンのなかの「Quantification」の中にあります.

Segment Statisticsモジュールを開くと, 下のような選択項目があります.

Segment Statisticsモジュールのパネル

ここで「Segmentation」に指定するのがLabelmapです (上図では名前の末尾に−lableがついてないですが). Labelmapにした輪郭ごとに統計的データが計算されることになります.

Scalar Volumeがまとめるデータが含まれるデータとなります.ここではRTDOSEを指定しています. つまり, 線量のデータを保存したデータなので, 輪郭ごとの線量値の統計データが出力されることになります.

Output tableは出力結果を表示する表データの指定です. 基本的には「Create new table」で問題ないと思います.

基本的には, これらを指定すれば後は「Apply」ボタンをクリックするだけです.

結果は下のように画像の下の表として出力されます. 下図の結果では, 出力する値を絞って選択してあります.

SegmentStatisticsの結果表示

出力される値の種類を選びたいときは2つ上の画像(Segment Statisticsモジュールのパネル)にある「Advanced」から, 「Enabled segment statistics plugins:」で対象Volumeに合わせてチェックを外したり, その横の「Options」ボタンをクリックすると, 下図のように計算する値を選択できます.

下図はSclar VolumeのOptionsですが, Labelmapやclosed surfaceのOptionもそれぞれに応じた出力の種類が列挙されており選択できる.

Scalar Volume statisticsのOptionsボタンをクリックすることで表示されるウィンドウ.

Labelmap statisticsはSegmentationで指定したLabelmapから, Scalar Volume statisticsはScalar Volumeで指定したデータから, Closed surface statisticsはLabelmapで閉じた領域になっているものから計算されると思います.

結果の表のデータは, Slicer本体のSave機能でテキスト形式やCSV形式で保存できます.

3DSlicerによるDice係数, Hausdorff distanceの求め方

Ubuntu 20.04, 3DSlicer Version: 4.11.20210226 (Extension SlicerRT)

3DSlicerでDice係数, HDを求める方法を説明します. ただし, 計算するには3DSlicerのExtensionのSlicerRTが必要となります. インストールの方法は「3DSlicerによるDIR: Install」をご覧ください.

前提として, 2つの輪郭セットがSceneに読みこまれている, もしくはDIR後であればhardeningされた状態であることが必要です.

Dice係数, Housdorff Distanceを求める

両係数の計算にはSlicerRTの「Segment comparison」を使用します. 下図のよう「Radiotherapy」モジュールから「Segment comparison」を選択してください.

「Segment comparison」モジュールの画面は下のようになります. ここで操作するのは「Input」の項目のみとなります.

「Input」のしたの「Reference segment」が基準となり, 「Compare segment」が比較するsegmentになります. ここでは,propagationの説明で作成した「ct1roi」と「ct2roi Copy」をReference Segment, Compare segmentとしました.

ここで指定したSegment(vtkMRMLSegmentNodeとなるもの)は輪郭のセットを表すので, 治療計画データを開いていれば複数の輪郭が含まれています. そのため, さらにどの輪郭を対象とするか選ぶ必要があります. Reference segment, Compare segmentそれぞれの下にさらに「segment」という選択項目がありますので, そこで対象の輪郭を指定します. 今回データは適当に開いたので, 一番似かよってそうなそれぞれのpatient輪郭を計算対象として選びました.

この計算対象輪郭は何も別なvtkMRMLSegmentNodeである必要もなく, 同じvtkMRMLSegmentNode(例えばct1roi)の中から別な輪郭を選んだり, 同じ輪郭を選んだりすることも出来ます(もちろんその際DICE係数は1となります).

計算対象の輪郭が設定し終えたら, 後は「Compute Housdorff distance」もしくは「Compute Dice metrics」ボタンをクリックするだけです. 計算はしばらくかかります. どちらかを計算すれば, もう片方はすぐに終わります.

結果は, それぞれの表の一番上の値となります. 下の図ではHDは62.1898, Diceは0.893319です.

これらの値の正しさは確認していないので, 使う際には各自で確認してください.