ROI・マスク・解析¶
このページは作成中です
以下の内容を予定しています。
ROI¶
- ROI の描画(矩形・楕円・多角形・フリーハンド)
- ROI マネージャ — 一覧、名前・色の編集、表示切り替え
- 統計値(面積、平均、標準偏差、最大 / 最小など)とヒストグラム
- 動画シリーズでのフレーム指定 ROI
マスク・セグメンテーション¶
- マスク塗り、ワンドツール、レベルセット
- ROI ↔ メッシュの変換
- DICOM SEG / RTSTRUCT の読み込みと書き出し
定量解析¶
- PET の SUV 校正(body weight ほか)
- Time-Intensity Curve
- テクスチャ解析(Radiomics)— RadiomicsJ 連携
テクスチャ解析に使える画像(テクスチャマップ・GLAM 解析・Radiomics 特徴量(ROI)に共通)
- 非圧縮と圧縮の DICOM を読めます。圧縮は JPEG Lossless・JPEG-LS・JPEG 2000・RLE などで、可逆圧縮なら非圧縮と同じ値になります。
- 非可逆圧縮の画像(JPEG Baseline・JPEG 2000・JPEG-LS Near-Lossless など、または LossyImageCompression が 01)も計算しますが、結果の上に「非可逆圧縮の画像です。特徴量は圧縮の影響を受けます」と出ます。テクスチャマップでは、派生シリーズの DerivationDescription にも
source: lossy compressedと残ります。 - 圧縮画像の伸長には、同梱の dcm4che の部品(OpenCV)を使います。部品が使えない環境では「圧縮画像の伸長に必要な部品がありません(理由)」と出て止まります。
- カラー画像と、圧縮されたマルチフレーム画像(Enhanced CT・MR など 1 ファイルに複数枚)は対象外です。理由を示して止まります。
Radiomics 特徴量(ROI)¶
ROI 全体を 1 つの領域として、RadiomicsJ で Radiomics 特徴量を計算し、表と CSV に出します。研究用(Research Use Only)で、診断には使いません。
開き方: 2D ビューアで画像を表示し、メニューの 解析 ▸ Radiomics 特徴量(ROI)… を選ぶと、別ウィンドウが開きます(デスクトップ版のみ)。
手順
- 対象シリーズと ROI マスクを選びます。必要なら「症例ラベル」(例
case-012)を入れます。CSV のCaseLabel列とファイル名に入ります。症例を突き合わせるための番号などを入れ、患者名・患者 ID は入れないでください。マスクは DICOM SEG などのマスクシリーズです。SEG に複数のセグメントがあれば、セグメントを名前で選べます。塗りの ROI は、ROI マネージャーの「DICOM SEG で保存」でマスクシリーズにしてから選んでください。 - 設定を選びます。
- 離散化: ビン数(既定 32)かビン幅(既定 25)。
- リサンプリング: なし、または等方の画素間隔(mm)。
- 特徴量の族: 既定は RadiomicsJ と同じです(GLAM と 2D 形状はオフ)。GLAM は計算量が ROI のボクセル数の 2 乗で増えるので、大きな ROI では断られることがあります。
- 「計算」を押します。計算中は「読み込み中/計算中」と経過時間が出ます。数万ボクセルの ROI では数十秒〜数分かかります。
表の見方
- 族ごとに、特徴名・IBSI の識別子・値・注記を並べます。IBSI の識別子で、IBSI(Image Biomarker Standardisation Initiative)の定義表と照合できます。
- 族の見出しに、その族の離散化(ビン数かビン幅)が出ます。
- 取り違えやすい定義には注記が付きます。
- 過剰尖度(−3 済み): 一次統計と強度ヒストグラムの Kurtosis は、正規分布で 0 になる過剰尖度です。
- log2・離散化後: 強度ヒストグラムの Entropy は、離散化した値の、底 2 のエントロピーです。
- IBSI 外: IBSI の定義に無い特徴です(フラクタル、GLAM、2D 形状、一次統計の TotalEnergy・StandardDeviation・StandardError など)。
- Diagnostics の
ResegmentedROIMorphMaskVoxelCountには、RadiomicsJ 2.4.1 では強度マスクの数が入ります。形態マスクの数は、表の上の「形態」か CSV のRoi_MorphMaskVoxelsを見てください。
- 表の上に ROI の大きさが出ます。
- 「ROI」: 選んだマスクのボクセル数。
- 「計算に使った数」: リサンプリング・範囲フィルタ・外れ値除去の後に、強度とテクスチャの特徴を計算したボクセル数。
- 「形態」: 形態特徴に使うマスクのボクセル数。リサンプリングの後の数で、範囲フィルタ・外れ値除去では減りません。
- 「体積」: 形態のボクセル数 × 計算に使った画素の体積(mm³)。
- 環境設定 ▸ テクスチャの「小さい ROI の警告(ボクセル数)」に値を入れておくと、計算に使った数がそれより少ない ROI で、表の上に警告が出ます。空欄なら警告しません(環境設定)。
画像フィルタ(LoG): 「画像フィルタ」で LoG を選び、σ(mm、カンマか空白で複数)・切り捨て(σ の倍数、既定 4)・境界(既定 MIRROR)を指定すると、強度・テクスチャの特徴をフィルタ後の画像からも計算し、σ ごとの列(log_sigma1.5mm_…)を元の列の後ろに足します。
- 形態(Morphology)と Diagnostics は元の ROI のままで、繰り返しません。フィルタ後の列には IBSI の識別子を付けず、「LoG 後の画像に元の定義を適用」の注記を付けます。
- LoG は等方の格子が前提です。画素間隔がそろっていない画像でリサンプリングを指定しないと、理由を出して計算しません。固定ビン幅の値はフィルタ後の値の単位になるため、固定ビン数をお勧めします。
- 3D の単位は体積に、2D の単位(最大断面・スライス別)は面内にフィルタを掛けます。
空間スケール(LoG を構造の半径で指定): 「画像フィルタ」で「LoG(構造の半径)」を選ぶと、強調したい構造の半径 r(mm)を 0, 2, 3, 4 のように並べて指定できます。r ごとに独立して計算し、結果の上にスケールのタブが並びます。
- r=0 はフィルタなしで、通常の表と同じ値です。r>0 は σ に換算して LoG を掛けます。既定の換算は σ = r/√d(d はフィルタの次元で、3D の単位は 3、2D の単位は 2)です。半径 r の円板(2D)・球(3D)への σ² 正規化した応答が最大になる σ が r/√d で、核の山の半径も r になります。σ = r、σ = k·r も選べます。
- 換算は仮定で、他のソフトの同名の設定と同じ値になるとは限りません。LoG の応答は、明るい構造に負の値(IBSI の定義)になります。
- スケールごとの結果は個別にキャッシュされます。「0, 2」を計算したあとに「0, 2, 3」を計算すると、0 と 2 はキャッシュから返り、3 だけ新しく計算します。
- CSV はスケールごとに 1 行(3D の表)で、記録の列の後ろに Filter_Kind・Filter_ScaleMm・Filter_SigmaMm・Filter_ScaleToSigma・Filter_Dimension・Filter_TruncateSigma・Filter_Boundary が入ります(フィルタなしの行は Filter_Kind=none で、r 以外は空)。LoG の列名は σ ごとに違うので、列は全スケールの和集合で、そのスケールに無い列は空です。設定ファイルと 2D の CSV はスケールごとに別ファイル(…-r3_…)です。
スケールの書き方(走査・幅〔画素〕・名札): スケールの「値」には、カンマか空白で区切った値と、連続値の走査「開始:終了:刻み」(例 0, 1:2:0.5 → 0, 1, 1.5, 2)を混ぜて書けます。計算の前に「計算するスケール(N 個)」の一覧が出るので、刻みの打ち間違いに気づけます(個数に上限はありません。計算中は終えたスケール数から残り時間の目安を出し、取り消しで残りを止められます)。刻み 0 以下・終了が開始より小さい・数にならない値は、理由を出して計算しません。「LoG(σ)」の σ の欄にも同じ走査が使えます。
- 「書き方」を「幅(画素)」にすると、値を構造の直径の画素数として読み、r = 幅 × 面内の画素間隔 / 2 に直します(リサンプリング前の元の間隔)。画素幅で指定すると、画素の大きさが違う画像どうしでは同じ長さになりません。縦横の画素間隔が違う画像では使えません(半径 mm で指定してください)。
- 「名札」には旧フィルタ値などを書けます。記録するだけで計算には使いません(旧フィルタ値から σ や幅は自動では決めません。対応する式が文献で確かめられないためです)。
- CSV の Filter_* 列に Filter_InputNotation(radius_mm・width_px)・Filter_InputValue・Filter_PixelSpacingMm(幅のときだけ)・Filter_LegacyLabel が加わります。
フィルタ画像(LoG の派生シリーズ): 2D ビューアの 解析 ▸ フィルタ画像(LoG)… で、選んだシリーズ全体に LoG を掛け、スケールごとに元と同じ位置・画素間隔の派生シリーズを保存します(作成後、1 本目を新しいタイルで開きます)。スケールの書き方(半径 mm・幅 画素・走査)と換算は ROI 特徴量と共通です。
- 2D は面内、3D は体積にフィルタを掛けます(換算の d は 2D で 2、3D で 3)。LoG は等方の格子が前提なので、3D は 3 軸、2D は面内の 2 軸が揃っていない画像では、理由を出して作りません。元の格子のまま作り、リサンプリングはしません。
- 保存されるのは Secondary Capture(ImageType=DERIVED\SECONDARY\LOG)の 16 bit 画像で、元の値は RescaleSlope/Intercept で復元できます。DerivationDescription に filter=LoG; r_mm=…; sigma_mm=…; scale_to_sigma=…; dim=…; truncate_sigma=…; boundary=…; radiomicsj=… を残します。表示の初期の窓は 0 が中心で、符号(明るい構造は負)が見えます。
- 値は表示用に 16 bit へ丸められるので、ROI の数値は「Radiomics 特徴量(ROI)」の表を使ってください(派生シリーズの上で ROI 統計を取ると、丸めの分だけ違います)。マスクは不要で、画像全体に掛けます。web モードでは作れません。
フィルタ層(色分けの重ね表示): 解析 ▸ フィルタ層を重ねる… で、選んだタイルに、同じスタディの「LoG r …」の派生シリーズを色を変えて最大 3 本重ねます。
- 重ねられるのは、位置・向き・画素間隔・行列・枚数が元と一致するシリーズだけです(0.001 mm を超えるずれは不一致)。一致しないものは理由を出して選べません。
- 層ごとに、しきい値(既定 0)・見せる側・不透明度・表示の切り替え・[×](外す)があります。しきい値以下の画素は透明で、下の画像がそのまま見えます。LoG の応答は明るい構造で負になる(IBSI の定義のまま)ので、見せる側の既定は「負の側(明るい構造)」です。色は色覚の違いに配慮した橙・空色・青緑で、重なった所は色が混ざります(スクリーン合成)。
- 凡例(色・r・σ)は層のバーに出ます。状態バーには層ごとのカーソル値(r2 … / r4 … / r6 …)が並びます。
- 層は表示だけで保存しません。派生シリーズは表示用に 16 bit へ丸めてあるので、ROI の数値は「Radiomics 特徴量(ROI)」の表を使ってください。「画素ごとに最も強いスケールの色で塗る」表示は今のところありません。
計算の単位(3D・最大断面 2D・スライス別 2D): 「計算の単位」で、全腫瘍(3D、常に計算)に加えて最大断面(2D)とスライス別(2D)を選ぶと、1 回の計算で 3 つを並べた表(行=特徴、列=単位)が出ます。何も選ばなければ従来と同じ 3D だけです。
- 最大断面(2D)は、上の「最大断面」の 1 枚だけで計算します。スライス別(2D)は、前景のあるスライスごとに計算し、スライス別の表(折りたたみ)と、値のあるスライスの単純平均・ROI の画素数で重み付けした平均を出します。計算できなかったスライスは、位置と理由が表示され、集約には含まれません。
- 2D では形態(Morphology)と GLAM は計算せず、代わりに Shape2D を出します(その単位で計算しない特徴は「—」)。リサンプリングは面内だけで、固定ビン数の離散化はスライスごとに決まります。3D と 2D の値は定義が違うので、同じ量の差としては読まないでください。
- 環境設定 ▸ テクスチャの「小さい ROI の警告(画素数、2D)」に値を入れると、2D の画素数がそれ未満のスライスを警告します(空欄=警告しない)。
- CSV は、3D の 3 本(変更なし)に加えて、選んだ単位ごとに _maxsection2d*.csv、_slices2d.csv・_slices2d_aggregate.csv などを別ファイルで書き出します。どれも先頭の記録 5 列は 3D と同じなので、CaseLabel で結合できます。
CSV に書き出す
2 つのファイルを保存します。ファイル名は、症例ラベルがあれば <症例ラベル>-seg<セグメント>、無ければ roi-features-<シリーズ番号>-seg<セグメント> で始まります。
-
….csv: 1 行目が列名、2 行目が値(1 行 = 1 ROI)。先頭の 5 列は記録です。CaseLabel: 症例ラベル(空のこともあります)。Provenance_GraphyNextVersion・Provenance_RadiomicsJVersion: 計算したソフトの版。Provenance_ExtractedAt: 計算した日時(ISO 8601、UTC)。Provenance_SettingsSha256: 計算に使った設定ファイルの SHA-256。設定が同じなら同じ値になるので、症例ごとの CSV を集めたときに設定の違いがこの列で分かります。
続く 6 列は ROI の大きさです。体積を共変量として解析に入れるときに使います。 -
Roi_InitialVoxels・Roi_IntensityMaskVoxels・Roi_MorphMaskVoxels・Roi_VolumeMm3: 表の上の「ROI」「計算に使った数」「形態」「体積」と同じ値。 -Warning_SmallRoiThresholdVoxels: 計算したときの警告の基準値。 -Warning_SmallRoi: 小さい ROI なら 1、そうでなければ 0。基準値が空欄なら、この 2 列は空です(0 ではありません)。その後ろが特徴量の列で、列名は RadiomicsJ の結果表と同じです(例
IntensityBasedStatistical_Kurtosis)。計算できなかった値はNaNです。症例ごとのファイルを縦につなげば、そのまま統計ソフトに読み込めます。 -…_definitions.csv: 列名ごとの族・特徴・IBSI の識別子・注記の符号(EXCESS_KURTOSIS・LOG2_DISCRETISED・NON_IBSI・RJ_MORPH_COUNT_IS_INTENSITY)・離散化。
設定ファイルを書き出す
表の上に、版と設定の要約(離散化・リサンプリング・有効な族の数)が出ます。「設定ファイルを書き出す」で、計算に実際に使った設定を RadiomicsJ の設定ファイル(…_radiomicsj.properties)として保存します。
- 全部の設定を、既定値も含めて書きます。RadiomicsJ が範囲外の値を直した場合(ビン数 0 → 1 など)は、直した後の値です。
- このファイルの SHA-256 が、CSV の
Provenance_SettingsSha256と一致します。 - 同じ画像とマスクで、このファイルを RadiomicsJ(ImageJ・コマンドライン)に読ませると、同じ値が出ます。
患者名などの患者情報は、表にも CSV にも入りません。
計算済みの結果(キャッシュ)
同じ画像・マスク・設定・RadiomicsJ の版で計算し直すと、保存してある結果がすぐに出ます。表の上に「キャッシュの結果(計算 日時)」と出ます。「計算し直す」を押すと、保存した結果を使わずに計算し、結果を置き換えます。
「取り消す」を押すと、結果を画面に出さなくなります。ただし計算そのものは最後まで続き、結果は保存されます(RadiomicsJ に途中で止める仕組みが無いため)。
6 統計・副次量・範囲で除く
- プリセット「6 統計」: 一次統計・強度ヒストグラム・補助統計の 3 つの族だけを有効にします。
- 補助統計(IBSI 外) は既定でオフです。オンにすると
AuxiliaryStatistics_の列が増えますが、ほかの列の値は変わりません。値が 0 より大きいボクセルだけの平均(MPP)・割合(PPP)、ln(SD)/ln(N)(nSD)、1/(過剰尖度+3)、値が 0 より大きいボクセルの uniformity(UPP)です。これらの量には公開された参照値が無く、手計算の理論値との一致だけを確かめています。 - 計算すると、結果の上に「6 統計」(Mean・SD・Entropy・MPP・Skewness・Kurtosis)と「副次量」(Variance・Uniformity・PPP・nSD・UPP・1/(kurtosis+3))の欄が出ます。値は下の全特徴の表の同じ列と同じです。定義できない値(全ボクセルが同じ値、値が 0 より大きいボクセルが無い、など)は 0 ではなく「—(未定義)」と表示します。
- 範囲で除く(再セグメント): 下限・上限のどちらか片方だけでも入れられます(例: 下限 −50 だけ)。その範囲の外のボクセルを強度マスクから除きます(両端を含みます)。空欄の側は開いたままです。下限が上限より大きい入力は計算できません。
- GPU: 本体の Radiomics 抽出は GPU を使わず CPU で計算します(RadiomicsJ 2.5.2 までと同じ計算経路で、値を変えないため)。設定ファイルの記録には
BOOL_USE_GPU=0が入ります。
スケール比較(統計 × スケール)
- 複数の半径(上の「空間スケール」)で計算すると、スケールのタブの右端に「スケール比較」のタブが出ます。プリセット「36 特徴」は、6 統計を半径 0・2・3・4・5・6 mm で計算する設定を一度に入れます。
- 表は、行が統計(6 統計を先頭に、残りは「ほかの特徴」に折りたたみ)、列がスケールです。値は各スケールの結果の同じ列をそのまま並べたもので、ここで計算はしていません。r>0 の列は LoG を掛けた画像の値、r=0 はフィルタなしの値です。LoG の応答は明るい構造で負になります(IBSI の定義のまま)。
- 見出しに fine・medium・coarse の目印が付きます。既定は r 2=fine、3〜5=medium、6=coarse、0=フィルタなしで、文献での呼び方に合わせています。割り当ては画面で変えられ(前回の値を覚えます)、割り当てに無い半径は「組なし」と出ます(近い組へは入れません)。組ごとの平均などの値は作りません。割り当てを変えても値は変わりません。
- 「横長の CSV を保存」は 1 ROI=1 行で、記録の列(
CaseLabel・版)と ROI の大きさ(Roi_*・Warning_*)を 1 回、続けてScale2mm_IntensityBasedStatistical_Meanのような列(半径は小数点のまま、Scale2.5mm_。既定は 6 統計 × スケールの 36 列だけで、「6 統計以外の共通の特徴も書き出す」を付けると全スケールに共通する列をすべて書きます)、最後にスケールごとの記録(Scale2mm_Provenance_SettingsSha256・Scale2mm_Filter_*)が並びます。定義表(_wide_definitions.csv)にはscale_mm・sigma_mm・groupの欄があります。ROI の大きさや版がスケールの間で食い違うときは、片方を黙って書かず書き出しを止めます。 - 2 症例の横長の CSV は、同じスケールと族なら列の集合と並びが同じなので、そのまま行方向につなげます。従来の縦長の CSV(スケールごとに 1 行)も残っています。
IBSI 照合¶
解析 ▸ IBSI 照合… を開き、照合する を押すと、この PC の中で RadiomicsJ が IBSI 1 のデジタルファントムの参照値と一致するかを確かめます(数秒)。判定と規則は RadiomicsJ のものをそのまま表示します。
- 件数は「許容幅の内側」「桁数で一致」「不合格」「計算されず」「RadiomicsJ に無い」「手引きに参照値なし」に分けて出ます。
- 許容幅が無い行は、IBSI の手引きに丸めの規則が書かれていないため、RadiomicsJ が独自に定めた基準(参照値の有効数字の桁数で丸めて一致)で判定し、許容幅の内側とは別に数えます。IBSI 公式の合格基準ではありません。
- 表は「不合格だけ」「不合格と計算されず」「判定の対象外」で絞り込め、族・特徴名で検索できます。
- CSV・JSON で書き出せます。JSON は RadiomicsJ の結果に、GRAPHY-Next の版と実行日時を添えたものです。
- 「論文の方法欄の例」の文は、結果の数から作られます。
- CT ファントム(構成 C・D)は、画像の配布条件のため同梱できないので、この PC では実行しません。RadiomicsJ のリリース時に測った値だけを「記録」として表示します(記録の RadiomicsJ の版は、実行中の版と違うことがあります)。
出典: IBSI(Image Biomarker Standardisation Initiative)。デジタルファントムのデータは CC BY 4.0。この照合は、RadiomicsJ の計算が参照値と一致したことの記録で、臨床での正しさを保証するものではありません。standalone モードのみで使えます。