【DIPY】DIPYを用いた拡散尖度イメージング: DKI



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のインストール

pip3 install dipy

2.2. 使用データ

データを次のフォルダ構造で用意する。

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. 必要なパッケージをインポート

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軸情報の読み込み

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を渡す。

maskdata, mask = median_otsu(
    data, vol_idx=np.where(bvals == 0)[0])  # , dilate=3

3.4. モデルフィッティング

以下のコマンドで、DKIのモデルフィッティングを実行。

dkimodel = dki.DiffusionKurtosisModel(gtab)
dkifit = dkimodel.fit(maskdata)

3.5. 拡散定量値の計算

モデルフィッティングができたら、拡散定量値を算出する。

MK = dkifit.mk(0, 3)
AK = dkifit.ak(0, 3)
RK = dkifit.rk(0, 3)

脳周囲の背景では、フィッティングミスをしてnanとなる場合があるため、そのようなnanを0に置き換える。

MK[np.isnan(MK)] = 0
AK[np.isnan(AK)] = 0
RK[np.isnan(RK)] = 0

3.6. NIfTI形式で保存

save_nifti関数で、画像をNIfTI形式で保存する。

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を算出することができる。

# 拡散定量値を算出
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(上段)で比較した図である。

【DIPY】DIPYを用いた拡散テンソルイメージング: DTI


1. 目的
2. 準備
2.1. DIPYのインストール
2.2. 使用データ
2.3. 前処理
3. 拡散テンソルイメージング(DTI)
3.1. 必要なパッケージをインポート
3.2. 画像およびMPG軸情報の読み込み
3.3. マスク画像の生成
3.4. モデルフィッティング
3.5. 拡散定量値の計算
3.6. NIfTI形式で保存
3.7. 結果


1. 目的

  • DIPYを用いた拡散テンソルイメージング: DTI

2. 準備

2.1. DIPYのインストール

pip3 install dipy

2.2. 使用データ

データを次のフォルダ構造で用意する。

Study/
└── Subject
    ├── DWI.nii.gz  # 拡散MRI
    ├── DWI_mask.nii.gz  # 拡散MRIマスク画像
    ├── bvals  # b-values
    └── bvecs  # b-vectors

2.3. 前処理

DTI(Diffusion Tensor Imaging)前に、拡散MRIの前処理をする。

  • 拡散MRIのノイズ除去(Software: MRtrix, DIPY)
  • ギブズのリンギングアーチファクト(Gibbs ringing)の除去(Software: MRtrix, DIPY)
  • 拡散MRIのバイアス(信号ムラ)補正(Software: MRtrix)
  • 拡散MRIの前処理 ~歪み・頭の動き・渦電流の補正(Software: FSL, MRtrix)

3. 拡散テンソルイメージング(DTI)

Pythonで以下のコマンドを実行。

3.1. 必要なパッケージをインポート

from dipy.segment.mask import median_otsu
import numpy as np
from dipy.io.image import load_nifti, save_nifti
from dipy.io.gradients import read_bvals_bvecs
from dipy.core.gradients import gradient_table
import dipy.reconst.dti as dti

3.2. 画像およびMPG軸情報の読み込み

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を渡す。

maskdata, mask = median_otsu(data, vol_idx=np.where(bvals == 0)[0])

3.4. モデルフィッティング

以下のコマンドで、DTIのモデルフィッティングを実行。

tenmodel = dti.TensorModel(gtab)
tenfit = tenmodel.fit(maskdata)

3.5. 拡散定量値の計算

モデルフィッティングができたら、拡散定量値を算出する。

FA = tenfit.fa
MD = tenfit.md
AD = tenfit.ad
RD = tenfit.rd
colour_FA = tenfit.color_fa

脳周囲の背景では、フィッティングミスをしてnanとなる場合があるため、そのようなnanを0に置き換える。

FA[np.isnan(FA)] = 0
MD[np.isnan(MD)] = 0
AD[np.isnan(AD)] = 0
RD[np.isnan(RD)] = 0
colour_FA[np.isnan(colour_FA)] = 0

3.6. NIfTI形式で保存

save_nifti関数で、画像をNIfTI形式で保存する。

save_nifti('DWI_masked.nii.gz', maskdata.astype(np.float32), affine)
save_nifti('DWI_mask.nii.gz', mask.astype(np.float32), affine)
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)
save_nifti('colour_FA.nii.gz', colour_FA.astype(np.float32), affine)

3.7. 結果

DTIによって算出された定量値画像は、以下の通り。

【DIPY】DIPYを用いた拡散MRIのノイズ除去 ~Denoise~


1. 目的
2. 準備
2.1. DIPYのインストール
2.2. 使用データ
3. 拡散MRIのノイズ除去
3.1. 必要なパッケージをインポート
3.2. 画像およびMPG軸情報の読み込み
3.3. ノイズ除去(デノイズ)
3.4. NIfTI形式で保存
3.5. 結果
4. おまけ


1. 目的

  • DIPYを用いた拡散MRIのノイズ除去 ~Denoise~

2. 準備

2.1. DIPYのインストール

pip3 install dipy

2.2. 使用データ

データを次のフォルダ構造で用意する。

Study/
└── Subject
    ├── DWI.nii.gz  # 拡散MRI
    ├── DWI_mask.nii.gz  # 拡散MRIマスク画像
    ├── bvals  # b-values
    └── bvecs  # b-vectors

3. 拡散MRIのノイズ除去

Pythonで以下のコマンドを実行。

3.1. 必要なパッケージをインポート

import numpy as np
import matplotlib.pyplot as plt
from time import time
from dipy.denoise.localpca import mppca
from dipy.core.gradients import gradient_table
from dipy.io.image import load_nifti, save_nifti
from dipy.io.gradients import read_bvals_bvecs
from dipy.segment.mask import median_otsu

3.2. 画像およびMPG軸情報の読み込み

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. ノイズ除去(デノイズ)

mppca関数を用いて、Marchenko-Pastur PCAを用いたデノイズをする。

denoised_arr = mppca(data, patch_radius=3)

3.4. NIfTI形式で保存

save_nifti関数で、画像をNIfTI形式で保存する。

save_nifti('DWI_denoised.nii.gz', denoised_arr.astype(np.float32), affine)

3.5. 結果

拡散強調像(b=2000 s/mm^2)のデノイズ前後の比較と差分画像は、以下。

実際に、デノイズ前(上段)とデノイズ後(下段)でDTIおよびDKIを計算し、比較してみる。

4. おまけ

Marchenko-Pastur PCAアルゴリズムは、ノイズの標準偏差も推定することができる。ノイズの標準偏差を算出するためには、return_sigmaのフラグを「True」にする。

denoised_arr, sigma = mppca(data, patch_radius=3, return_sigma=True)
save_nifti('DWI_noise_sigma.nii.gz', sigma .astype(np.float32), affine)

ノイズの標準偏差マップは、以下の通り。

脳領域における平均ノイズ標準偏差は、次のようにして計測できる。

mean_sigma = np.mean(sigma[mask])
print(mean_sigma)

推定した平均ノイズ標準偏差を用いて、b=0 (s/mm^2)画像のSNRを算出する。

b0 = denoised_arr[..., 0]
mean_signal = np.mean(b0[mask])
snr = mean_signal / mean_sigma
print(snr)

【DIPY】DIPYを用いたギブズのリンギングアーチファクト(Gibbs ringing)の除去


1. 目的
2. 準備
2.1. DIPYのインストール
2.2. 使用データ
3. 拡散MRIのノイズ除去
3.1. 必要なパッケージをインポート
3.2. 画像およびMPG軸情報の読み込み
3.3. マスク画像の作成
3.4. ギブズのリンギングアーチファクト除去
3.5. NIfTI形式で保存
3.6. 結果


### 1. 目的

  • DIPYを用いたギブズのリンギングアーチファクト(Gibbs ringing)の除去

2. 準備

2.1. DIPYのインストール

pip3 install dipy

2.2. 使用データ

データを次のフォルダ構造で用意する。

Study/
└── Subject
    ├── DWI.nii.gz  # 拡散MRI
    ├── DWI_mask.nii.gz  # 拡散MRIマスク画像
    ├── bvals  # b-values
    └── bvecs  # b-vectors

3. 拡散MRIのノイズ除去

Pythonで以下のコマンドを実行。

3.1. 必要なパッケージをインポート

from dipy.denoise.gibbs import gibbs_removal
import matplotlib.pyplot as plt
import numpy as np
from dipy.segment.mask import median_otsu
from dipy.io.image import load_nifti, save_nifti
from dipy.io.gradients import read_bvals_bvecs
from dipy.core.gradients import gradient_table

3.2. 画像およびMPG軸情報の読み込み

DWI_FILE = 'DWI.nii.gz'
BVALS_FILE = 'bvals'
BVECS_FILE = 'bvecs'

# Import data
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を渡す。

maskdata, mask = median_otsu(
    data, vol_idx=np.where(bvals == 0)[0])

3.4. ギブズのリンギングアーチファクト除去

gibbs_removal関数を用いて、リンギングアーチファクトを除去する。

data_corrected = gibbs_removal(maskdata)

3.5. NIfTI形式で保存

save_nifti関数で、画像をNIfTI形式で保存する。

save_nifti('DWI_degibbs.nii.gz', data_corrected.astype(np.float32), affine)

3.6. 結果

補正前後の画像は、以下の通り。