不多说,直接上干货!

  PCA-SIFT算法在描述子构建上作了创新,主要是 将统计学中的主成分分析(PCA)应用于对描述子向量的降维,以提高匹配效率 。

  PCA 的原理是:一般有效信号的方差大,噪声的方差小;通过PCA可以降维滤除噪声,保留信号。

1、算法分析 
  PCA-SIFT与标准SIFT有相同的亚像素位置(sub-pixel),尺度(scale)和主方向(dominant orientations),但在第4步计算描述子的时候,它用特征点周围的41×41的像斑计算它的主元,并用PCA-SIFT将原来的2×39×39维的向量降成20维,以达到更精确的表示方式。

  算法步骤如下: 
  (1)构建描述子的区域选定为以特征点为中心的41X41矩形(已与特征点主方向对齐); 
  (2)计算39x9矩形内每个像素对水平、垂直两个方向的偏导数(最外层像素不计算偏导数)。得到一个39x39x2=3042维的向量,对其归一化; 
  (3)假设有N个特征点,那么所有特征点描述子向量构成一个Nx3042的矩阵。对这N个向量计算NxN协方差矩阵; 
  (4)计算协方差矩阵的前k个最大特征值所对应的特征向量,这k个向量组成一个3042xk的投影矩阵; 
  (5)将Nx3042的描述子矩阵与3042xk的投影矩阵相乘,得到Nxk的矩阵,即降维描述子向量组成的矩阵。此时N个特征点的描述子向量均为k维。文中作者经过实验,取k=36。 
  算法步骤还有另一种描述,见这里。 
  该算法的创新之处 在于降低描述子维度的同时滤除了部分描述子向量中的干扰信息,有较好的鲁棒性 。同时该算法为后人研究描述子打开了一个方向,例如GLOH算法在描述特征点时也是用PCA将16*17维的向量降为40维,但GLOH算法构建描述子的方法不同,它是基于对数极坐标来构建的。

2、比较 
  (1)结果比较:PCA-SIFT所得的描述子在旋转、尺度变换,透视变换,添加噪声匹配的情形下,匹配均大幅领先于SIFT;在亮度变换时,与传统SIFT不相上下。在匹配时所得的正确点对也多于传统SIFT。可见PCA-SIFT生成的描述子质量很高。SIFT和PCA-SIFT的比较 。在运行时间方面,PCA-SIFT在特征点提取、描述子计算中略快于SIFT;但在后续的描述子匹配过程中,PCA-SIFT的速度大大超过SIFT的速度。 
  (2)优缺点比较: 
    △ SIFT: 
      维数:128 
      缺点:维数高、不完全的仿射不变 
      优点:需要较少的经验主义知识,易于开发 
    △ PCA-SIFT: 
      维数:可变,推荐20或者更少 
      缺点:不完全的仿射不变;投影矩阵需要一系列有代表性的图像;这个矩阵只对这类图像起作用 
      优点:保留不变性的同时低维,大大减少了计算时间。

参考资料: 
【特征匹配】PCA-SIFT原理及源码解析
PCA-SIFT特征分析(提升篇)PCA-SIFT 
PCA-SIFT:一个更鲜明地局部图像描述符特征提取方法 SIFT,PCA-SIFT,GLOH,SURF 
SURF PCA-SIFT and SIFT 开源代码 总结
谈谈SIFT、PCA-SIFT、SURF及我的一点思考
SIFT算法详解

机器学习笔记之PCA-SIFT总结的更多相关文章

  1. [机器学习笔记]主成分分析PCA简介及其python实现

    主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量. PCA的本质就是找一些投影 ...

  2. Python机器学习笔记:sklearn库的学习

    网上有很多关于sklearn的学习教程,大部分都是简单的讲清楚某一方面,其实最好的教程就是官方文档. 官方文档地址:https://scikit-learn.org/stable/ (可是官方文档非常 ...

  3. Python机器学习笔记:不得不了解的机器学习面试知识点(1)

    机器学习岗位的面试中通常会对一些常见的机器学习算法和思想进行提问,在平时的学习过程中可能对算法的理论,注意点,区别会有一定的认识,但是这些知识可能不系统,在回答的时候未必能在短时间内答出自己的认识,因 ...

  4. Python机器学习笔记 集成学习总结

    集成学习(Ensemble  learning)是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合,从而获得比单个学习器显著优越的泛化性能.它不是一种单独的机器学习算法啊,而更像是一种优 ...

  5. python机器学习笔记:EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...

  6. Python机器学习笔记:奇异值分解(SVD)算法

    完整代码及其数据,请移步小编的GitHub 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/MachineLearningNote 奇异值分解(Singu ...

  7. 机器学习笔记:Gradient Descent

    机器学习笔记:Gradient Descent http://www.cnblogs.com/uchihaitachi/archive/2012/08/16/2642720.html

  8. 机器学习笔记5-Tensorflow高级API之tf.estimator

    前言 本文接着上一篇继续来聊Tensorflow的接口,上一篇中用较低层的接口实现了线性模型,本篇中将用更高级的API--tf.estimator来改写线性模型. 还记得之前的文章<机器学习笔记 ...

  9. Python机器学习笔记:使用Keras进行回归预测

    Keras是一个深度学习库,包含高效的数字库Theano和TensorFlow.是一个高度模块化的神经网络库,支持CPU和GPU. 本文学习的目的是学习如何加载CSV文件并使其可供Keras使用,如何 ...

  10. 机器学习笔记(4):多类逻辑回归-使用gluton

    接上一篇机器学习笔记(3):多类逻辑回归继续,这次改用gluton来实现关键处理,原文见这里 ,代码如下: import matplotlib.pyplot as plt import mxnet a ...

随机推荐

  1. ios之UITableView

    今天要分享的是IOS开发中一个使用率非常高的一个控件-------UITableView,这两天正在使用tableview做信息的显示,在写代码时对tableview和tableviewcell的几种 ...

  2. 模拟--P1328 生活大爆炸版石头剪刀布 题解

    P1328 生活大爆炸版石头剪刀布 这也是打表么?? #include <iostream> using namespace std; static const auto y = []() ...

  3. hdu5126 stars

    题目描述 题解: 和二维的比起来差不多. 但是这是四维偏序. 所以搞一下CDQ套CDQ. CDQ是维度a已经有序,按维度b排序,然后将维度c存入一维数据结构. 所以我们在第一层CDQ中分治处理,将合法 ...

  4. Python_编程题集_003_递归算法解析

    3.递归算法: 3)传入一个Json串,返回一个字典,字典只取出Json最底层的数据, 中间如果有字符串也要进行处理,请以下面的数据为例,请用递归方法实现 Json:{"a":&q ...

  5. 构造MaxTree

    链接:https://www.nowcoder.com/questionTerminal/a502c7c3c65e41fdaf65eec9e0654dcb 来源:牛客网 [编程题]构造MaxTree ...

  6. 【01】sass基础信息:

    [01]基础信息:   2016年4月16日   最新版本:3.4.22   官网:http://sass-lang.com/(下图)       CSStoSCSS 网站:http://css2sa ...

  7. 大数据学习——hive数据类型

    1. hive的数据类型Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型2. hive基本数据类型基础数据类型包括:TINYINT,SMALLINT,INT,BIGIN ...

  8. POJ1703-Find them, Catch them 并查集构造

                                             Find them, Catch them 好久没有做并查集的题,竟然快把并查集忘完了. 题意:大致是有两个监狱,n个 ...

  9. [HNOI2012] 永无乡 题解

    题意: n个点,有加边操作,询问与某一点处于相同的联通块的点中权值第k大的点 思路: 对所有点建立一棵权值线段树,加边就配合并查集进行线段树合并 反思: 动态开点,权值线段树要用sum[g[x=fin ...

  10. FZU 1686 dlx重复覆盖

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...