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