在图像配准任务中应用相位相关的实用建议

信息处理 傅里叶变换 opencv 阶段 相关性 图像配准
2022-01-30 15:31:00

我正在使用 OpenCV 来检测 2 个图像之间的偏移,这里是示例代码(基于cv::phaseCorrelate函数):

cv::Mat ShiftTransform(const cv::Mat &source, const cv::Mat &target, bool bUseHanningWindow)
{
    CV_Assert(source.type() == CV_32FC1);
    CV_Assert(target.type() == CV_32FC1);

    Point2d shift;
    if(bUseHanningWindow)
    {
       Mat hann;
       createHanningWindow(hann, source.size(), CV_32F);
       shift= phaseCorrelate(source, target, hann);
    }
    else
    {
        shift= phaseCorrelate(source, target);
    }

    cout << "Detected shift: " << shift << endl;

    Mat H = (Mat_<float>(2, 3) << 1.0, 0.0, shift.x, 0.0, 1.0, shift.y);

    Mat res;
    warpAffine(source, res, H, target.size());

    CV_Assert(res.size() == target.size());
    CV_Assert(res.type() == CV_32FC1);

    return res;
}

例如来自维基百科的图像似乎有效。

来源

在此处输入图像描述

目标

在此处输入图像描述

结果

在此处输入图像描述

反应图

在此处输入图像描述

但是对于一些现实生活中的图像,它给出了错误的转变,可能是因为维基百科中描述的这个问题:

更有可能是 的简单线性移位 ,而不是上述解释所要求的循环移位。在这种情况下, 将不是一个简单的 delta 函数,这会降低方法的性能。在这种情况下,应在傅里叶变换期间使用窗口函数(例如高斯或 Tukey 窗口)以减少边缘效应,或者应将图像补零以忽略边缘效应。如果图像由平坦的背景组成,所有细节都远离边缘,那么线性移位将等同于圆形移位,并且上述推导将完全成立。可以通过使用边缘或矢量相关来锐化峰值。gbgar

对于周期性图像(例如棋盘),相位相关可能会产生模棱两可的结果,结果输出中有多个峰值。

但是如果出现问题,我不确定如何调试这种情况。

这里建议不要模糊图像。

在图像配准任务中应用相位相关还有哪些其他实用建议?

2个回答

圆形度的影响可以通过用零填充的更大边框来减少(直到图像的宽度)。但是该方法本身并不完美,它仅适用于图像的循环移位。否则该方法可能会失败,主要是当图像的一部分非常亮(像素值很高)时。图像的其余部分应具有尽可能均匀的光强度分布。

对于模糊图像,我的意思是两个图像的模糊内核不同,PC 算法也可以扩展来处理这种情况。请参阅:

  1. PEDONE M, FLUSSER J, HEIKKILA J. N 重对称模糊的模糊不变平移图像配准。[J]. IEEE 图像处理交易,2013, 22(9): 3676–89。

  2. OJANSIVU V, HEIKKILÄ J.使用模糊不变相位相关的图像配准[J]. IEEE 信号处理快报,2007 年,14(7):449–452。