スズメレンダラー・クマ将棋の開発日記 このページをアンテナに追加 RSSフィード

ページビュー
196637
この日記のはてなブックマーク数
これまで作ったもの。
回転不変位相限定相関法(RPOC)
ハートリーフォック法で電子軌道計算
mpegIデコーダ
ベクターベースアプコン
自動伴奏・打ち込みソフト
画像修復(inpainting)
レンダラ(パストレでSSS)
 | 

2010-05-15 位相限定相関法(POC) このエントリーを含むブックマーク このエントリーのブックマークコメント

2枚の画像をかなり高精度に合わせこむ、最近注目の方法ということで作ってみました。

やっていることはシンプルなんですが、よく考えてあるな、という感じです。

平行移動のずれを求める場合と、回転角のずれを求める場合(回転不変位相限定相関RIPOC)を

作ってみました。

【平行移動の場合(従来方法)】

通常、2枚の画像の位置ずれを求める場合は、画像の相関をとることがよく行われます。

この場合、2枚の画像をずらしながら相関値を求めてもいいですが、

FFTで周波数空間に変換して、両者の積をとって、逆FFTしても計算できます。

例)

f:id:suzume_r:20100515184900j:image f:id:suzume_r:20100515184859j:image

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

f:id:suzume_r:20100515184858j:image

位置ずれ量はこの相関値のピークを求めることで特定できます。

サブピクセル精度で位置ずれを求める場合は、最大値付近を2次曲面等で当てはめて求めます。

【平行移動の場合(POC)】

これに対して、位相限定相関法では、2枚の画像をFFTして、両者の積を求める際に周波数成分を振幅値で割った後に積をとり逆FFTします。

本当にただこれだけなんですが、前記の方法よりもすさまじく鋭いピークが出現します。

f:id:suzume_r:20100515185339j:image

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

f(x,y)=¥frac{sin(¥pi x)sin(¥pi y)}{W¥times Hsin(¥pi x/W)sin(¥pi y/H)}

f:id:suzume_r:20100515185809j:imageこういう形。

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

【回転角度の検出(RIPOC)】

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

この位置ずれの計算もPOCで高精度に算出できます。

f:id:suzume_r:20100515190240j:image

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

f:id:suzume_r:20100515190239j:image f:id:suzume_r:20100515190238j:image

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

回転角度+位置ずれを検知する場合は、まずRIPOCで回転角度を求めて、

テンプレート画像を回転させて、POCで位置ずれ量を求めます。

【テスト結果】

f:id:suzume_r:20100515190512j:image f:id:suzume_r:20100515190509j:image

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

f:id:suzume_r:20100515190930j:image

結果:(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

 コピペさせていただきました。

suzume_rsuzume_r 2010/05/24 22:32 画像サイズを128x128から256x256にすると
一ケタ精度があがりますね。
スケールもすぐ検出できるようです。

kum_sorkum_sor 2011/08/02 15:00 POCを使用したサブピクセル単位の位置推定方法がよくわからないです。
逆FFTをして得られるPOC関数において、ピーク値を取る(x,y)座標が整数値の位置ずれ量だと思うのですが、そこからどのように上記で挙げられているf(x,y)を用いるのでしょうか。
宜しくお願い致します。

追伸
http://g0307.hp.infoseek.co.jp/POC_vs2008.zip
ここにおいてあるソースはすでにないのでしょうか。

NemoCppNemoCpp 2012/06/20 19:45 Dear. Suzume_r SAN
My name is Nemo, the download link "http://g0307.hp.infoseek.co.jp/POC_vs2008.zip" is invalid.
Could you send "POC_vs2008.zip" to me? My e-mail is "wsforever2008@sina.com".
Thank you very much.
Best wish
Nemo

トラックバック - http://d.hatena.ne.jp/suzume_r/20100515
 |