1D 位相相関アルゴリズムのテストに成功し、2つの合成画像間の垂直シフトを特定しました。
しかし、実際の画像に移動すると、変換をまったく検出できません(ピークが0にあり、これは間違った結果です)。
次の画像があります。
そして、結果の位相相関(マグニチュード、リアル、イマジナリー):
画像の最初のスキャンラインは完全に白ですが、シフトは明らかに大きくなります(20ピクセル)。
予想される結果は、20行目の白い線で、合成画像または光ノイズでのみ発生します。
私のアルゴリズムは非常に単純です-各画像列について:
- ソースおよびターゲット画像列の1D FTを計算します(
a=FT(A)
、b=FT(B)
) - クロスパワースペクトルの計算(
cross_power = a *. conj(b) / |a *. conj(b)|
)-*.
点ごとの乗算をconj(x)
示し、複素共役を示します - 位相相関の計算(
phase = IFT(cross_power)
) - のすべての列で最大等級を見つけます
phase
。 - コンセンサスピークの場所を見つける(たとえば、検出されたピークの場所の中央値)
実世界の(ノイズの多い)画像を処理するためにベースライン位相相関アルゴリズムを改善する方法を教えてください。
FFTベースの位相相関ではなく、NCC(正規化相互相関)を使用する必要がありますか?
更新
私はゼロパディングを試し、循環シフト(画像の単純な線形シフトのみが望ましい)によって引き起こされるエラーを除外し、Wikipediaの元の画像でこれをテストしました。
単一のピークが存在するはずなので、明らかにそこにあります。
ただし、ノイズを減らして実際に結果を改善するためにわずかなスムージング(ガウスぼかし)を実行すると、位相相関が完全に損なわれます。
これが拡張バージョンです-元のピークは弱く(なぜ??)、ゼロシフトの周りに新しいピークが現れました(なぜ??):