图像识别基本算法之SURF

图像识别、人脸识别可行的算法有很多。但是作为学习,如果能理清这个问题研究的历程及其主线,会对你深入理解当前研究最新的发展有很多帮助。本文是自己在学习过程中的笔记,大多内容来自于网络,出处请参考最后的引文部分。

Sift算法

Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。总体来说,Sift算子具有以下特性:

  1. Sift特征是图像的局部特征,对平移、旋转、尺度缩放、亮度变化、遮挡和噪声等具有良好的不变性,对视觉变化、仿射变换也保持一定程度的稳定性。
  2. 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配。
  3. 多量性,即使少数的几个物体也可以产生大量Sift特征向量。
  4. 速度相对较快,经优化的Sift匹配算法甚至可以达到实时的要求。
  5. 可扩展性强,可以很方便的与其他形式的特征向量进行联合。

其Sift算法的三大工序为:

  1. 提取关键点;
  2. 对关键点附加详细的信息(局部特征)也就是所谓的描述器;
  3. 通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。

提取关键点和对关键点附加详细的信息(局部特征)也就是所谓的描述器可以称做是Sift特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量,Sift特征的生成一般包括以下几个步骤:

  1. 构建尺度空间,检测极值点,获得尺度不变性;
  2. 特征点过滤并进行精确定位;
  3. 为特征点分配方向值;
  4. 生成特征描述子;

Surf算法

SURF是speed up robust feature的缩写,可以视为加速版的Sift算法。 SURF的特点:

  1. 使用积分图像完成图像卷积(相关)操作;
  2. 使用Hessian矩阵检测特征值;
  3. 使用基于分布的描述符(局部信息)。

SURF算法的一般步骤为:

  1. 构建Hessian矩阵;
  2. 构建尺度空间;
  3. 精确定位特征点;
  4. 主方向确定;

跟TensorFlow中碰到的情况一样,目前这些常用的算法,在大多的机器学习框架中都已经封装完成了。使用者已经不需要详细的了解内在算法就可以直接使用。

下面是网上转来的使用OPENCV进行SURF特征点检测示例源码:

#include "highgui/highgui.hpp"    
#include "opencv2/nonfree/nonfree.hpp"    
#include "opencv2/legacy/legacy.hpp"   
#include <iostream>  
  
using namespace cv;  
using namespace std;  
  
int main(int argc,char *argv[])    
{    
    Mat image01=imread(argv[1]);    
    Mat image02=imread(argv[2]);    
    Mat image1,image2;    
    image1=image01.clone();  
    image2=image02.clone();  
  
    //提取特征点    
    SurfFeatureDetector surfDetector(4000);  //hessianThreshold,海塞矩阵阈值,并不是限定特征点的个数   
    vector<KeyPoint> keyPoint1,keyPoint2;    
    surfDetector.detect(image1,keyPoint1);    
    surfDetector.detect(image2,keyPoint2);    
  
    //绘制特征点    
    drawKeypoints(image1,keyPoint1,image1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);      
    drawKeypoints(image2,keyPoint2,image2,Scalar::all(-1),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);       
    imshow("KeyPoints of image1",image1);    
    imshow("KeyPoints of image2",image2);    
  
    //特征点描述,为下边的特征点匹配做准备    
    SurfDescriptorExtractor SurfDescriptor;    
    Mat imageDesc1,imageDesc2;    
    SurfDescriptor.compute(image1,keyPoint1,imageDesc1);    
    SurfDescriptor.compute(image2,keyPoint2,imageDesc2);    
  
    //特征点匹配并显示匹配结果    
    //BruteForceMatcher<L2<float>> matcher;    
    FlannBasedMatcher matcher;  
    vector<DMatch> matchePoints;    
    matcher.match(imageDesc1,imageDesc2,matchePoints,Mat());  
  
    //提取强特征点  
    double minMatch=1;  
    double maxMatch=0;  
    for(int i=0;i<matchePoints.size();i++)  
    {  
        //匹配值最大最小值获取  
        minMatch=minMatch>matchePoints[i].distance?matchePoints[i].distance:minMatch;  
        maxMatch=maxMatch<matchePoints[i].distance?matchePoints[i].distance:maxMatch;  
    }  
    //最大最小值输出  
    cout<<"最佳匹配值是: "<<minMatch<<endl;  
    cout<<"最差匹配值是: "<<maxMatch<<endl;  
  
    //获取排在前边的几个最优匹配结果  
    vector<DMatch> goodMatchePoints;  
    for(int i=0;i<matchePoints.size();i++)  
    {  
        if(matchePoints[i].distance<minMatch+(maxMatch-minMatch)/2)  
        {  
            goodMatchePoints.push_back(matchePoints[i]);  
        }  
    }  
  
    //绘制最优匹配点  
    Mat imageOutput;  
    drawMatches(image01,keyPoint1,image02,keyPoint2,goodMatchePoints,imageOutput,Scalar::all(-1),  
        Scalar::all(-1),vector<char>(),DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);       
    imshow("Mathch Points",imageOutput);    
    waitKey();    
    return 0;    
}  

引文及参考

SURF算法原理 Opencv Surf算子特征提取与最优匹配 特征点检测学习_2(surf算法)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SIGAI学习与实践平台

目标检测最新总结与前沿展望

从 2006 年以来,在 Hilton、Bengio、LeChun 等人的引领下,大量深度神经网络的论文被发表,尤其是 2012 年,Hinton课题组首次参加...

1572
来自专栏AI研习社

史上最好记的神经网络结构速记表(下)

翻译 / 唐青 校对 / 李宇琛 整理 / 雷锋字幕组 本文提供了神经网络结构速查表,全面盘点神经网络的大量框架,并绘制直观示意图进行说明,是人手必备的神经网络...

41011
来自专栏专知

【干货】Lossless Triplet Loss: 一种高效的Siamese网络损失函数

【导读】本文是数据科学家Marc-Olivier Arsenault撰写的一篇博文,主要讲解了在Siamese网络中使用Lossless Triplet Los...

4156
来自专栏大数据挖掘DT机器学习

Logistic回归模型、应用建模案例

一、logistic回归模型概述 广义线性回归是探索“响应变量的期望”与“自变量”的关系,以实现对非线性关系的某种拟合。这里面涉及到一个“连接...

3004
来自专栏互联网杂技

计算机科学中最重要的 32 个算法

奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutsch...

33112
来自专栏数据科学与人工智能

【机器学习】10 种机器学习算法的要点

前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明、更个性化的技术。 也许我...

2367
来自专栏AI科技评论

干货 | 史上最好记的神经网络结构速记表(下)

翻译 / 唐青 校对 / 李宇琛 整理 / 雷锋字幕组 本文提供了神经网络结构速查表,全面盘点神经网络的大量框架,并绘制直观示意图进行说明,是人手必备的神经网...

35712
来自专栏PPV课数据科学社区

重要的机器学习算法

关键词:机器学习,算法 正文: 本文旨在为那些获取关于重要机器学习概念知识的人们提供一些机器学习算法,同时免费提供相关的材料和资源。并且附上相关算法的程序实现...

2696
来自专栏CVer

目标检测最新进展总结与展望

讲者结合论文解读和具体实现带领大家从算法关键步骤原理一步步过渡到工程细节,有理有据帮助你快速掌握核心知识。

1153
来自专栏智能算法

10 种机器学习算法的要点(附 Python 和 R 代码)

本文由 伯乐在线 - Agatha 翻译,唐尤华 校稿。 英文出处:SUNIL RAY。欢迎加入翻译组。 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和...

3355

扫码关注云+社区