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)