ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

多様な MRI イメージのレジストレーション

この例では、imregister を使用して、強度ベースのイメージ レジストレーションにより 2 つの MRI (磁気共鳴画像) を一般的な座標系に自動的に整列させる方法を説明します。他の手法とは異なり、特徴を検索したり、コントロール ポイントを使用したりしません。多くの場合、強度ベースのレジストレーションは医療画像および遠隔測定イメージに適しています。

手順 1: イメージの読み込み

この例では、膝の 2 枚の MRI (磁気共鳴) 画像を使用します。固定イメージはスピン エコー イメージであり、移動イメージは反転回復を行ったスピン エコー イメージです。同時に 2 枚の矢状スライスが取得されますが、ややずれています。

fixed = dicomread('knee1.dcm');
moving = dicomread('knee2.dcm');

関数 imshowpair は、レジストレーション プロセスのあらゆる部分でのイメージの可視化に役立つ関数です。この関数は、モンタージュ形式で 2 枚のイメージを個別に表示したり、2 枚のイメージを重ねて位置ずれの程度を示したりするために使用します。

figure, imshowpair(moving, fixed, 'montage')
title('Unregistered')

imshowpair で重ね合わせたイメージで、灰色の領域は類似した強度の領域に対応し、マゼンタおよび緑色の領域は片方のイメージが他方のイメージよりも明るい部分を示します。イメージの組によっては、緑色およびマゼンタの領域にレジストレーションの誤差が示されない場合もありますが、この例では色の情報を使用して位置ずれが示される箇所を簡単に表示できます。

figure, imshowpair(moving, fixed)
title('Unregistered')

手順 2: 初期レジストレーションの設定

関数 imregconfig を使用すると、imregister での使用に適したオプティマイザーおよびメトリックの構成を簡単に選択できます。この 2 つのイメージは異なる強度分布を取るため、ここでは多モードの構成が示唆されます。

[optimizer,metric] = imregconfig('multimodal');

2 つのイメージ間の歪みには、スケーリング、回転および (場合によっては) せん断が含まれています。イメージのレジストレーションにはアフィン変換を使用します。

imregister によって既定の設定でイメージが完璧に整列することは非常にまれですが、どのプロパティを最初に調整するかを決定するための手段としては有効です。

tic
movingRegisteredDefault = imregister(moving, fixed, 'affine', optimizer, metric);
timeDefault = toc

figure, imshowpair(movingRegisteredDefault, fixed)
title('A: Default registration')
timeDefault =

    2.2974

手順 3: レジストレーションの改善

初期レジストレーションはうまくいきましたが、それでも整列していない領域が一部にあります。イメージの左右の端に沿って、および右側部分の小さな明るい帯内で簡単に確認できます。オプティマイザーおよびメトリックの構成プロパティを調整して、レジストレーションを改善してみましょう。

オプティマイザーおよびメトリックの変数は、そのプロパティによってレジストレーションを制御するオブジェクトです。

optimizer
metric
optimizer = 

  registration.optimizer.OnePlusOneEvolutionary

  Properties:
         GrowthFactor: 1.050000e+00
              Epsilon: 1.500000e-06
        InitialRadius: 6.250000e-03
    MaximumIterations: 100

metric = 

  registration.metric.MattesMutualInformation

  Properties:
    NumberOfSpatialSamples: 500
     NumberOfHistogramBins: 50
              UseAllPixels: 1

レジストレーションは既定のパラメーターを使用して改善されているため、最適化を長く実行すればさらに改善されます。

optimizer.MaximumIterations = 300;

movingRegistered = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegistered, fixed)
title('MaximumIterations = 300')

さらに長く実行した場合、改善され続けるでしょうか。

optimizer.MaximumIterations = 500;

tic
movingRegistered500 = imregister(moving, fixed, 'affine', optimizer, metric);
time500 = toc

figure, imshowpair(movingRegistered500, fixed)
title('B: MaximumIterations = 500')
time500 =

    9.9225

手順 4: レジストレーション速度の改善

前の節では、既定のパラメーターを使用し実行時間を長くするだけでレジストレーションが改善されることがよくあることを示しました。'MaximumIterations' の値を大きくすると収束しやすくなりますが、長時間実行することによって結果が損なわれることもよくあります。

オプティマイザーを初期のステップでよりアグレッシブなものにできることがあります。ステップ サイズを制御するパラメーターを変更すると、レジストレーションがより短時間で正しい解に近づくこともありますが、最適解が最適化空間の他の部分にある場合には、局所的な極値を最適解として見なしてしまう可能性があります。

'InitialRadius' プロパティは、オプティマイザーの初期探索範囲を制御します。

optimizer.MaximumIterations = 100;
optimizer.InitialRadius = 0.009;

movingRegistered = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegistered, fixed)
title('MaximumIterations = 100, InitialRadius = 0.009')

既定の設定と比較すると、結果は悪くなっています。'InitialRadius' で探索範囲の上限を指定し、'Epsilon' で下限を設定します。

[optimizer,metric] = imregconfig('multimodal');
optimizer.Epsilon = 1.5e-4;

movingRegistered = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegistered, fixed)
title('MaximumIterations = 100, Epsilon = 1.5e-4')

この構成では、既定のパラメーターを使用した場合とほぼ同じレジストレーションになりました。性能にほとんど違いはありません。

個別調整対象となるオプティマイザーのプロパティで残っているのは 'GrowthFactor' だけです。これは、パラメーター空間の探索範囲を広げる速度を制御します。成長係数が大きいと、さらにアグレッシブな最適化が行われます。

[optimizer,metric] = imregconfig('multimodal');
optimizer.GrowthFactor = 1.1;

movingRegistered = imregister(moving, fixed, 'affine', optimizer, metric);
figure, imshowpair(movingRegistered, fixed)
title('MaximumIterations = 100, GrowthFactor = 1.1')

それではアグレッシブすぎます。既定値が大きすぎる可能性があります。'GrowthFactor' の設定を小さくしてみてください。

optimizer.GrowthFactor = 1.01;

tic
movingRegisteredGrowth = imregister(moving, fixed, 'affine', optimizer, metric);
timeGrowth = toc

figure, imshowpair(movingRegisteredGrowth, fixed)
title('C: MaximumIterations = 100, GrowthFactor = 1.01')
timeGrowth =

    2.2227

手順 5: 追加の改善策

通常はステップ サイズ パラメーターと、実行する反復回数を共に変更することで、最良の結果が得られます。

[optimizer,metric] = imregconfig('multimodal');
optimizer.GrowthFactor = 1.01;
optimizer.InitialRadius = 0.009;
optimizer.Epsilon = 1.5e-4;
optimizer.MaximumIterations = 300;

tic
movingRegisteredTuned = imregister(moving, fixed, 'affine', optimizer, metric);
timeTuned = toc

figure, imshowpair(movingRegisteredTuned, fixed)
title('D: MaximumIterations = 300, GrowthFactor = 1.01, Epsilon = 1.5e-4, InitialRadius = 0.009')
timeTuned =

    6.5000

手順 6: 妥当な改善程度の決定

imregister の実行結果を別の構成の場合と比較すると、性能と精度との間にトレードオフがあることは明らかです。既定のレジストレーションを 100 回反復した場合 (A) と最も高度に調整されたプロパティのセット (B) との実行時間および品質の差は、かなり大きなものです。

非標準の成長係数を使用して imregister を 100 回反復した結果 (C) と最良の結果 (B) との差も明らかです。到達するまでの時間は比較的短いものの、最も高度に調整されたレジストレーションを 300 回反復した場合 (D) と既定のレジストレーションを 500 回反復した場合 (B) の品質とのトレードオフも大きくなっています。

figure
imshowpair(movingRegisteredDefault, fixed)
title(sprintf('A - Default settings - %0.2f sec', timeDefault))

figure
imshowpair(movingRegistered500, fixed)
title(sprintf('B - Default settings, 500 iterations - %0.2f sec', time500))

figure
imshowpair(movingRegisteredGrowth, fixed)
title(sprintf('C - Growth factor, 100 iterations - %0.2f sec', timeGrowth))

figure
imshowpair(movingRegisteredTuned, fixed)
title(sprintf('D - Highly tuned, 300 iterations - %0.2f sec', timeTuned))

手順 7: 別の可視化手法

多様なレジストレーションの品質が改善されると、レジストレーションの品質を視覚的に判断することはさらに難しくなることがよくあります。これは、位置のずれた領域が、強度の差が原因で不明瞭になる場合があるためです。imshowpair を別の表示モードに切り替えることで、表示されていなかった詳細情報が明らかになることがあります (そうでない場合もあります)。

この情報は役に立ちましたか?