はじめに
画像処理において、2つの画像間のシフト量(平行移動量)を正確に測定することは重要な課題です。scikit-imageライブラリのregister_translation関数は、位相相関法を用いてこのシフト量を高精度で計算します。本記事では、この関数の使い方と応用例について解説します。
コード

解説
モジュールのインポート
画像データの読み込み
シフト量の設定
np.random.randint(100)は0〜99の範囲の整数をランダムに1つ生成する関数で、x軸とy軸それぞれに対して適用しました。生成されたシフト値は以下の通りです。
画像のシフト
np.fft.fftn(image)は画像を離散フーリエ変換したものです。これをfourier_shift()関数によりフーリエ空間上でシフトさせ、その後np.fft.ifftn()で逆フーリエ変換して元の画像に戻します。
画像のシフト量を求める
register_translation(元画像、シフト画像)関数を使用することでシフト量を算出できます。得られたシフト量は前述の値にマイナスが付いた値となっており、このことから計算が正しく行われていると判断できます。
この処理のアルゴリズムが何であるかを示すため、相互相関の結果を図で示します。
まず、元画像の2次元フーリエ変換と、シフト画像の2次元フーリエ変換の複素共役の積を計算します。次に、この結果を逆2次元フーリエ変換し、ゼロ周波数成分をスペクトルの中心に移動させます。最後に、この画像の実部を.realメソッドで抽出して図に表示します。
画像の表示
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
まとめ
scikit-imageのregister_translation
関数を使用することで、画像間の平行移動量を高精度で測定できることがわかりました。この手法は画像の位置合わせや動き検出などの応用に役立ちます。位相相関法はノイズに強く、計算効率も良いため、実用的な画像処理タスクに適しています。
コメント
[…] [scikit-image] 31. 位相相関から画像間のシフト量を求める(skimage.feature register_translation)ここではskimage.featureのregister_translationにより、画像間のシフト量を求める方法について説明する。sabopy.c […]