SIFT算法中,在DoG空间找到极值点后,需要对极值点进行修正,本文主要详细的讲解一下为什么需要修正,以及如何对极值点进行修正。
下图演示了二维函数离散空间得到的极值点与连续空间的极值点之间的差别
利用已知的离散空间点插值得到连续空间极值点的方法叫做子像元插值。
首先来看一个一维函数插值的例子(如图):
这个图中,我们清晰的看到,离散空间的极值点和连续空间的极值点并不是同一个点
我们对函数f(x)使用泰勒级数,将其展开为:
注:此处说一下离散空间的一阶导和二阶导的求法:
然后对f(x)求导,可以求得连续函数f(x)真正的极大值和极大值的坐标:
对于二维函数,其泰勒展开为:
若将表示成向量,其向量形式为:
注意,此处的两个导数,都是原函数在x=[0,0]'这个点的一阶导和二阶导的值
对上式求导,以便求取极值点,求导结果如下(此处不会求导的,可以查一查矩阵求导这块的知识):
此处一阶导、二阶导和前面一样,可以求得真正的极值点为:
极值点的极值为:
此处的D即是在0点的函数值。
若在任何方向上的偏移大于0.5时,意味着插值中心点已经偏移到它的临近点上,所以这样的点需要删除。另外,当(图像的灰度值在0~1之间),其响应值过小,这样的点易受噪声的干扰而变得不稳定,所以也要被删除。