2015年10月30日

位相限定相関法(POC)のテスト

以前ちょっと試してそのまま放置していたので何となく整理しました。参考サイトもたくさんありますし、OpenCVでも実装されているようです[1]〜[4]。

2枚の画像のマッチングを行うときに、フーリエ変換して位相情報のみの相関をとって逆変換すると、平行移動量の所にピークが出るみたいです。

で、ピークの様子を確認するのにgnuplot等で表示すればいいのだと思いますが、画像サイズと等しいXY平面ポリゴンを作成して、値を高さZにするディスプレイスメントマッピングみたいなものを作ってみました。

POC_002.png

POC_003.png

上記の計算をしてPLYで出力するサンプルプログラムです。法線計算とか除いています。今回は表示をMeshLab上でやっていますが、法線計算もMeshLabでやればいいかと思います。
plytest.cpp

実行結果
poc_001.png

ついでにLenna画像で試してみました。高さはグレースケール化した時の輝度値です。

POC_006.png
横から見た結果
POC_008.png POC_007.png
       光源なし              光源あり

後は高さマップや法線マップを読み込んでポリゴンで出力するバージョンも作ってみました。画像から読み込んで出力する値を変更しただけですが。
POC_005.png
[5]の画像を使用させていただいております。

話が逸れましたが、まずは平行移動させた画像です。同一画像の場合、ピークが画像の中心に来ますので、平行移動量は画像の中心からどれだけずれているか、になるのではないかと思います。

POC_010.png POC_011.png
原画像

POC_004.png
ピーク画像

結果としては完全に一致していたと思います。ペイントで適当に移動させただけですので、サブピクセル単位のずれはありません。

次に、回転角の計算です。こちらはRIPOCというもので、2枚の画像をフーリエ変換して得られたスペクトル画像をLogPolar変換した画像からPOCで平行移動量を求める、という方法のようです。おそらく。

POC_010.png POC_012.png
原画像

POC_013.png
LogPolar変換した2枚の画像
(平坦な部分に見える線が横(画面奥方向)に平行移動している。今回は横方向がθ)

POC_009.png
ピーク画像

LogPolar変換で、今回は横軸にθ(-PI〜PI)をとっていますので、画像の幅が512ピクセルであれば、512ピクセルで2PIラジアンのずれ、ということになります。端の方が大きい値をとっていますので、変換バグがあるかもしれません。

計算した結果、横方向に48ピクセルずれたところにピークがありましたので、2PI*48/512ラジアン≒33.75度となりました。確かGIMPで33.4度回転させた気がしますので、大体あってそうです。もっと精度がほしい場合はピーク位置をsinc関数か何かで出す必要があるみたいです。

[1] http://d.hatena.ne.jp/suzume_r/20100515
[2] http://authorunknown408.blog.fc2.com/blog-category-1.html#39
[3] http://www.soaristo.jpn.org/blog/archives/2015/02/150214.php
[4] http://cvl-robot.hateblo.jp/entry/2014/02/06/171541
[5] http://www.bencloward.com/shaders_offset.shtml
posted by シンドラー at 18:28 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック