5分で使えるANTs画像レジストレーション

# はじめに

当記事では，SyN(Symmetric image Normalization method)によるレジストレーションを目的としています．画像レジストレーションとは，二つの画像間の適切な変形場を求める作業です．

# ANTsPy
レジストレーション，セグメンテーションツールで最良の精度を誇るANTs(Advanced Normalization Tools)はC++で書かれています．ANTsPyはANTsのwrapperであるPythonライブラリであり，今回はこれを使用します．

# 使用するデータ
ANTsPyに備え付けられているデータを使います．

```
fix = ants.image_read(ants.get_ants_data('r16'))
mov = ants.image_read(ants.get_ants_data('r64'))
```
画像は以下のような2次元ヒト脳です．
![ANTsTuto1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520106/ecf9dd69-60cc-957d-9a93-dc45085a5a63.png)

`ants.get_ants_data('r16')`は備え付け画像のパスを返します．

```
fix
```
>ANTsImage
   	 Pixel Type : float (float32)
	 Components : 1
	 Dimensions : (256, 256)
	 Spacing    : (1.0, 1.0)
	 Origin     : (0.0, 0.0)
	 Direction  : [1. 0. 0. 1.]

ANTsでの入出力は`ANTsImage`という型で行います．`fix.numpy()`のように書けば`ndarray`に変換できます．

# Registration
ANTsの変形は，

- Translation（平行移動）
- Rigid（回転と平行移動）
- Affine（Rigidと拡大縮小）

などが基本で，それに加えて

- SyN
- TVMSQ

などが選択できます[^2]．当記事ではSyNを用いたレジストレーションを行います．

```
tx = ants.registration(fix, mov, type_of_transform = 'SyN', outprefix = 'SyN_r16_r64_')
warp = tx['warpedmovout']
tx
```
> {'warpedmovout': ANTsImage
 	 Pixel Type : float (float32)
 	 Components : 1
 	 Dimensions : (256, 256)
 	 Spacing    : (1.0, 1.0)
 	 Origin     : (0.0, 0.0)
 	 Direction  : [1. 0. 0. 1.],
 'warpedfixout': ANTsImage
 	 Pixel Type : float (float32)
 	 Components : 1
 	 Dimensions : (256, 256)
 	 Spacing    : (1.0, 1.0)
 	 Origin     : (0.0, 0.0)
 	 Direction  : [1. 0. 0. 1.],
 'fwdtransforms': ['SyN_r16_r64_1Warp.nii.gz', 'SyN_r16_r64_0GenericAffine.mat'],
 'invtransforms': ['SyN_r16_r64_0GenericAffine.mat',
  'SyN_r16_r64_1InverseWarp.nii.gz']}

変形`tx`は辞書で値を返します．`tx['warpedmovout']`が画像`mov`を移動させた`ANTsImage`です．`tx['fwdtransforms']`は今回用いられた変形場です．`type_of_transform = 'SyN'`では，Affine変換を行なった後に，SyNによる変形を行います．
![SyNMI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520106/671a0307-a2ad-9a72-ab8a-8be47d7310c6.png)

`fix`と`warp`のCCの平均は`0.688`となりました．
![MICC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520106/1e164a7f-41bb-c614-a7a8-b6dadaa2758a.png)



## Registrationのparameter
parameterとしては，イテレーション回数，metric，サンプリング，多重解像度などを変更することができます．具体例をのせます．

ANTsのSyNのmetricはデフォルトだとMIですが，元論文[^3]に従いCCを用います．

```
tx = ants.registration(fix, mov, type_of_transform = 'SyN', syn_sampling = 4, shrinkfactors = (8,4,2,1), smoothingsigmas = (3,2,1,0), reg_iterations = (1000,1000,100,20), syn_metric = 'CC')
```
![SyNCC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520106/b28e2c4a-f13d-bf8d-7029-1fe1d2aafc88.png)
この時のCCは`0.883`でした．

# まとめ
当記事ではSyNアルゴリズムの使い方を説明しました．今回は2次元画像を用いましたが，3次元画像でも同様にできます．

# Reference

<a href = "https://github.com/ANTsX/ANTsPy" > ANTsPy github </a>
公式のgitです．ここからインストールしましょう．

<a href = "https://buildmedia.readthedocs.org/media/pdf/antspy/latest/antspy.pdf" > ANTsPy Documentation </a>
広く浅くという印象です．

<a href = "https://antspy.readthedocs.io/en/latest/_modules/ants/registration/interface.html#registration" > ANTsPy Source code for ants.registration.interface</a>
分かりやすいです．これ詳細な情報はC++のコードにあります．


# Appendix: Affineのparameter
レジストレーションでは，まずAffine変換を行ったのち，非線形変換を選ぶのが一般的です．最初の登録であるAffine変換の精度は重要です．しかし`type_of_transform = 'Affine' `としてAffineを選択してもイテレーション回数や多重解像度の変数を変更することが出来ません．元のANTsだと変更できますが，ソースコードを見る限りANTsPyだとできないようです．

この解決策として，`type_of_transform = 'TRSAA' `を選択します．TRSAAはTranslation, Rigid, Similarity, Affine, Affine変換戦略です．前半のTranslation, Rigid, Similarityの部分ではparameterを変更できませんが，後半のAffine, Affine部分のparameterは変更することが出来ます．

```
tx = ants.registration(fix, mov, type_of_transform = 'TRSAA', grad_step = 0.2, shrinkfactors = (8,4,2,1), smoothingsigmas =(3,2,1,0), reg_iterations = (500,500,200,50))
```
![Affine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520106/ad291709-39e6-b1d2-ab2e-5ea9f99f4836.png)

この時のCCは`0.427`でした．

[^1]: 

[^2]: Bsplineによる変形はANTsには実装されていません．Elastixなどを用いましょう．<br><a href = "https://qiita.com/39MIFU/items/06aa11512937cae8f0a7">B-spline registration 〜非線形画像登録への入門〜</a>


[^3]: <a href = "https://pubmed.ncbi.nlm.nih.gov/17659998/" >Symmetric diffeomorphic image registration with cross-correlation: evaluating automated labeling of elderly and neurodegenerative brain</a>