位相限定相関法(POC)

2枚の画像をかなり高精度に合わせこむ、最近注目の方法ということで作ってみました。
やっていることはシンプルなんですが、よく考えてあるな、という感じです。
平行移動のずれを求める場合と、回転角のずれを求める場合(回転不変位相限定相関RIPOC)を
作ってみました。

【平行移動の場合(従来方法)】
通常、2枚の画像の位置ずれを求める場合は、画像の相関をとることがよく行われます。
この場合、2枚の画像をずらしながら相関値を求めてもいいですが、
FFTで周波数空間に変換して、両者の積をとって、逆FFTしても計算できます。

例)

例えばこの2枚の画像の相関マップ(相関が高いほど明るい)は次のようになる。

位置ずれ量はこの相関値のピークを求めることで特定できます。
サブピクセル精度で位置ずれを求める場合は、最大値付近を2次曲面等で当てはめて求めます。

【平行移動の場合(POC)】
これに対して、位相限定相関法では、2枚の画像をFFTして、両者の積を求める際に周波数成分を振幅値で割った後に積をとり逆FFTします。
本当にただこれだけなんですが、前記の方法よりもすさまじく鋭いピークが出現します。


この明るい点の位置が位置ずれ量となります。この位置を求めるだけでもかなり精度がでそうですが、位相限定相関法では、さらに、この明るい点の位置を求める際に、理想的にはこの明るい点の分布が、

f(x,y)=\frac{sin(\pi x)sin(\pi y)}{W\times Hsin(\pi x/W)sin(\pi y/H)}
こういう形。

となることから、この式を当てはめることで、2次曲面当てはめよりもはるかに高い精度でずれを検知できます。

【回転角度の検出(RIPOC)】
回転角度を検出する場合は、2枚の画像の周波数画像をLog-Polar変換を行うことで、回転のずれを両者の位置ずれを求めることに置き換えることができます(ただし、振幅情報を捨てているので0〜180°の範囲でしか検出できない?)。
この位置ずれの計算もPOCで高精度に算出できます。


こういうフーリエパワースペクトルがあったら、

 
Log-Polar変換をするとこんな感じになる。2枚は回転角度が違うが、その角度差がX方向のずれで現われる。

回転角度+位置ずれを検知する場合は、まずRIPOCで回転角度を求めて、
テンプレート画像を回転させて、POCで位置ずれ量を求めます。

【テスト結果】
 
この2枚の画像をRIPOC+POCで求めてみる。右の画像は左を33.75°回転させて、(10.5, 17.25)ピクセルだけ平行移動したものです。補間はlanczos。


結果:(10.51, 17.33), 34.09

位置ずれ差は、(0.01, 0.06)、角度差は0.34°。かなり良いです。
文献を読むと位置精度は0.006、回転角は0.03°と一ケタ違うのですが・・・

プログラムを置きます。
http://g0307.hp.infoseek.co.jp/POC_vs2008.zip

【参考】
 東北大学・青木先生のページ:http://www.aoki.ecei.tohoku.ac.jp/research/suiran/index.html
(関連論文は検索するとたくさん出てきます)
・FFTのソースコードhttp://www5.airnet.ne.jp/tomy/cpro/sslib8.htm
 コピペさせていただきました。