我正在使用 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 窗口)以减少边缘效应,或者应将图像补零以忽略边缘效应。如果图像由平坦的背景组成,所有细节都远离边缘,那么线性移位将等同于圆形移位,并且上述推导将完全成立。可以通过使用边缘或矢量相关来锐化峰值。
对于周期性图像(例如棋盘),相位相关可能会产生模棱两可的结果,结果输出中有多个峰值。
但是如果出现问题,我不确定如何调试这种情况。
这里建议不要模糊图像。
在图像配准任务中应用相位相关还有哪些其他实用建议?