看了几天的 sift 也算是对它有一了点的了解 这里描述了我对它的理解!
sift 就是为了图像特征比较做的算法.它主要就是为了用数学的方法描述:图像中特定点周围一块区域, 从而可以比较这块区域与另一块区域的差异.
下面是详细一点讲述如何描述这个数学方法:
1. 数据结构: 这个区域在sift中选的是 4*4 也就是16个点或者说区域.然后按8个方向进行直方图统计. 晕了吧!
double feature[4][4][8]; 其实就是它..... (0,0)-(3,3) 区域内 8个不同方向的值累加起来
2. 再说它的特性: 位置、尺度以及方向 的不变性 (这个好专业,更晕)
解释一下: 位置不变,就是说, 你不可能把图像每一点都弄成特征点,所以你要找一个有代表性的点,而这个点,不管用什么图像都要可以提取出来.
(其实可以不用,多提一些,总有一些特征点相同.) 就是说二张图像有重合部分,你提出的二张重合部分的特征点要一样,不然如何比较呢.
尺度不变: 二张图像,拍的桌比,有可能大,有可能小,所以你得把这情况考虑到.做法就是 把图像多复制几份,然后放大缩小,这样就可以了
方向不变: 就是处理对同一个桌子拍照有可能手一抖,相机拿歪了, 这情况. SIFT 的处理就是选方向(直方图,最大的 80%方向,可能有很多所以要把这个点复制几份) ,然后以这个方向做1中所说的特征提取.
还有什么光照不变: 专业讲法就是 用那个什么 DOG金字塔. 讲白点,就是用 图像的梯度图来做....(什么是梯度? 就是 (x1 - x0) + (y1 -y0) )看不懂就看下图像处理基础吧!
3. 这样几个问题就都解决了.如果你想加上什么仿射变性,也无非就是把图像的缩放的2*2缩放矢量,变成 3*3图像变换矢量.
我这里讲的简单,但实际实现还是有很多细节问题要处理的.比如说什么 dog 算子对梯度值敏感,为什么要模糊,之类,只要理解了就比较好处理了.不过不理解为什么用高斯模糊,为了高大上吗? 理解了就比较好编程了, 不再用看 opencv 里面 那高深的源码. 真心头晕!