如何定位关键点是一个大问题,lowe【2004】这部分有点看不懂。sample point
到底是一个什么样的概念?lowe【2004】的figure 2中是对3层26邻域计算极值点
。
lowe【1999】,第一步是获得同层8邻域极值(extrema),然后计算下一层
closest pixel 的location,这里为什么还要计算,而不是直接取同层的
location呢,下一层的location和本层的位置有偏差?并且它还要“taking
account of the 1.5 times resampling. ”或者是受1.5倍采样的影响。具体没
说怎么做。
lowe【2004】,则给出了一个泰勒展开式。
还是来看下代码吧
c#的代码中是直接比较26领域获得极值点的,在搜寻极值前,比较当前点的值
是否小于dogthresh,如果小于的话,则抛弃这个点。搜寻极值后,则做过滤和定
位极值点(FilterAndLocalizePeaks函数)的操作。最后根据极值点生成
keyPoint。
从FilterAndLocalizePeaks函数看,
1.过滤极值点先做是否是边缘点检测IsTooEdgelike,这里有个参数
edgeRatio 等下说明,是否是边缘点用到hessian矩阵,下面补充点hessian矩阵
的知识,注意翻译成中文用黑塞矩阵,你可以wiki到,忘记的同学去看下。回到
low【2004】,page13,去除边缘点的原因是边缘点对噪声敏感 ,由于DOG函数的
边缘点在“across edge”方向有较大的主曲率,对应的垂线方向则有较小的主曲
率,而主曲率可以用hessian矩阵计算,事实上我们只需要用到edgeRatio,详见
lowe[2004]。
2.然后是LocalizeIsWeak函数,这部分的内容在lowe【2004】,page10说明
。不过看的不是很懂,感觉这部分是最难懂的了。这部分内容在brown and lowe
[2002]中有详细说明。D的泰勒展开是尺度空间的近似。求得极值点的亚像素精度
位置,有利于提高匹配度和稳定性。不过这里的一阶偏导为什么加个转置符号T呢。
头大了,先看看后面的部分再说。