前々回では、画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出し、逆フーリエ変換することにより、位相画像(輪郭画像のようなもの)を生成しました。
2つの画像があり、この2つの画像の間が「どれぐらいずれているか」(画像のシフト量)を推定しようとする際、この位相画像を用いて推定する方法があります。
「位相限定相関法」(POC; Phase Only Correlation Method)です。
その名のとおり、2つの画像の位相に注目して相関を取り、2つの画像の間の「類似度」を測る方法です。
位相限定相関法の概念については、以下のサイトに分かりやすくまとめられています。
位相限定相関法の処理手順は、以下のようになります。
2つの画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出します。抽出された2つの位相情報から、その畳み込み(合成積)を取り、振幅で正規化します。これを逆フーリエ変換することにより、位相限定相関画像を得ます。
画像Aをfa、画像Bをfbとすると、それぞれの画像の離散フーリエ変換(Discrete Fourier Transform)は、以下の式で表されます。
得られた空間周波数スペクトル(複素平面)同士の畳み込み(合成積)を取り、その振幅の絶対値で除することにより正規化します。
(掛け合わせるもう片方の複素平面は、複素共役とします)
この合成積の複素平面を逆離散フーリエ変換することにより、位相限定相関画像rabを得ます。
この位相限定相関画像におけるピークを示す位置が、そのまま2つの画像のシフト量を表しています。
さっそく、OpenCVで位相限定相関法を試すことにしますが、その前に、評価用の画像として、以下の2つの画像を用意しました。
評価用の画像の原画像(1920×1080)です。
評価用の画像Aです。原画像の青枠のところを切り出し(763×763)し、512×512にリサイズしたものです。
評価用の画像Bです。上記同様、原画像の赤枠のところを切り出し、リサイズしたものです。
両画像の間のシフト量は、原画像上ではX:59,Y:29ですが、リサイズ後の画素に換算すると、
X: 39.5910[pixel]Y: 19.4600[pixel]
となります。
(シフト量は、原画像では2つのの素数を取り、リサイズした際に(後ほどの検証のことを考えて)サブピクセル値になるようにしました)
位相限定相関法により、画像Aと画像Bとの間のシフト量を推定した結果の画像です。
(青色の縦横軸は、後から入れています)
画像の中で、1ヶ所だけ、高いピークを示している画素があります。
(グレースケールに正規化しているため、輝度値は255)
この画素の位置は、
X: 40[pixel]Y: 19[pixel]
となっており、正確にシフト量を推定できています。
#すばらしい!0xF9CB
ということで、プログラムです。(PhaseOnlyCorrelation.c)
〔関連情報〕
・【OpenCV】ステレオカメラからの画像入力(1)
・【OpenCV】位相画像の生成
・【OpenCV】広角レンズの歪み補正
Post Comment