SOARISTO工房 Logo
Electronics Archive

 前回までの検証で、位相限定相関法により、2つの画像の上下方向(ティルト)と左右方向(パン)のズレを推定するとともに、風呂の中で思い付いた方法により、回転方向(ロール)のズレを推定し、補正してみました。

 しかし、よくよく考えてみると(よくよく考えなくても)、画像A画像Bは、まったく同じ画像を合成していることが分かりました。

#画像Bは、より実際の画像に近づいたように見えましたが、画像Aの左と右の画像をそれぞれ同じ角度だけ回転させ、位相限定相関法により合成しているため、2つの画像の間の回転方向のズレは補正されていません。

 では、2つの画像があり、この2つの画像の間の回転方向のズレ(画像のロール角)を推定するには、どのようにすれば良いでしょうか。

 すぐに思い付くのは、2つの画像を少しずつ回転させ、位相限定相関法により、2つの画像の間の相関係数が最も高くなる角度を拾う方法があります。

 しかし、この方法では、分解能を1°とすると、180回も計算しなければならず、とても実時間には間に合いません。仮に二分法が上手くいくとしても、9回も計算しなければなりません。

 なにか上手い方法がないかと探していたところ、「対数極座標変換」(Log-Polar Transform)という方法があることが分かりました。

 これは、霊長類の視覚の「中心視」をモデル化したものです。(なぜに「中心視」なのかは、後ほど)

 対数極座標変換は、以下のような式で表されます。

Log-Polar Transform Formula

 変換後の画像は、変換前の画像のどの画素に対応するかを計算することから、上記の式を逆変換すると、以下のようになります。

Log-Polar Transform Formula

 さっそく、評価用の画像を対数極座標変換してみます。

OpenCV, Log-Polar Transform, Porsche 911 Carrera S, Original

 原画像(512×512)。

OpenCV, Log-Polar Transform, Porsche 911 Carrera S, Result

 変換後の画像。

 縦方向にグニャ~っとなっていますが、原画像がなんとなく推測できそうなところと、まったく推測できないところがあります。

 前回までの検証で、位相限定相関法により、2つの画像の上下(ティルト)と左右(パン)のズレを補正できることが分かりました。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S, Result

 前回の結果です。

 左右2つの画像のシフト量は、

   X: -192.355[pixel]
   Y: 46.7339[pixel]

でした。

 カメラ(αNEX-5R)を三脚の雲台に固定し、そのまま左右にパンしたはずなのですが、なぜこれだけ上下にズレてしまったのか、このズレを補正するにはどうすれば良いか、さまざまに考えを巡らせていたところ、風呂に浸かっている時に、ハタと気づきました。0xF9A0

 この上下のズレは、「カメラのロール(左右の回転)によるものではないか」と。

 カメラを雲台に載せて左右にパンしたので、「ロールによるズレはないはずだ」というのは、単なる思い込みでした。

 思い起こせば、確かに、雲台に水準器は付いていましたが、公道のド真ん中で、歩行者信号が青の時に、横断歩道の上から急いで撮ったので、水準器を合わせているヒマはありませんでした。

 ゆえに、水平が出ていないまま(カメラがロールしたまま)左右にパンしたため、上記のような上下のズレが生じてしまったようです。

 さて、この上下のズレを生じさせたカメラのロール角ですが、どのようにすれば求められるでしょうか。

 原画像の大きさは1920×1080で、上下のズレは、上記のとおり、Y方向に46.7339[pixel]なので、回転軸を画像の中心(960, 540)とすると、ロール角は、

   tan-1(46.7339/960) = 2.787°

と求められます。

 試しに、左右それぞれの画像を2.787°回転させ、改めて位相限定相関法によりシフト量を推定し、2つの画像を合成すると、以下のようになります。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S, Result
(クリックで拡大)

 これまで、位相画像の生成や、位相限定相関法(POC; Phase Only Correlation Method)の実装などを、シコシコとやってきた訳ですが・・・。

 なんとっ! OpenCVの関数として、位相限定相関法が提供されていることが分かりました。

#もっと早く気づけば良かった。0xF9D3
 (まぁ、原理が分かっただけでも良しとしましょう)

 位相限定相関法の関数(phaseCorrelate())を含むソースファイルは、以下のフォルダに格納されています。

   \opencv-2.4.10\sources\modules\imgproc\src\phasecorr.cpp

 関数phaseCorrelate()自体の解説は、こちら。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S

 評価用の画像の原画像(1920×1080)です。

 前回同様、青枠から赤枠へのシフト量を推定します。

 プログラムです。(PhaseOnlyCorrelation.cpp)

 関数phaseCorrelate()は、2つのグレースケール画像と、窓関数の配列を与えると、X方向およびY方向の「シフト量」と、5×5のマトリクスの重心における「ピーク値」を返します。
(ピーク値はオプション)

 窓関数は、サンプルに準じて、ハニング窓(hanning window)を使っています。

 前々回では、画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出し、逆フーリエ変換することにより、位相画像(輪郭画像のようなもの)を生成しました。

 2つの画像があり、この2つの画像の間が「どれぐらいずれているか」(画像のシフト量)を推定しようとする際、この位相画像を用いて推定する方法があります。

 「位相限定相関法」(POC; Phase Only Correlation Method)です。

 その名のとおり、2つの画像の位相に注目して相関を取り、2つの画像の間の「類似度」を測る方法です。

 位相限定相関法の概念については、以下のサイトに分かりやすくまとめられています。

 位相限定相関法の処理手順は、以下のようになります。

OpenCV, Phase Only Correlation

 2つの画像をフーリエ変換し、その周波数スペクトルから位相情報を抽出します。抽出された2つの位相情報から、その畳み込み(合成積)を取り、振幅で正規化します。これを逆フーリエ変換することにより、位相限定相関画像を得ます。

 画像Aをfa、画像Bをfbとすると、それぞれの画像の離散フーリエ変換(Discrete Fourier Transform)は、以下の式で表されます。

Phase Only Correlation Formula

 得られた空間周波数スペクトル(複素平面)同士の畳み込み(合成積)を取り、その振幅の絶対値で除することにより正規化します。
(掛け合わせるもう片方の複素平面は、複素共役とします)

Phase Only Correlation Formula

 この合成積の複素平面を逆離散フーリエ変換することにより、位相限定相関画像rabを得ます。

Phase Only Correlation Formula

 この位相限定相関画像におけるピークを示す位置が、そのまま2つの画像のシフト量を表しています。

 さっそく、OpenCVで位相限定相関法を試すことにしますが、その前に、評価用の画像として、以下の2つの画像を用意しました。

OpenCV, Phase Only Correlation, Porsche 911 Carrera S

 評価用の画像の原画像(1920×1080)です。

 ソフトの開発に平行して、ハードの準備です。

Buffalo Web Camera BSW20KM11BK, Stereo Image Processing, OpenCV

 BuffaloのWebカメラ、「BSW20KM11BK」です。(定価:7,236円、購入価格:3,015円×2台)

#「会議に最適」とありますが、もちろん会議には使いません。0xF9C7

 2012年7月の発売で、有効画素数は200万画素。いまとなってはスマホより劣りますが、特徴はなんといってもその画角。水平画角が120°もあります。

 これだけの画角があれば、2台を連接させることにより、人間の視野角(約180°~200°)を優に超えるワイドビュー(広角映像)を得ることができます。0xF8F2

Buffalo Web Camera BSW20KM11BK, Stereo Image Processing, OpenCV

 ということで、試しにモニタ上にセットし、さっそく映像をチェック。
(少し外向きにセット)

 んが、しかし・・・。0xF9FC

 レンズも、安っしーWebカメラに使われているプラスチックレンズではなく、ガラスレンズが使われているので、ひそかに期待していたのですが、惨憺たる結果に。

 ガラスレンズは良かったのですが、フォーカスがマニュアルのため、注視する対象物に合わせていちいち調整しなければならず(レンズの外周部分を持って左右に回す)、結果として“アマアマ”な画質になってしまいます。

 仕方がないので、ちゃんとしたWebカメラを買うことにしました。

#まさに、「安物買いの銭失い」とは、このことぞ。0xF9D3