前回までの検証により、
- 画像をフーリエ変換し、振幅で正規化した後、逆フーリエ変換すると、位相情報を表す画像(位相画像)を得ることができる。
- 2つの画像の位相情報の畳み込み(合成積)を取り、振幅で正規化した後、逆フーリエ変換すると、2つの画像の間のシフト量(X方向, Y方向)を得ることができる。
(これを、「位相限定相関法」という) - 実座標を対数極座標に変換すると、実座標における回転方向の動きを、対数極座標における縦方向の動きとして表すことができる。
ということが分かりました。
これらを組み合わせて、2つの画像の間の回転方向のズレ(画像のロール角)を推定してみることにします。
「回転不変位相限定相関法」(RIPOC; Rotation Invariant Phase Only Correlation Method)です。
回転不変位相限定相関法の処理手順は、以下のようになります。
まずは、原画像(1920×1080)から、評価用の画像を作ります。
青枠のところを切り出し、画像Aとします。さらに、X方向に29.5, Y方向に14.5シフトし、反時計回りに19.0°回転させて赤枠のところで切り出し、画像Bとします。
2つの画像の間のシフト量およびロール角は、リサイズ後の画素に換算すると、
X: 19.796[pixel]Y: 9.730[pixel]θ: 19.0[degree]
となります。
ここで、「比較される側の画像」を画像A、「比較する側の画像」を画像Bとします。
2つの画像を離散フーリエ変換(DFT)すると、それぞれ以下のようになります。
このDFT画像を対数極座標(Log-Polar)に変換すると、それぞれ以下のようになります。
この2つの画像の間のシフト量を、位相限定相関法により得ます。(Pass1)
このシフト量(x, y)を、ロール角(θ)とスケール(ρ)に換算し、「比較する側の画像」を補正します。(画像B3)
さらに、補正した「比較する側の画像」と「比較される側の画像」の間のシフト量を、位相限定相関法により得ます。(Pass2)
このシフト量(x', y')により、「比較する側の画像」をさらに補正します。(画像B4)
いががでしょうか。
実行結果です。
X: 19.9695[pixel]Y: 9.92706[pixel]θ: 18.9985[degree]
怖いくらいピタリと一致しています。その誤差は、以前の検証と同じ、±0.20[pixel]程度です。
(プログラムを書いている自分でも、驚いてしまうくらいです)
Pass2におけるピーク値(最大値:1.0)は、0.926851となっていることから、「かなり似ているよ」といわれています。
#すばらしい!0xF9CF
〔関連情報〕
・【OpenCV】対数極座標画像の生成
・【OpenCV】位相限定相関法による画像マッチング(3)
・【OpenCV】位相限定相関法による画像マッチング(2)
・【OpenCV】位相限定相関法による画像マッチング(1)
・【OpenCV】ステレオカメラからの画像入力(1)
・【OpenCV】位相画像の生成
・【OpenCV】広角レンズの歪み補正
初めまして。お聞きしたいことがあり、以下長文になってしまいますがご容赦ください。
最初に私の開発環境を記載しておきます。
【開発環境】
・C++Builder 5
・OpenCV 1.0
(C++Builder 5での開発の為、OpenCVは1.0です)
画像マッチングの記事を参考にさせて頂き、POCでの位置ズレ取得は、おかげさまでなんとか出来ました。(ピーク位置は cvMinMaxLoc で整数で取得しました)
しかし、RIPOC のロール角取得が出来ず困っております。
スペクトル画像、位相画像、Log-Polar変換画像 はファイル保存して確認もしましたので、出来ていると思います。
Log-Polar変換はOpenCV標準関数の cvLogPolar を使用しました。
(サイズ 256×256 スケールパラメータ 40)
しかし、色々テストしても、0 度(2枚のLog-Polar変換画像の位置ズレなし)になってしまいます。
大変申し訳ありませんが、本記事の「手順1」のロール角推定までのプログラムを教えていただけないでしょうか?
何日もここで詰まってしまっており、お力を貸していただけると助かります。よろしくお願いいたします。
以上、長文失礼いたしました。
Tomaさん、こんばんは。
お問い合わせありがとうございます。お困りのようですので、取り急ぎ返信差し上げます。
コメント欄ではなんですので、いただいたメールアドレスに、OpenCVのソースをお送りいたします。
こんにちわ
ホームページとても参考にさせていただいております。
上記コメント者様同様、私も回転0度になってしまい
悩んでいます。
fftを実行後、Log-Polar変換画像も同様に確認しましたので
できているかと思います。
大変恐縮ですが、当方にもご教授いただけると幸いです。
何卒よろしくお願いいたします。
inusanさん、おはようございます。
お急ぎのようですので、いただいたメールアドレスに、OpenCVのソースをお送りいたします。
初めまして
いつもホームページを参考にさせていただいております。
過去の位相限定相関法の記事を参考に今回のプログラムを再現しております。
しかしながらロール角とスケールの換算を上手く再現することができません。
恐縮ですが、それらについてより詳細にご教授いただくことは叶いませんでしょうか。
何卒よろしくお願いいたします。
まぁ、なんですな。「自分の常識は世界の非常識」ということもあり得る訳ですが、
一般的には、教えを請うておいて、デバッグまでしてもらって、所定の結果が出たら、御礼のコメントぐらい入れてもいいと思いますが、
“世界にたった一つだけ”として、大事にダイジに育てられてきた今時の若いヒトたちには、どうやらそういうことすら通用しないようですな。0xF9D1
管理人としては、つぎの質問者へ回答する気すら失せますが、まぁ、自分だけ橋を渡れればいいんでしょうな、わかります。
そういうヒトは、チームの中では、絶対に上手くやっていけません。なので、少なくとも、うちには要りません。仮に、万一入れたとしても、すぐに孤立するでしょう。
#それから、皆さんよく間違えますけど、「ご教授」じゃなくて、「ご教示」ね。(誤用が多数を占めると、いつの間にか偽が真になることもあるけれども)
joeさん、はじめまして。
いただいたメールアドレスに、OpenCVのソースをお送りいたします。
管理人さま
ご丁寧にプログラムを送っていただきありがとうございました。
回転角、スケールの表示も問題なく実行できました。
ただ画像によって意図しないシフト量や回転角度、出力画像が表示されることがあるので、その点においては改善していきたいと考えております。
はじめまして。
管理人様のRIPOCに関する投稿を参考にさせて頂きながらコードを書いております。
しかしながら、何度コードを書き直しても回転ずれをうまく導出することができません。
そこで、身勝手なお願いとは承知の上ですが、どうかRIPOCのコードをご教示いただけませんでしょうか。
どうぞよろしくお願い申し上げます。
はじめまして。
管理人様のRIPOCの説明を参考にコードを組んでいるのですが、
どうしても上手く回転ずれを導出することができません。
恐縮ですが、手法の詳細についてもう少しご教授いただくことは
できませんでしょうか?
身勝手なお願いで大変申し訳ありませんが、よろしくお願いいたします。
はじめまして、管理人様
Ryoと申します。
回転不変位相限定相関法について、勉強しており
管理人様の手順を元にアルゴリズムを書いています。
しかし、シフト量計算の推定が上手くいきません。
色々試してみましたが、前へ進めず困っています。
もし可能でしたらソースコードを頂けませんでしょうか?
参考にさせて頂きたいです。
よろしくお願いいたします。
お世話になります。
参考にして勉強させて頂いております。
可能でした実装コードを頂けないでしょうか。
不躾なお願いで申し訳ありませんが宜しくお願い致します。
管理人様
お世話になります。
こちらの不躾なお願いに対応頂きまして感謝しております。
私自身でも実装を進めており、なんとか動作している様なところまでは行きましたが、LOP画像のPOC後にθを得ますが、Y軸範囲を360度換算で計算するとズレが生じてしまっています。
処理は動画像で背景固定でワーク(ペンなど)を回転させてθ補正を掛けていますが、背景固定の影響なのかなとも思っています。
頂いたソースを参考に検討して、改めてご連絡させて頂きたいと思います。
まずはお礼まで。
お世話になります。
HPの説明を参考にして、回転不変位相限定相関法の勉強を
させて頂いております。
POCから求めたシフト量からロール角とスケールへの変換がわからず苦戦しております。
可能でした実装コードを頂けないでしょうか。
ご迷惑をおかけして申し訳ありませんが宜しくお願い致します。