前回の位相画像を用いた相関方法をやります。


参考サイトはこちら

計算の仕方は位相画像のように行いますが、
相関を計算する際に画像Gの方を複素共役とります。


fを画像その1、gを画像その2としてます。
Tex2Img_1345873619.png

Tex2Img_1346229170.png

POC

そして、Rを逆フーリエ変換すれば求められます。
他の相関方法よりもするどいピークが出るようです。



【ソース】

今回も、楽だったのでOctaveで書いてます(;´∀`)


function [py px maxval CPOC] = POC(A, At)
	B=fft2(A);
	Bt=conj(fft2(At));

	FFTR = B.*Bt;
	FFTRN = (FFTR./abs(FFTR));

	CPOC = real(ifft2(FFTRN));
	[py,px maxval] = max2d(CPOC);
	py = py - 1;
	px = px - 1;
	%printf("move (%d,%d)\n", px-1, py-1);
ちなみに、max2dは自前の関数です。
以下のように最大値とどの場所にあるかを示すようなっています。


function [py,px maxintensity] = max2d(data)
% search max value and (x,y) in 2D matrix
	[mm,x] = max(data);
	[mx,y] = max(mm);

	maxintensity = mx;
	py = x(y);
	px = y;



【テスト結果】

画像はnashruddin.com - Phase Correlation in OpenCVさんから拝借したもので、行いました。


結果は以下のようになるようです。

相関値:0.6344
移動距離:(6,15)


【入力画像】
1.jpg 2.jpg



【位相限定相関のグラフ】
graph.png

上の、位相限定相関のグラフのピークの場所の値と座標を取得します。
私が計算した結果は、

相関値:0.62530
移動距離:(6,15)

となり相関値が若干違いましたが、正解でした。
ノイズにも強い手法らしいので。便利そうです。

以前ブロックマッチングなどのアルゴリズムを調べているときに、
位相限定相関法(Phase Only Correlation)なる方法を見つけました。
その中でまずはこちらのサイトにある位相画像というものの実装を
位相画像 « Rest Term

アルゴリズム

  1. 画像fに対してフーリエ変換を適用して


    Tex2Img_1345873619.png


  2. それを絶対値で割る(とりあえずRとしました)


    Tex2Img_1345911493.png


  3. 逆フーリエ変換を行い実数領域に戻す



・・・よく考えたら、この場合は絶対値で割るということは正規化を行っているので、
振幅成分が1になり、位相の成分のみが残っているということなのですね(;´∀`)

個人的に画像と複素数の扱いが一番楽だなと思っているOctaveで実装を行いました(;´∀`)

f = imread("Lenna.bmp");
f = rgb2gray(f);

F = fft2(f);
R = (F./abs((F)));
POC = real(ifft2(R));


【元画像】

Lenna




【位相画像】

位相画像


境界部分だけが残る感じなのですかね。


そして、これを利用して位相限定相関法(Phase Only Correlation)を行うのですが、
それはまた次回へ。。。

FC2カウンター
プロフィール

詠み人知らず

Author:詠み人知らず
プログラム好きな名もなき凡人がお送りしています。(得意とは言っていない
最近の興味はPython、C#、Matlab(Octave)、画像処理、AR(拡張現実)、統計などなど・・・

気分で思いついたことを書くため話題に一貫性がないかもしれません。

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
最新記事
タグクラウドとサーチ

カテゴリ
最新コメント
最新トラックバック
月別アーカイブ