【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【脳画像解析】拡散MRIを用いたDTI / Tractographyの基本

目的

  • 拡散MRIを用いた拡散テンソルイメージング (DTI)およびトラクトグラフィー (Tractography) の基礎
  • ソフトウェアは、MRtrix3を用いる

MRtrix3のインストール

MRtrix3のインストールは、次のリンクを参考に進める。

www.mrtrix.org

拡散テンソルイメージング(DTI)解析

準備するデータ

準備すべきデータは、次の通り。

seedは、Tractographyをする際のTractの出発点をBinary ROIで定義したファイル。

.
├── DWI.bval  # DWI b-values
├── DWI.bvec  # DWI b-vectors
├── DWI.nii.gz  # DWI
├── maskDWI.nii.gz  # mask DWI
├── run.sh
└── seed
    ├── 1_Subj.nii.gz
    ├── 2_Subj.nii.gz
    ├── 3_Subj.nii.gz
    └── 4_Subj.nii.gz

前処理

次のコマンドでDWIデータをNIFITIからMIF形式に変換する。

#!/bin/bash

# Required files
# - DWI.nii.gz: DWI(b=0,2000)
# - maskDWI.nii.gz: DWI mask
# - DWI.bvec: b-values(b=0,2000)
# - DWI.bval: b-vectors(b=0,2000)

# Compressed data
# find . -name "*nii" | xargs -i gzip {}  # Linuxの方はこちら
find . -name "*nii" | xargs -I {} gzip {}  # Maxの方はこちら
# Define
rawimage='DWI.nii.gz'
mask='maskDWI.nii.gz'
bvec='DWI.bvec'
bval='DWI.bval'

# 1. Convert NIFTI to MIF
mrconvert -fslgrad $bvec $bval $rawimage DWI.mif

# 2. DWI mask
# It didn't work well. So another mask was applied.
# dwi2mask  DWI.mif DWI_mask.mif
mrconvert $mask DWI_mask.mif

DTI定量値の計算

次に、DWI画像からテンソル (Tensor)を計算する。テンソルを計算するには、dwi2tensorコマンドを用いて次のようなコードを実行する。

# 3. Fitting diffusion tensor
# Ex. dwi2tensor <INPUT> <OUTPUT> -mask <MASK>
dwi2tensor DWI.mif tensor.mif -mask DWI_mask.mif

テンソルを計算することで、DTIの様々な定量値を算出することができる。次のコードではFA/MD/AD/RD/Colour-encoded FAをテンソル画像(tensor.mif)から算出している。

## Calculate diffusion metrics
tensor2metric tensor.mif -fa FA.mif        # FA
tensor2metric tensor.mif -adc MD.mif       # MD
tensor2metric tensor.mif -ad AD.mif        # AD
tensor2metric tensor.mif -rd RD.mif        # RD
tensor2metric tensor.mif -vec color_FA.mif # Color-Encoded FA

算出したDTI定量画像を確認するには、mrviewを用いて次のようにコマンドを実行する。

mrview FA.mif &
mrview MD.mif &
mrview AD.mif &
mrview RD.mif &
mrview color_FA.mif &
FA

f:id:AIProgrammer:20201116102208p:plain

MD

f:id:AIProgrammer:20201116102217p:plain

f:id:AIProgrammer:20201116102232p:plain

RD

f:id:AIProgrammer:20201116102242p:plain

Colur-encoded FA

f:id:AIProgrammer:20201116102249p:plain

manualで開く場合。まず、mrviewを実行して、MRtrix image viewerを立ち上げる。

mrview

f:id:AIProgrammer:20201109154704p:plain

左上の「File」から「Open...」を選択。 f:id:AIProgrammer:20201109155222p:plain

「color_FA.mif」を選択。

f:id:AIProgrammer:20201109160210p:plain

Colour-Encoded FAが表示される。

f:id:AIProgrammer:20201109160358p:plain

DTI定量値の計測

Tractographyのseed画像として用意した画像をMaskとしてDTI定量値を計測する。

└── seed
    ├── 1_Subj.nii.gz
    ├── 2_Subj.nii.gz
    ├── 3_Subj.nii.gz
    └── 4_Subj.nii.gz

MRtrix3で、定量値を計測するにはmrstatsを用いる。-maskの後に画像を指定することでその領域のみの定量値を計測する。また、-ignorezeroを指定することでVoxel内の定量値が0以外のVolxelを対象に計測を実行する。

mrstats  -mask <MASK> -ignorezero <INPUT IMAGE>

実際に1_SubjのFA(FA.mif)を1_Subjのseed画像(seed/1_Subj.nii.gz)をMaskとして計測するには、次のコマンドを実行する。

mrstats -mask seed/seed_CC/Untitled1.nii.gz -ignorezero FA.mif 

実行が成功すると、次のように定量値の記述統計量が算出される。他の画像を計測したければ、Maskを変更したり入力する画像を変更すればよい。

mrstats: [100%] uncompressing image "seed/1_Subj.nii.gz"
      volume       mean     median        std        min        max      count
       [ 0 ]   0.405088 0.394273698   0.115037    0.19211   0.715012        100

トラクトグラフィー(Tractography)

準備するデータ

準備するデータは次の通り。b-valueは0, 2000のSingle-shell data。

seedは、Tractographyをする際のTractの出発点をBinary ROIで定義したファイル。

.
├── DWI.bval  # DWI b-values
├── DWI.bvec  # DWI b-vectors
├── DWI.nii.gz  # DWI
├── maskDWI.nii.gz  # mask DWI
├── run.sh
└── seed
    ├── 1_Subj.nii.gz
    ├── 2_Subj.nii.gz
    ├── 3_Subj.nii.gz
    └── 4_Subj.nii.gz

Seed imageの作成方法

MRIcronITK-SNAPは、それぞれ医用画像ViewerであるがROIを作成することもできる。ここでは、MRIcronとITK-SNAPそれぞれでどのように、seed imageを作成するか解説する。

MRIcron

お使いのOSに合わせて、こちらからMRIcronをインストールする。

Windowsの方は、根本先生がご紹介されている「WindowsでのMRIcronのインストール方法」を参考にするとよい。

まず、下地となる画像をMRIcronで開く。画像を開くには、左上のタブ「File」から「Open」を選択。画像ファイルをMRIcronにドラッグ&ドロップしても開ける。

f:id:AIProgrammer:20201109163717p:plain

開きたい画像を選択する。ここでは、DWIである「DWI.nii.gz」を選択する。

f:id:AIProgrammer:20201109164135p:plain

DWIである「DWI.nii.gz」を選択すると、次のように「4DであるDWIの内、どのVolumeを開くか」ということを聞かれる。ここでは、b=0にあたる1 volume目を選択する。

f:id:AIProgrammer:20201109164158p:plain

以上の作業を終えると、次のようにDWIの内b=0の画像が表示される。

f:id:AIProgrammer:20201109164359p:plain

「Pen Tool」f:id:AIProgrammer:20201109164711p:plainをActiveにして、ROI作成モードにする。この状態で、左クリックを押しながら、ドラッグすることでROIが作成できる。MRIcronにおけるROI作成で基本的な使い方は、次の通り。

  • 基本的なROI作成: 左クリック + ドラッグ
  • FillするようにROI作成: 右クリック(Ex. 左クリック + ドラッグで円を作り、円の内側を右クリックすることで塗りつぶす)
  • 消去: shift + 左クリック + ドラッグ
  • ROIの透明度: タブ「Overlay」の「Transparency on background」や「Transparency on overlay」で変更
  • 保存: タブ「Draw」の「Save VOI...」から保存
  • 開いているROIを閉じる: タブ「Draw」の「Close VOI..」
  • 既に作成したROIを開く: タブ「Draw」の「Open VOI..」

f:id:AIProgrammer:20201109165459p:plain

作成したVOIを保存するには、タブ「Draw」の「Save VOI...」を選択。

f:id:AIProgrammer:20201109172850p:plain

名前を付けて保存。ここでは、各被験者のseed image (ROI)を「tract」フォルダに保存する。

f:id:AIProgrammer:20201109172453p:plain

新たに他の被験者のseed imageを作成する際には一度、開いているROIを閉じる(タブ「Draw」の「Close VOI..」)。

f:id:AIProgrammer:20201109173500p:plain

既に作成したROIを開くには、タブ「Overlay」から「Add」を選択し、開きたいROIを選択。

f:id:AIProgrammer:20201109173757p:plain

既に作成したROIを修正したい場合には、タブ「Draw」から「Open VOI...」を選択し、修正したいROIを開く。この開き方をすれば、「Pen Tool」f:id:AIProgrammer:20201109164711p:plainをActiveしてROIを修正できる。

f:id:AIProgrammer:20201109174520p:plain

ITK-SNAP

お使いのOSに合わせて、こちらからITK-SNAPをインストールする。

まず、ITK-SNAPで開く画像を準備する。DWI画像は4Dであるが4D画像だとITK-SNAPでうまく表示されない。そこで、DWIの内、b=0の画像を取り出しその画像の上でROIを作成する。

DWIからb=0の画像は1 volume目にある。DWIからb=0の画像を取り出すには、fslroiコマンドを用いる。ここではDWIから1 volume目を取り出して、b0.nii.gzという名前でファイルを保存する。

fslroi DWI.nii.gz b0.nii.gz 0 1

まず、下地となる画像をITK-SNAPで開く。画像を開くには、左上のタブ「File」から「Open Main Image...」を選択。画像をITK-SNAPにドラッグ&ドロップしても開くことができる。

f:id:AIProgrammer:20201109180039p:plain

ここでは、DWIの内、b=0である「b0.nii.gz」を選択する。

f:id:AIProgrammer:20201109183524p:plain

「File Format:」がNiFTIであることを確認して、「Next >」を選択。

f:id:AIProgrammer:20201109182257p:plain

すると、b=0の画像が開かれる。

f:id:AIProgrammer:20201109183653p:plain

左側のITK-SNAP Toolboxの「Paintbrush Mode」f:id:AIProgrammer:20201109184359p:plainをActiveにする。

f:id:AIProgrammer:20201109184302p:plain

左側のITK-SNAP Toolboxを見ると、Paintbrush Inspectorが出てくる。ここで、ROIの形をBrush Styleで選んだり、ブラシのサイズをBrush Sizeで調節したりできる。Brush Optionsの「3D」と「Isotropic」を有効にすることで3Dで球形のROIを作成することができる。

f:id:AIProgrammer:20201109184540p:plain

ITK-SNAPでよく使う機能は次の通り。

  • 拡大・縮小: 右クリック + 前後ドラッグ
  • 平行移動: ホイールクリック + ドラッグ
  • コントラストを自動で調節: ctrl + J
  • ROIの保存: タブ「Segmentation」の「Save Segmentation Image...」
  • ROIを閉じる: タブ「Segmentation」の「Unload Segmentation」
  • 既に作成したROIを編集するために開く: タブ「Segmentation」の「Open Segmentation...」

Tractographyの生成

Tractographyの基本的な流れは、次の通り。

  1. NIFTIをMIFに変換 (mrconvert)。この時、gradient tableを織り込む (-fslgrad)。
  2. DWI maskの生成 (dwi2mask)。この例では、他の手法で生成したDWI maskを適応 (maskDWI.nii.gz)。
  3. Response functionの推定 (dwi2response)
  4. FOD (Fiber Orientation Distribution)の推定 (dwi2fod)
  5. Tractographyの生成 (tckgen)。結果は「tract」フォルダに保存される。

テキストエディタを使って、次のファイルを「run.sh」として保存する。

run.sh

#!/bin/bash

# Required files
# - DWI.nii.gz: DWI(b=0,2000)
# - maskDWI.nii.gz: DWI mask
# - DWI.bvec: b-values(b=0,2000)
# - DWI.bval: b-vectors(b=0,2000)

# Compressed data
# find . -name "*nii" | xargs -i gzip {}  # Linuxの方はこちら
find . -name "*nii" | xargs -I {} gzip {}  # Maxの方はこちら
# Define
rawimage='DWI.nii.gz'
mask='maskDWI.nii.gz'
bvec='DWI.bvec'
bval='DWI.bval'

# 1. Convert NIFTI to MIF
mrconvert -fslgrad $bvec $bval $rawimage DWI.mif

# 2. DWI mask
# It didn't work well. So another mask was applied.
# dwi2mask  DWI.mif DWI_mask.mif
mrconvert $mask DWI_mask.mif

# 3. Estimate response function
dwi2response tournier DWI.mif response.txt -mask DWI_mask.mif

# 4. Estimate FOD
dwiextract DWI.mif - | dwi2fod msmt_csd - response.txt fod.mif -mask DWI_mask.mif

# 5. Generate tract
mkdir tract
for k in $(\ls seed | cut -d . -f1); do
    tckgen fod.mif tract/${k}.tck \
        -seeds 10000 -select 10000 \
        -seed_image seed/${k}.nii.gz \
        -cutoff 0.2
done

run.shの準備ができたら、次のようなディレクトリ構造になっているか確認。

.
├── DWI.bval  # DWI b-values
├── DWI.bvec  # DWI b-vectors
├── DWI.nii.gz  # DWI
├── maskDWI.nii.gz  # mask DWI
├── run.sh
└── seed
    ├── 1_Subj.nii.gz
    ├── 2_Subj.nii.gz
    ├── 3_Subj.nii.gz
    └── 4_Subj.nii.gz

確認ができたら、上のディレクトリで次のコマンドを実行し、Tractographyを生成する。

bash run.sh

結果の表示

Tractographyの結果を表示する。

コマンドから表示する場合

一つの画像にすべてのTractographyを表示する場合。

# View result
## All tracks in one
mrview DWI.mif \
    -tractography.load tract/1_Subj.tck \
    -tractography.load tract/2_Subj.tck \
    -tractography.load tract/3_Subj.tck \
    -tractography.load tract/4_Subj.tck &

f:id:AIProgrammer:20201109155806p:plain

被験者ごとにTractographyを表示するために、被験者分Viewerを立ち上げる場合。

## Each track in one
mrview DWI.mif \
    -tractography.load tract/1_Subj.tck &
mrview DWI.mif \
    -tractography.load tract/2_Subj.tck &
mrview DWI.mif \
    -tractography.load tract/3_Subj.tck &
mrview DWI.mif \
    -tractography.load tract/4_Subj.tck &

f:id:AIProgrammer:20201109155941p:plain

Manualで開く場合

manualで開く場合。まず、mrviewを実行して、MRtrix image viewerを立ち上げる。

mrview

f:id:AIProgrammer:20201109154704p:plain

左上の「File」から「Open...」を選択。 f:id:AIProgrammer:20201109155222p:plain

DWIである「DWI.mif」を選択。 f:id:AIProgrammer:20201109160619p:plain

DWI.mifが表示される。

f:id:AIProgrammer:20201109160811p:plain

生成したTractographyを表示するには、右上の「Tool」から「Tractography」を選択。

f:id:AIProgrammer:20201109161032p:plain

「Tool」から「Tractography」を選択すると次のようになる。

f:id:AIProgrammer:20201109161425p:plain

「Open tractogram」f:id:AIProgrammer:20201109161553p:plainから、表示したいTractを選択する。生成した各被験者のTractは「tract」フォルダに保存してある。

f:id:AIProgrammer:20201109161850p:plain

表示したいTractを選択すると次のように、DWIを下地としたTractographyを表示される。

f:id:AIProgrammer:20201109162142p:plain

seed imageを変更した後にもう一度Tractographyをしたい場合

次のファイルがあるかを確認。

  • FOD: fod.mif
  • seed: seedフォルダ内に作成した各被験者のseed image

以上のファイルがあるディレクトリで、次のコマンドを実行。

mkdir tract
for k in $(\ls seed | cut -d . -f1); do
    tckgen fod.mif tract/${k}.tck \
        -seeds 10000 -select 10000 \
        -seed_image seed/${k}.nii.gz \
        -cutoff 0.2 -force
done