今回はSPECT再構成ができるFiji(ImageJ)のプラグインをAIを使って作成したので、それを紹介します。もともとはSIMINDの出力を再構成するために作ったプラグインですが, SIMINDの結果を入力するところの処理は、今回書いてありません。次の記事で書きます(きっと)

SPECT画像の再構成を試してみたいけど、PythonやCUDAの環境を準備するのは少し大変ですよね。

入力ファイルの形式、投影角度、回転半径、散乱補正、吸収補正、PSF、subset数など、設定しなければならない項目もたくさんあります。計算が終わっても、本当に収束しているのか、どの画像を確認すればよいのか迷うと思います。

そこで今回は、Fiji/ImageJ上で動くFiji SPECT Reconstruction 0.1.0を、同梱されている合成サンプルを使って最初から動かしてみます。※SIMINDの出力結果は次回扱う予定です。

画面のどこを押すのかだけでなく、入力ファイルに何が書かれているのか、各設定が何を意味するのか、結果をどのように確認するのかまで順番に説明します。

※このプラグインは趣味用です。臨床利用のための検証・認証は行われていません。本記事の合成画像も画質や定量精度を保証するものではありません。

もくじ

  1. このプラグインでできること
  2. Fijiへプラグインを入れる
  3. 合成サンプルを開く
  4. 入力ファイルの中身を確認する
  5. 入力を検査・プレビューする
  6. 撮影条件を確認する
  7. 散乱補正・減弱補正・PSFを設定する
  8. OSEMとBSREMを設定する
  9. 平滑化・出力を設定する
  10. 感度校正とBq/mL出力を設定する
  11. 条件一覧を整えて全条件をテストする
  12. 本番計算を実行する
  13. 4画像比較と収束グラフを確認する
  14. 保存済み画像へフィルタを再適用する
  15. 一時停止・中止・再開
  16. 保存されたファイルを確認する
  17. 自分のデータへ置き換える
  18. よくあるエラーと確認事項

このプラグインでできること

Fiji SPECT Reconstructionは、CPUだけでSPECTの3次元再構成を行うFijiプラグインです。実行時にPython、PyTorch、CUDA、外部の計算プログラムは必要ありません。誰でも使えるようにしたいというのが動機です。

含めた機能は以下のような感じです。

  • OSEMとadditive BSREM-IIによる再構成
  • DEW・TEW散乱補正
  • CTを利用した吸収補正
  • 固定PSF・距離依存PSF
  • Gaussian・Butterworthフィルタ
  • 検出器別の感度校正とBq/mL、kBq/mL出力
  • 複数条件の連続テスト・連続実行
  • 計算途中の保存、一時停止、再開
  • 代表3時点と最終画像の4画像比較
  • 横断・冠状・矢状断の連動表示
  • 収束グラフと数値表の表示
  • 保存済み未フィルタ画像へのフィルタ再適用

初めから自分のデータを使うと、入力形式の問題なのか、撮影条件の問題なのか、再構成条件の問題なのか分からなくなりがちです。まずは同梱サンプルを最後まで動かして、全体の流れを確認しましょう。

Fijiへプラグインを入れる

古いJava 8版のFijiではなく、Java 21を同梱したFiji Latestを使用します。Fijiは公式配布ページから入手できます。(結構時間かかるので、ミラーサイトをいくつか試して、一番速いのを選んだ方がいいです。私のケースではフランスは遅かった)

  1. FijiのZIPを展開します。
  2. Fiji_SPECT_Reconstruction-0.1.0.jarを、Fijiフォルダ内のpluginsフォルダへコピーします。
  3. Fijiを起動します。すでに起動していた場合は、いったん終了して起動し直してください。
  4. Fiji下部に表示されるJavaのバージョンが21系であることを確認します。(Help>about ImageJ…でも確認できます)
  5. Plugins → SPECT Reconstruction → Reconstruct from MHDを順番に押します。

上の画面では「Java 21.0.7 [64-bit]」と表示されています。プラグインが見つからない場合は、JARを入れた場所とFijiの再起動を確認してください。「SPECT Reconstruction (ImageJ1)」というのは無視してください。(削除すればよかったんだけど)

メモリ設定を確認する

RAM 8 GB程度のPCでは、FijiのEdit → Options → Memory & Threadsを開き、最大メモリを2~3 GB程度から試します。値を変更した場合はFijiを再起動してください。大きくしすぎるとWindows側のメモリが不足します。すでにFijiで開いている画像もメモリを使うため、不要な画像は閉じてから再構成します。

サンプルを開く

プラグインを開くと、左側に1~8のページ、上部に条件の保存・読込・再開・比較ボタン、右側に簡易プレビュー、下側に実行ボタンが表示されます。

  1. 上部の条件JSON読込を押します。
  2. 配布フォルダ内のexamples/synthetic/demo-job.jsonを選びます。
  3. 主ウィンドウ、下側ウィンドウ、上側ウィンドウ、CTの欄へパスが入ったことを確認します。

demo-job.jsonには相対パスが保存されています。そのため、配布フォルダを別の場所へ移動しても、JSONと入力ファイルの位置関係が変わっていなければ読み込めます。

入力ファイルの中身を確認する

SIMINDを使ったことがあるならご存じだと思いますが、投影画像は1つのファイルではなく、MHD+RAWの2ファイルとしてください。DICOM形式ではなく、MetaImage形式です。

  • MHD:画像の大きさ、画素間隔、数値型、RAWのファイル名などを書いたテキスト
  • RAW:実際の画素値が並んだバイナリデータ

RAWをテキストエディタで開いても人が読める数字にはなりません。入力欄ではRAWではなくMHDを選択してください。

MHDの例(テキストエディタで開いた様子)

サンプルのmain.mhdをテキストエディタで開いた画面です。特に確認するのは次の項目です。

距離の単位は [mm] です。

項目意味サンプル
NDims次元数3
DimSizenu、nv、view数
(検出器の横, 縦, 投影方向の数)
32 24 24
ElementSpacingu、v、3軸目の間隔(ここは別ファイルの値を使うので1.0としておく)3.0 3.0 1.0
Offset最初の画素中心の物理座標-46.5 -34.5 -11.5
TransformMatrix方向行列単位行列
ElementType画素値の型MET_FLOAT
ElementDataFile対応するRAWmain.raw

投影配列は(view, v, u)、MHDのDimSizeはnu nv nViewsです。RAW内部ではx方向、つまりu方向が最も速く変化します。CTや再構成画像は(z, y, x)で、DimSizeはnx ny nzです。

投影MHDの3軸目のElementSpacingは角度として使用されません。角度は次に説明する角度ファイル、または画面上の開始角・角度刻みから決まります(形式的に1.0を入れておいてください)。

角度ファイル

angles.txtは1行1角度、単位は度です。サンプルは0度から345度まで15度刻みで24行あります。投影画像が24 viewsなら、角度も必ず24行必要です。

角度ファイルを使わない場合は、画面で開始角、正の角度刻み、CWまたはCCWを指定します。装置から出力された投影の並びと回転方向を確認してください。

COR距離ファイル

distance.corの1列目は、各viewにおけるCORからコリメータ表面までの距離です。

今度は単位が[cm]なので注意。

角度ではありません。2列目があっても、このプラグインでは使用しません。

距離ファイルを使わない場合は、画面の「一定距離 ROR cm」を使用します。距離依存PSFを使うときは、距離の意味と単位を特に確認してください。

条件JSON

demo-job.jsonには、入力パス、撮影条件、補正、再構成、フィルタ、感度校正、保存先などがまとまっています。OSEMとBSREMの2条件も同じJSONに保存されています。

JSONを直接編集することもできますが、そんな使い方は想定していません。繰り返し使用する場合には、いろいろ設定した後に、上部の条件JSON保存を使って保存してください。その条件を再度使いたい場合は条件JSON復元を押してください。

入力一覧CSV

入力ページの入力一覧CSVを保存を押すと、入力パス、撮影条件、MHDとRAWのSHA-256がCSVへ保存されます。ファイル一式とCSVを同じ共通フォルダへ入れておけば、フォルダごと移動した後も復元できます。

入力一覧CSVを復元したとき、ファイル内容が保存時から変わっていれば復元は停止します。別のデータへ誤って同じ条件を適用することを防ぐためです。再構成条件一覧はCSVではなく、条件JSONへ保存してください。

同じ再構成条件を再利用する → 条件JSON
使用した入力データ一式を記録・検証する → 入力一覧CSV
という感じです。ちょっと難しいけどあったらいいなと思って実装しました。

入力を検査・プレビューする

  1. 左側の1 入力ファイルを押します。
  2. 入力を検査・プレビューを押します。
  3. 画面下の状態表示が「入力検査完了」になるまで待ちます。
  4. 右側に投影画像が表示されることを確認します。
  5. 右上のプルダウンをmain、lower、upper、ctへ切り替え、入力を見比べます。
  6. 下のスライダーを動かし、viewまたはCTスライスを送ります。

サンプルでは、投影が32×24画素、24 views、画素間隔3.0×3.0 mm、MET_FLOAT、RAW約0.1 MBと確認できました。

この検査では、RAWのバイト数、画素型、endianness、NaN・Inf、危険な相対パス、ウィンドウ間のサイズ・画素間隔・原点・方向、角度・距離・時間・検出器情報などが確認されます。main、lower、upperの形式が一致しなければ実行できません。

MHDに必要な情報がない場合は詳細を開く:MHD不足情報から補えます。ここで入力した値はMHD自体を書き換えません。すでにMHDに値がある場合はMHD側が優先されます。分からない値を推測で入力するのはやめましょう。

撮影条件を確認する

左側の2 撮影条件を押します。

  1. 入力単位をCOUNTS、CPS、CPS_PER_MBQから選びます。
  2. 1 viewの時間 sを入力します。
  3. CPS_PER_MBQの場合は撮影中の平均放射能 MBqを入力します。
  4. 角度ファイルを使う場合は角度リスト XXX.txtを指定します。
  5. 角度ファイルを使わない場合は開始角、角度刻み、CW/CCWを設定します。
  6. viewごとの距離がある場合は距離リスト XXX.corを指定します。ない場合は一定距離RORを使います。
  7. 単一検出器なら単一検出器番号を入力します。(感度校正画面の2つの検出器に感度差がある場合にはここを変えて、より正確にすることも可能ですが、普通は1としてしまっていいです)
  8. 最後に撮影幾何・view順・単位を確認したへチェックを入れます。

COUNTSは積算カウント、CPSは1秒当たり、CPS_PER_MBQは1秒・1 MBq当たりです。プラグインは計算前に一度だけcountsへそろえます。すでに時間や放射能で正規化された値へ、同じ補正を重ねて適用しないようにしてください。

view別情報とPoissonノイズ

詳細を開く:view別情報・シミュレーションを押します。

  • view別時間ファイル(viewごとに時間が異なる場合のみ):1行に1つの撮影時間[秒]を、view数と同じ行数だけ記載
  • view別相対重み:時間・感度以外の既知の相対露出
  • view別検出器番号:1行1番号、全view分
  • 入力はシミュレーションの期待値:実測値ではなく期待値のときだけON
  • Poissonノイズを付加:期待値へ再現可能なノイズを付ける
  • 整数seed:同じ入力とseedで同じノイズを再現する

実測投影や、すでにノイズを付けたシミュレーションへPoissonノイズを重ねてはいけません。テストと本番、保存後の再開では同じ投影とseedが使われます。

なお、view別時間ファイル, view別相対重み, view別検出器番号のファイルは以下のような書式となります(以下の画像はイメージであり、数値はでたらめ)

散乱補正・減弱補正・PSFを設定する

左側の3 補正・PSFを押します。

散乱補正

  • NONE:散乱補正を行わない
  • DEW:k × lowerで散乱を推定する
  • TEW:lower、upper、各窓幅から主ウィンドウ内の散乱を推定する

散乱の使い方はADDITIVEが推奨設定です。予測値へ散乱成分を加法項として組み込みます。SUBTRACTは主ウィンドウから前もって散乱を引き、負値を0にします。両方を同時には適用しません。

CT減弱補正

  1. CTによる減弱補正 ACへチェックを入れます。
  2. CTの保存値がHU+1000ならCTの保存値はHU+1000をONにします。実HUならOFFです。
  3. 基準エネルギー、μwater、μboneが核種・エネルギーに合っているか確認します。
  4. CTの座標・既知変換を確認したへチェックを入れます。

サンプルの初期値は140.5 keV、μwater 0.154 cm-1、μbone 0.254 cm-1です。エネルギーを変えても係数は自動変更されません。自分の条件に合う値を確認してください。

CTは投影や再構成と別格子でも、物理座標と既知の変換が分かっていれば再サンプリングできます。ただし、CTの自動位置合わせなどの機能は実装していません。

PSF

  • NONE:PSF補正なし
  • FIXED:一定のFWHMを使う
  • DISTANCE:view距離と深さに応じて幅を変える

詳細を開く:PSFの機器情報・CT変換を押すと、固定PSFのFWHM、コリメータ穴径、穴長、隔壁減弱係数、固有分解能、深さbin数、targetからCTへの4×4変換行列を設定できます。

サンプルの値は機能確認用です。実データでは、装置、コリメータ、核種、シミュレーション条件に対応する値へ置き換えてください。再構成後のGaussianフィルタと、再構成演算子に入るPSFは別の処理です。

OSEMとBSREMを設定する

左側の4 再構成を押します。

  1. 条件名を入力します。保存フォルダ名にも使われるので、内容が分かる名前にします。
  2. 手法をOSEMまたはBSREMから選びます。
  3. 格子・FOVを変更からnx、ny、nz、画素間隔を確認します。
  4. 最大反復数を入力します。これは全subsetを1巡した回数です。
  5. subset数を入力します。view数以下にします。
  6. BSREMではβを設定します。
  7. 自動停止を使う場合は3反復連続で収束基準を満たしたら停止をONにします。

OSEMはsubsetごとに乗算更新する方法です。BSREMはRDPによるペナルティを入れた加法更新で、β、γ、α0、ηなどを条件として保存します。βを大きくすると滑らかになる傾向がありますが、0.3を含め初期値は研究用の開始値です。

収束判定

標準プリセットでは、次の3つがすべて基準内になった状態を3全反復続けると停止します。

  • 画像変化:0.005以下
  • 目的関数変化:0.001以下
  • 最適性残差:0.01以下

詳細を開く:収束の数値・反復法・物理座標を押すと、各基準、開始反復、RDP近傍、BSREMの緩和スケジュール、上限、OSEM緩和係数、円柱FOV、原点、方向行列を設定できます。

「厳密」プリセットは数値基準が厳しいので、とりあえず「標準」でいいと思います。

平滑化・出力を設定する

左側の5 平滑化・出力を押します。

  • NONE:フィルタなし
  • GAUSSIAN:3次元Gaussian、FWHMをmmで指定
  • BUTTERWORTH:3次元Butterworth、遮断周波数をcycles/cmで指定

Butterworthの初期値は次数8、padding 0です。Nyquistと遮断比を表示を押すと、X・Y・Z方向のNyquistと遮断比を確認できます。画素間隔が異方性の場合は軸ごとに値が変わります。

フィルタ後に生じた負値は、保存時も濃度換算時も保持されます。表示上見えにくい場合は、4画像比較の表示下限・上限を調整してください。

  1. 必要なフィルタを選びます。
  2. 濃度画像を保存する場合はBq/mLまたはkBq/mLを選びます。
  3. 校正情報から放射能濃度も保存へチェックを入れます。
  4. 保存先を指定します。

詳細を開く:CPU・テスト・途中保存では、CPUスレッド数、テストの全反復数、自動保存間隔を設定します。

CPUスレッド数1は計算順を固定した検証向けです。複数スレッドではZスライスを並列処理します。テストの全反復数は標準2です。本番はテスト画像から続けるのではなく、初期状態から開始します。

感度校正とBq/mL出力を設定する

左側の6 感度校正を押します。

既知の感度を直接入力する方法と、点線源・シリンジの平面画像から計算する方法があります。サンプルには検出器1の感度として100 cps/MBqが登録されています。

  1. 感度校正を開くを押します。
  2. 校正画像を選びます。MHD+RAWまたは対応する非圧縮DICOMを使用できます。
  3. 必要に応じて別撮影の背景画像を選びます。
  4. 検出器番号、フレーム、入力単位、撮影時間、基準放射能を設定します。
  5. 減衰補正を使う場合は、半減期と基準時点からの経過時間を入力します。
  6. 集計範囲を画像全体、矩形ROI、楕円ROIから選びます。
  7. 感度を算出して測定に追加を押します。
  8. 複数測定がある場合はまとめ方を選び、登録測定を集約して適用を押します。

Fijiで校正画像を開き、矩形または楕円ROIを描いて描いたROIを取り込むこともできます。背景画像を使う場合は、校正画像と背景画像を撮影時間で正規化してから差し引きます。

同じ検出器の複数測定は、平均放射能×撮影時間による加重平均が標準です。すでにcps/MBqへ正規化され、露出重みが分からない場合は単純平均を選びます。

校正情報は名前を付けてJSON保存・読込できます。装置、核種、コリメータ、エネルギー窓、日付などが分かる名前にしておくとよいです。再構成条件と校正条件が一致していることを確認してください。

条件一覧を整えて全条件をテストする

左側の7 条件一覧・実行を押します。

サンプルにはDemo_OSEMとDemo_BSREMの2条件があります。

  • 編集内容を反映:画面で変更した値を条件へ反映
  • 選択条件を編集:一覧で選んだ条件を再構成ページで開く
  • 複製して追加:現在の条件をコピーして比較条件を作る
  • 削除:選択条件を削除する
  • ↑・↓:実行順を変更する

例えば、OSEMのsubset数だけを変えて比較したい場合は、元の条件を複製し、条件名とsubset数だけを変更します。条件名には変更した内容を含めると、後から見ても分かりやすいです。

全条件をテストする

  1. 画面左下の全条件をテストを押します。
  2. 入力検査、初期化、短い反復が終わるまで待ちます。
  3. 各条件の実行可否が「可」であることを確認します。
  4. 推定メモリ、実測heap、Java上限、1反復の時間、最大反復までの概算を確認します。

今回の実行では、両条件とも推定メモリ約328 MB、実測heap約91~92 MB、Java上限2048 MBで「可」になりました。1全反復は約0.06~0.07秒でした。これは今回の小さな合成データと、このPCでの測定値です。実データや別のPCで同じ値になるわけではありません。

テスト後に条件を変更した場合は、もう一度全条件をテストしてください。

本番計算を実行する

  1. テスト結果を確認します。
  2. 画面左下の本番へ進むを押します。
  3. 計算中は画面下の状態表示を確認します。
  4. すべての条件が終わると、左側の8 結果へ移動します。

今回はOSEM、BSREMとも12全反復まで実行され、状態は上限到達(収束未確認)となりました。短時間で値の変化を追うことを優先したデモなので、こうなります。

結果の状態は次の意味です。

  • COMPLETED:収束して保存完了
  • MAX_ITERATIONS:最大反復数へ到達、収束は未確認
  • PAUSED:保存して一時停止
  • FAILED:その条件は失敗

4画像比較と収束グラフを確認する

更新過程を4画像で比べる

  1. 結果ページの4画像比較を押します。
  2. 比較を更新過程(代表3+最終)にします。
  3. 1列目で条件を選びます。
  4. 表示を未フィルタ、フィルタ後、Bq/mLなどから選びます。
  5. 位置スライダーを動かして同じ物理位置を見比べます。
  6. 必要に応じて表示下限・上限を入力し、適用を押します。

この画面では、代表時点1、代表時点2、実計算の途中画像、最終画像が常に横4枚で表示されます。サンプルのOSEMでは反復4、8、9、12が表示されました。条件や停止時点によって選ばれる反復は変わります。

冠状断・矢状断へ切り替える

上部の断面を冠状 coronalへ変更します。

同様に矢状 sagittalへ変更することも可能です。

異なる条件の最終画像を比べる

  1. 比較を条件別の最終画像へ変更します。
  2. 各列の条件を選びます。
  3. 表示を未フィルタ、フィルタ後、Bq/mLなどから選びます。
  4. 全体範囲を押すと、4枚に共通する表示範囲へ戻せます。

Fijiで4枚を開くを押すと、表示中の4画像をそれぞれFijiへ渡せます。

もうちょっとで終わりなのでガンバってください・・・

収束グラフを見る

  1. 結果ページ、または上部の収束グラフを押します。
  2. 左上の対象から条件を選びます。
  3. グラフと下側の数値表を確認します。

OSEMでは、画像変化が1反復目の約1.27から12反復目の約0.00846へ低下しました。最適性残差も約0.0802から約0.00196へ低下しています。一方、目的関数変化は12反復目でも約0.108で、標準基準0.001には届いていません。

BSREMでは、画像変化が約1.26から約0.00296、目的関数変化が2反復目の約0.529から12反復目の約0.00179、最適性残差が約0.0751から約0.00109へ低下しました。3つとも下がる方向ですが、目的関数変化が標準基準を上回るため、収束停止にはなっていません。

グラフは各値そのものではなく、各停止基準に対する倍率を対数目盛で表示します。横の「停止基準」より下へ3本とも入り、それが指定回数続いたときに収束停止します。グラフを閉じても計算は続きます。

最終画像をFijiで開く

  1. 結果一覧で条件を選びます。
  2. 最終画像をFijiで開くを押します。
  3. Fijiのスライダーでスライスを送ります。
  4. 必要に応じてFijiの表示範囲やLUTを変更します。

保存済み画像へフィルタを再適用する

GaussianとButterworthを比較するたびに再構成からやり直す必要はありません。未フィルタ画像が保存されていれば、後処理だけを変更できます。

  1. 左側の5 平滑化・出力を開きます。
  2. 再構成後のフィルタを変更します。
  3. GaussianならFWHM、Butterworthなら遮断周波数、次数、paddingを設定します。
  4. 保存した未フィルタ画像に再適用を押します。
  5. 画面下に「保存画像の後処理が完了しました」と表示されることを確認します。
  6. 4画像比較で「フィルタ後」を選びます。

再処理した結果は、元の画像を上書きせず、新しいpostprocess-...フォルダへ保存されます。今回はOSEMの保存済み画像へ、遮断0.5 cycles/cm、次数8、padding 0のButterworthを再適用しました。

一時停止・中止・再開

保存して一時停止・中止

  1. 計算中に保存して一時停止を押します。
  2. 現在の全反復が終わるまで待ちます。
  3. 反復境界でチェックポイントが保存され、状態がPAUSEDになります。

中止は計算途中でも要求を受け付けます。最後に完了した全反復の状態を保持します。再開する可能性がある場合は、保存先のrunフォルダを削除しないでください。

保存した実行を再開する

  1. Fijiとプラグインを開きます。
  2. 上部の保存した実行を開く・再開を押します。
  3. 再開したいrun-...フォルダを選びます。条件別フォルダではありません。
  4. 入力内容と条件が一致することをプラグインが確認します。
  5. 結果ページと履歴が復元されたら、本番へ進むを押します。

画像、完了反復、BSREMの緩和スケジュール、停止判定、履歴、代表時点が復元されます。

保存されたファイルを確認する

結果ページの保存先を開くを押すと、今回のrunフォルダが開きます。

runフォルダ直下には、条件ごとのフォルダ、実行時の条件JSON、実行全体のmanifestが保存されます。

条件フォルダには、次のファイルが保存されます。

  • condition.json:その条件の設定
  • representative-1~3.mhd/.raw:実際に計算された代表時点
  • final.mhd/.raw:最終画像
  • *-filtered.mhd/.raw:フィルタ後画像
  • *-bqml.mhd/.raw:Bq/mL画像
  • convergence.csv:反復ごとの収束指標
  • result.json:状態、画像一覧、履歴
  • checkpoints:再開用データ
  • postprocess-...:後からフィルタを再適用した結果
  • failure.txt:条件が失敗した場合の記録

MHD+RAWは32-bit floatです。RAWを完成させた後にMHDが保存されます。

convergence.csv

convergence.csvには、反復番号、画像変化、目的関数、目的関数変化、最適性残差、基準内かどうか、連続達成回数、収束判定、反復時間が保存されます。グラフだけでなく数値を解析したい場合に使用できます。

run_manifest.jsonには、入力ハッシュ、解決後のMHD情報、角度、距離、時間、検出器番号、感度、補正係数、seed、ソフトウェア版、テスト結果、条件別の実行結果が保存されます。再現性を確認するため、runフォルダ全体を保管しておくことをお勧めします。

自分のデータへ置き換える

合成サンプルが最後まで動いたら、自分のデータへ置き換えます。一度にすべてを変えると原因を追いにくいため、次の順番で確認するとよいです。

  1. mainだけを登録し、散乱補正、CT減弱補正、PSF、定量をOFFにします。
  2. MHD+RAWの検査とプレビューを通します。
  3. 角度、回転方向、view順、COR距離、入力単位、撮影時間を確認します。
  4. 小さな格子と少ない反復数で全条件テストを行います。
  5. lower・upperを追加し、DEWまたはTEWを確認します。
  6. CTの座標と変換を確認してから減弱補正を追加します。
  7. 装置に対応するPSF設定を追加します。
  8. 感度校正条件が一致することを確認して濃度出力を追加します。
  9. 複数条件を作り、画像と収束指標を比較します。

間違いやすい項目(チェックリストとして使ってください)

  • MHDとRAWが分離型・非圧縮になっている
  • DimSizeがnu、nv、nViewsの順になっている
  • 画素値の型とendiannessがRAWに一致している
  • ElementDataFileが正しいRAWを指している
  • main、lower、upperの格子とview順が一致している
  • 角度数、距離数、時間数、検出器番号数がview数と一致している
  • CW/CCWと装置の収集順が一致している
  • 入力単位がCOUNTS、CPS、CPS_PER_MBQのどれか分かっている
  • 時間、放射能、感度を二重に適用していない
  • CTと再構成格子の物理座標関係が分かっている
  • PSFの値が装置・コリメータ・核種に対応している
  • 感度校正の窓、コリメータ、単位が再構成条件と一致している
  • 全条件テストのメモリと時間を確認した

さいごに

今回は、Fiji SPECT Reconstructionへ合成データを読み込み、入力ファイルの確認、撮影条件、散乱・減弱・PSF補正、OSEM・BSREM、平滑化、感度校正、全条件テスト、本番計算、4画像比較、収束確認、フィルタ再適用、保存ファイルの確認まで行いました。

項目は多いですが、左側の1~8を上から順番に確認すれば、入力から結果までの流れを追えるようになっています。最初は同梱サンプルで画面とファイルの関係を理解し、その後に補正を一つずつ追加すると、問題が起きた場所を見つけやすくなります。

特に大切なのは、入力の単位と幾何を確認すること、全条件テストを省略しないこと、最大反復数への到達と収束を区別することです。再構成画像だけでなく、条件JSON、manifest、convergence.csvも一緒に保管しておきましょう。

お疲れ様でした・・・