はじめに
当記事では,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'))
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
などが選択できます1.当記事では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による変形を行います.
Registrationのparameter
parameterとしては,イテレーション回数,metric,サンプリング,多重解像度などを変更することができます.具体例をのせます.
ANTsのSyNのmetricはデフォルトだとMIですが,元論文2に従い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')
まとめ
当記事ではSyNアルゴリズムの使い方を説明しました.今回は2次元画像を用いましたが,3次元画像でも同様にできます.
Reference
ANTsPy github
公式のgitです.ここからインストールしましょう.
ANTsPy Documentation
広く浅くという印象です.
ANTsPy Source code for ants.registration.interface
分かりやすいです.これ詳細な情報は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))
この時のCCは0.427
でした.
-
Bsplineによる変形はANTsには実装されていません.Elastixなどを用いましょう.
B-spline registration 〜非線形画像登録への入門〜 ↩ -
Symmetric diffeomorphic image registration with cross-correlation: evaluating automated labeling of elderly and neurodegenerative brain ↩