我已经成功测试了一维相位相关算法来确定两个合成图像之间的垂直偏移。
然而,当我移动到真实图像时,它根本无法检测到平移(峰值位于 0,这是错误的结果)。
我有以下图片:
以及由此产生的相位相关性(幅度、实数、虚数):
图像的第一条扫描线完全是白色的,但偏移明显更大(20 像素)。
预期结果是第 20 行的白线,仅在合成图像或光噪声上出现。
我的算法非常简单 - 对于每个图像列:
- 计算源和目标图像列 (
a=FT(A)
,b=FT(B)
)的 1D FT - 计算互功率谱 (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
表示逐点乘法,conj(x)
表示复共轭 - 计算相位相关 (
phase = IFT(cross_power)
) - 在 的每一列中找到最大幅度
phase
。 - 找到一致的峰值位置(例如检测到的峰值位置的中值)
你能告诉我如何改进基线相位相关算法来处理真实世界(嘈杂)的图像吗?
我应该使用 NCC(归一化互相关)而不是基于 FFT 的相位相关吗?
更新
我正在尝试使用零填充来排除循环移位引入的错误(只需要简单的图像线性移位),并在来自维基百科的原始图像上进行了测试:
单峰显然在那里,因为它应该是:
但是 - 如果我执行轻微的平滑(高斯模糊)以减少噪声并实际改善结果,则相位相关会完全受损:
这是增强版 - 原始峰值较弱(为什么??)并且在零偏移附近出现了新峰值(为什么??):