[scikit-image] 31. 位相相関から画像間のシフト量を求める(skimage.feature register_translation)

python

はじめに

画像処理において、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関数を使用することで、画像間の平行移動量を高精度で測定できることがわかりました。この手法は画像の位置合わせや動き検出などの応用に役立ちます。位相相関法はノイズに強く、計算効率も良いため、実用的な画像処理タスクに適しています。

参考

Structural similarity index — skimage 0.25.2 documentation
scipy.ndimage.fourier.fourier_shift — SciPy v0.15.1 Reference Guide
numpy.fft.fftn — NumPy v1.15 Manual
numpy.fft.ifftn — NumPy v1.13 Manual
numpy.fft.fft2 — NumPy v2.3 Manual
numpy.conj — NumPy v2.3 Manual
numpy.fft.ifft2 — NumPy v2.3 Manual

コメント

  1. […] [scikit-image] 31. 位相相関から画像間のシフト量を求める(skimage.feature register_translation)ここではskimage.featureのregister_translationにより、画像間のシフト量を求める方法について説明する。sabopy.c […]