1. 目的
2. 準備
2.1. DIPYのインストール
2.2. 使用データ
2.3. 前処理
3. 拡散尖度イメージング(DKI)
3.1. 必要なパッケージをインポート
3.2. 画像およびMPG軸情報の読み込み
3.3. マスク画像の生成
3.4. モデルフィッティング
3.5. 拡散定量値の計算
3.6. NIfTI形式で保存
3.7. 結果
4. おまけ
1. 目的
- DIPYを用いた拡散尖度イメージング: DKI
2. 準備
2.1. DIPYのインストール
1 | pip3 install dipy |
2.2. 使用データ
データを次のフォルダ構造で用意する。
1 2 3 4 5 6 | Study/ └── Subject ├── DWI.nii.gz # 拡散MRI ├── DWI_mask.nii.gz # 拡散MRIマスク画像 ├── bvals # b-values └── bvecs # b-vectors |
2.3. 前処理
DKI(Diffusion Kurtosis Imaging)前に、拡散MRIの前処理をする。
- 拡散MRIのノイズ除去(Software: MRtrix, DIPY)
- ギブズのリンギングアーチファクト(Gibbs ringing)の除去(Software: MRtrix, DIPY)
- 拡散MRIのバイアス(信号ムラ)補正(Software: MRtrix)
- 拡散MRIの前処理 ~歪み・頭の動き・渦電流の補正(Software: FSL, MRtrix)
3. 拡散尖度イメージング(DKI)
Pythonで以下のコマンドを実行。
3.1. 必要なパッケージをインポート
1 2 3 4 5 6 7 | import numpy as np import matplotlib.pyplot as plt import dipy.reconst.dki as dki from dipy.core.gradients import gradient_table from dipy.io.gradients import read_bvals_bvecs from dipy.io.image import load_nifti, save_nifti from dipy.segment.mask import median_otsu |
3.2. 画像およびMPG軸情報の読み込み
1 2 3 4 5 6 7 | DWI_FILE = 'DWI.nii.gz' BVALS_FILE = 'bvals' BVECS_FILE = 'bvecs' data, affine = load_nifti(DWI_FILE) bvals, bvecs = read_bvals_bvecs(BVALS_FILE, BVECS_FILE) gtab = gradient_table(bvals, bvecs) |
3.3. マスク画像の生成
median_otsu
関数を用いて、b=0画像からマスク画像を生成する。vol_idx
には、b0 volumeのvolume indexを渡す。
1 2 | maskdata, mask = median_otsu( data, vol_idx = np.where(bvals = = 0 )[ 0 ]) # , dilate=3 |
3.4. モデルフィッティング
以下のコマンドで、DKIのモデルフィッティングを実行。
1 2 | dkimodel = dki.DiffusionKurtosisModel(gtab) dkifit = dkimodel.fit(maskdata) |
3.5. 拡散定量値の計算
モデルフィッティングができたら、拡散定量値を算出する。
1 2 3 | MK = dkifit.mk( 0 , 3 ) AK = dkifit.ak( 0 , 3 ) RK = dkifit.rk( 0 , 3 ) |
脳周囲の背景では、フィッティングミスをしてnan
となる場合があるため、そのようなnan
を0に置き換える。
1 2 3 | MK[np.isnan(MK)] = 0 AK[np.isnan(AK)] = 0 RK[np.isnan(RK)] = 0 |
3.6. NIfTI形式で保存
save_nifti
関数で、画像をNIfTI形式で保存する。
1 2 3 4 5 | save_nifti( 'DWI_masked.nii.gz' , maskdata.astype(np.float32), affine) save_nifti( 'DWI_mask.nii.gz' , mask.astype(np.float32), affine) save_nifti( 'MK.nii.gz' , MK.astype(np.float32), affine) save_nifti( 'AK.nii.gz' , AK.astype(np.float32), affine) save_nifti( 'RK.nii.gz' , RK.astype(np.float32), affine) |
3.7. 結果
DKIによって算出された定量値画像は、以下の通り。
4. おまけ
DKIでもFA, MD, AD, RDを算出することができる。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | # 拡散定量値を算出 FA = dkifit.fa MD = dkifit.md AD = dkifit.ad RD = dkifit.rd # nanを0に置換 FA[np.isnan(FA)] = 0 MD[np.isnan(MD)] = 0 AD[np.isnan(AD)] = 0 RD[np.isnan(RD)] = 0 # NIfTI形式で保存 save_nifti( 'FA.nii.gz' , FA.astype(np.float32), affine) save_nifti( 'MD.nii.gz' , MD.astype(np.float32), affine) save_nifti( 'AD.nii.gz' , AD.astype(np.float32), affine) save_nifti( 'RD.nii.gz' , RD.astype(np.float32), affine) |
以下は、FA, MD, AD, RDをDTI(下段)とDKI(上段)で比較した図である。