奇技 · 指南

本文主要内容

1.模版匹配

2.特征匹配

3.深度学习去找目标

图像匹配的应用及背景

图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点。

应用:遥感(制图更新),计算机视觉应用程序,医疗用图像注册。

图像匹配主要可分为以灰度为基础的匹配和以特征为基础的匹配。

模版匹配

原理

模板匹配是基于像素的匹配,用来在一副大图中搜寻查找模版图像位置的方法。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像和与其对应的输入图像的子区域进行比较。OpenCV 提供了几种不同的比较方法。返回的结果是一个灰度图像,每一个像素值表示了此区域与模板的匹配程度。

当你得到这幅图之后,就可以使用函数cv2.minMaxLoc() 来找到其中的最小值和最大值的位置了。

第一个值为矩形左上角的点(位置),(w,h)为模板矩形的宽和高。这个矩形就是找到的模板区域了。注意:如果你使用的比较方法是 cv2.TM_SQDIFF,最小值对应的位置才是匹配的区域。

模板匹配的匹配规则

CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。

CV_TM_CCORR?相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。

CV_TM_CCOEFF?相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。

CV_TM_SQDIFF_NORMED?归一化平方差匹配法

CV_TM_CCORR_NORMED?归一化相关匹配法

CV_TM_CCOEFF_NORMED?归一化相关系数匹配法

假如你的模板图像在目标图像中出现了很多次怎么办呢?

如果你想匹配一次,就找最大匹配的点,如果你想匹配多个物体,就可以自己来设置一个匹配阈值,根据你的需求来

模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。

特征匹配

1.SIFT特征提取

2.FLANN匹配器

3.FLANN的单应性匹配

特征提取与特征描述

图像特征

特征描述,计算机对特征周围的区域进行描述,这样它才能在其他图像中找到相同的特征

SIFT: 是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest  points, or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配

SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。

SIFT特征提取流程

1.尺度空间极值检测:这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征。

2.关键点(极值点)定位

3.为关键点(极值点)指定方向参数

4.关键点描述符的生成

SIFT特征提取分析

1.构建尺度空间

不同的尺度空间不能使用相同的窗口检测极值点。对小的角点要用小的窗口,对大的角点只能使用大的窗口。为了达到这个目的我们要使用尺度空间滤波器

这是一个初始化操作,尺度空间理论目的是模拟图像数据的多尺度特征。使用具有不同方差值 σ 的高斯拉普拉斯算子(LoG)对图像进行卷积。

LoG 的计算量非常大,为了有效的在尺度空间检测到稳定的关键点,所以 SIFT 算法使用高斯差分算子(DoG)来对 LoG 做近似。利用不同尺度的高斯差分核与图像卷积生成。具体到图像处理来讲,就是将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图

图像金字塔:我们可以通过降采样(如只取奇数行或奇数列)来构成一组图像尺寸(1,0.5,0.25 等)不同的金字塔,然后对这一组图像中的每一张图像使用具有不同方差 σ 的高斯卷积核构建出具有不同分辨率的图像金字塔(不同的尺度空间)。DoG 就是这组具有不同分辨率的图像金字塔中相邻的两层之间的差值。如下图所示:

i为塔数(第几个塔),s为每塔层数由图片size决定建几个塔,每塔几层图像(S一般为3-5层)。0塔的第0层是原始图像(或你double后的图像),直观上看来越往上图片越模糊。

2.检测DOG尺度空间极值点

高斯尺度空间金字塔中每组有五层不同尺度图像,相邻两层相减得到四层DoG结果。关键点搜索就在这四层DoG图像上寻找局部极值点。寻找DoG极值点时,每一个像素点和它所有的相邻点比较,当其大于(或小于)它的图像域和尺度域的所有相邻点时,即为极值点。则在比较时牺牲了-1组的第0层和第N组的最高层

除去不好的特征点

以上极值点的搜索是在离散空间进行搜索的,由下图可以看到,在离散空间找到的极值点不一定是真正意义上的极值点。使用尺度空间的泰勒级数展开来获得极值的准确位置,如果极值点的灰度值小于阈值(0.03)就会被忽略掉。DoG 算法对边界非常敏感,会产生较强的边缘响应,所以我们必须要把边界去除,使用近似Harris Corner检测器。

通过拟和三维二次函数以精确确定关键点的位置和尺度(达到亚像素精度),同时去除低对比度的关键点和不稳定的边缘响应点,以增强匹配稳定性、提高抗噪声能力。

3.为关键点(极值点)指定方向参数

上一步中确定了每幅图中的特征点,为每个特征点计算一个方向,这样它才会具有旋转不变性。获取关键点(所在尺度空间)的邻域,然后计算这个区域的梯度级和方向。根据计算得到的结果创建一个含有 36 个 bins(每 10度一个 bin)的方向直方图。直方图中的峰值为主方向参数,如果其他的任何柱子的高度高于峰值的80% 被认为是辅方向。这就会在相同的尺度空间相同的位置构建出具有不同方向的关键点。这对于匹配的稳定性会有所帮助。

每个关键点有三个信息:位置,所处尺度、方向,由此可以确定一个SIFT特征区域。

4. 关键点描述子的生成

该步中将建立所有scale中特征点的描述子(128维)

关键点描述子的生成步骤

通过对关键点周围图像区域分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

为了保证特征矢量具有旋转不变性,要以特征点为中心,在附近邻域内旋转θ角,即旋转为特征点的方向。

选取与关键点周围一个 16x16 的邻域,把它分成 16 个 4x4 的小方块,为每个小方块创建一个具有 8 个 bin 的方向直方图。绘制每个梯度方向的累加值,即可形成一个种子点,这样就可以对每个特征形成一个4*4*8=128维的描述子,每一维都可以表示4*4个格子中一个的scale/orientation.?将这个向量归一化之后,就进一步去除了光照的影响。

根据SIFT进行Match

生成了A、B两幅图的描述子(分别是k1*128维和k2*128维)。

将两图中各个scale(所有scale)的描述子进行匹配,匹配上128维即可表示两个特征点match上了。

可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取第一个图的某个关键点,通过遍历找到第二幅图像中的距离最近的那个关键点。但有些情况下,第二个距离最近的关键点与第一个距离最近的关键点靠的太近。这可能是由于噪声等引起的。此时要计算最近距离与第二近距离的比值。如果比值大于 0.8,就忽略掉。这会去除 90% 的错误匹配,同时只去除 5% 的正确匹配。

FLANN 匹配

FLANN 是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的简称。它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。

使用 FLANN 匹配,我们需要传入两个字典作为参数。这两个用来确定要使用的算法和其他相关参数等,第一个是 IndexParams,第二个字典是 SearchParams。用它来指定递归遍历的次数。值越高结果越准确,但是消耗的时间也越多。

indexparams = dict(algorithm =FLANN_INDEX_KDTREE, trees = 5)

searchparams = dict(checks = 100)

flann = cv2.FlannBasedMatcher(indexParams,searchParams)

matches = flann.knnMatch(des1,des2,k=2)

检测出的匹配点可能有一些是错误正例(false positives)。因为这里使用过的kNN匹配的k值为2(在训练集中找两个点),第一个匹配的是最近邻,第二个匹配的是次近邻。直觉上,一个正确的匹配会更接近第一个邻居。换句话说,一个不正确的匹配,两个邻居的距离是相似的。因此,我们可以通过查看二者距离的不同来评判匹配程度的好坏。并且舍去那些不好的匹配点,保留好的匹配点。

FLANN匹配和单应性查找对象

我们在一张杂乱的图像中找到了一个对象(的某些部分)的位置。这些信息足以帮助我们在目标图像中准确的找到(模板图像)对象。

我们可以使用cv2.findHomography()函数如果将这两幅图像中的特征点集传给这个函数,他就会找到这个对象的透视图变换。

透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。

然后我们就可以使用函数 cv2.perspectiveTransform() 找到模板图像的4个坐标点变换到目标图像中的新的坐标了。

单应性变换(Homography)

一个平面到另一个平面的映射关系。两张图分别有四个相对位置相同的点,Homography就是一个变换(3*3矩阵),将一张图中的点映射到另一张图中对应的点

特征匹配结果展示

实践中的小问题

Yolo训练

用网络去训练的模型,能够识别出目标,但是对训练数据的构造要求比较高。迁移性很难得到保证。

a.先将要训练的图像进行标记,可以把你要识别的每个模板标为一类

b.训练的图尽可能的丰富,这样可以增强模型的迁移性

c.用训练好的模型去测试,识别出目标图片上的类

方法对比总结

特征匹配与模板匹配的区别:模板匹配是基于像素的,特征匹配则是基于区域的,特征匹配在考虑像素灰度的同时还应考虑诸如空间整体特征、空间关系等因素。

特征是图像内容最抽象的描述,与基于灰度的匹配方法相比,特征相对于几何图像和辐射度影响来说更不易变化,但特征提取方法的计算代价通常较大,并且需要一些自由参数和事先按照经验选取的阀值,因而不便于实时应用。同时,在纹理较少的图像区域提取的特征的密度通常比较稀少,使局部特征的提取比较困难。另外,基于特征的匹配方法的相似性度量也比较复杂,往往要以特征属性、启发式方法及阀方法的结合来确定度量方法。

深度学习的方法对数据的要求较高,需要考虑模型的迁移性,相对训练的时间也会耗费更多,但数据集够丰富的时候,深度学习是个很好的选择。

在应用过程中,选择优先使用模板匹配,再用特征匹配,最后用深度学习的方式

算法的选择

第一个是indexParams。配置我们要使用的算法

1、随机k-d树算法(The Randomized k-d TreeAlgorithm)

a.Classick-d tree

找出数据集中方差最高的维度,利用这个维度的数值将数据划分为两个部分,对每个子集重复相同的过程。

b.Randomizedk-d tree

建立多棵随机k-d树,从具有最高方差的N_d维中随机选取若干维度,用来做划分。在对随机k-d森林进行搜索时候,所有的随机k-d树将共享一个优先队列。

增加树的数量能加快搜索速度,但由于内存负载的问题,树的数量只能控制在一定范围内,比如20,如果超过一定范围,那么搜索速度不会增加甚至会减慢

2、优先搜索k-means树算法(The Priority Search K-MeansTree Algorithm)

2.1算法描述

步骤1 建立优先搜索k-means tree:

(1)建立一个层次化的k-means 树;

(2)每个层次的聚类中心,作为树的节点;

(3)当某个cluster内的点数量小于K时,那么这些数据节点将做为叶子节点。

步骤2 在优先搜索k-means tree中进行搜索:

(1)从根节点N开始检索;

(2)如果是N叶子节点则将同层次的叶子节点都加入到搜索结果中,count += |N|;

(3)如果N不是叶子节点,则将它的子节点与query Q比较,找出最近的那个节点Cq,同层次的其他节点加入到优先队列中;

(4)对Cq节点进行递归搜索;

(5)如果优先队列不为空且 count

聚类的个数K,也称为branching factor 是个非常主要的参数。

建树的时间复杂度 = O( ndKI ( log(n)/log(K) ))? n为数据点的总个数,I为K-means的迭代次数。搜索的时间复杂度 = O( L/K * Kd * ( log(n)/(log(K) ) ) = O(Ld ( log(n)/(log(K) ) )。

3.层次聚类树 (The Hierarchical ClusteringTree)

层次聚类树采用k-medoids的聚类方法,而不是k-means。即它的聚类中心总是输入数据的某个点,但是在本算法中,并没有像k-medoids聚类算法那样去最小化方差求聚类中心,而是直接从输入数据中随机选取聚类中心点,这样的方法在建立树时更加简单有效,同时又保持多棵树之间的独立性。

同时建立多棵树,在搜索阶段并行地搜索它们能大大提高搜索性能(归功于随机地选择聚类中心,而不需要多次迭代去获得更好的聚类中心)。建立多棵随机树的方法对k-d tree也十分有效,但对于k-means tree却不适用。

比如我们使用SIFT,我们可以传入参数:

index_params=dict(algorithm = FLANN_INDEX_KDTREE,trees=5)


往期精彩回顾

仿照React源码流程打造90行代码的Hooks

实习招聘|360云平台火热招聘中

360Stack裸金属服务器部署实践

360技术公众号

技术干货|一手资讯|精彩活动

扫码关注我们

akaze特征匹配怎么去掉不合适的点_图像匹配几种常见算法与实践相关推荐

  1. akaze特征匹配怎么去掉不合适的点_一种无人机滑坡遥感影像的快速匹配算法

    作 者 信 息 郝豪杰1,2,3,刘贤赵3,李朝奎1,2,方 军1,2 (1. 湖南科技大学 地理空间信息技术国家地方联合工程实验室,湖南 湘潭 411201:2. 湖南科技大学 测绘遥感信息工程湖南 ...

  2. akaze特征匹配怎么去掉不合适的点_单应性矩阵应用基于特征的图像拼接

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景.得到很多 ...

  3. akaze特征匹配怎么去掉不合适的点_SIFT特征点

    SIFT特征点 图像特征点检测一直是研究的热点,从早期的harris角点检测开始,一直有很多人关注图像特征点的检测.最早人们关注图像中的角点,主要是因为角点能够代表图像中的一些特征.比如,通过检测两幅 ...

  4. ORB/BRISK/AKAZE特征点提取、特征匹配的性能比较

    写在前面 局部特征相关算法在过去二十年期间风靡一时,其中代表的有SIFT.SURF算法等(广泛应用于目标检测.识别.匹配定位中),这两种算法是用金字塔策略构建高斯尺度空间(SURF算法采用框滤波来近似 ...

  5. Python计算机视觉 sift和Harris特征匹配处理对比

    一.SIFT(尺度不变特征变换)原理分析 在过去的十年间,最成功的图像局部描述子之一是尺度不变特征变换(SIFT),它是由David Lowe发明的.SIFT是用于图像处理领域的一种描述,SIFT特征 ...

  6. OpenCV AKAZE本地特征匹配

    OpenCV AKAZE本地特征匹配 AKAZE本地特征匹配 简介 源代码 解释 加载图像和单应性 使用AKAZE检测关键点并计算描述符 使用蛮力匹配器查找2-nn个匹配项 检查我们的匹配项是否适合单 ...

  7. OpenCV + CPP 系列(卌二)图像特征匹配( KAZE/AKAZE)

    文章目录 一.KAZE简介 二.代码演示 特征检测效果对比 演示匹配 一.KAZE简介 ECCV2012中出现了一种比SIFT更稳定的特征检测算法KAZE ([1]).KAZE的取名是为了纪念尺度空间 ...

  8. OpenCV中的特征匹配(Feature Matching)

    OpenCV中的特征匹配(Feature Matching) 1. 效果图 2. 原理 3. 源码 3.1 SIFT关键点检测+Knn近邻匹配 3.2 ORB关键点检测+蛮力特征匹配 3.3 SIFT ...

  9. SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结

    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac     RANSAC是"RANdom SAmple Consensus(随机抽样一 ...

最新文章

  1. css/js压缩工具
  2. javax.swing.jFrame
  3. 深度学习目标检测(YoloV5)项目——从0开始到项目落地部署
  4. CF1556D-Take a Guess【交互】
  5. 癌中之王:基质微环境塑造胰腺癌瘤内结构|Cell
  6. Nginx学习之十一-Nginx启动框架处理流程
  7. mysql 双主 脑裂_MySQL双主(主主)架构方案
  8. Sql Server 指定列的乘积
  9. android holder 一定要内部类吗,Android ViewHolder
  10. flowplayer播放需求
  11. 公司为什么需要自己的SAP内部顾问
  12. Linux驱动开发(十三)---USB驱动HID开发学习(鼠标)
  13. Win10锁屏壁纸位置在哪?默认锁屏壁纸怎么提取
  14. Python程序设计基础(第九章 字典和集合 练习记录)
  15. Java将文件转换成二维码
  16. Mac配置mysql环境
  17. linux上如何搭建Java环境
  18. Vue 使用 yarn 报错
  19. 完数(难度系数:半颗星)
  20. 自己设计一个美观的网页版介绍界面(HBuilder)

热门文章

  1. 查理芒格+终身学习+你的认知就是你的财富的边界
  2. 影像组学视频学习笔记[44(End)]-带95%置信区间的折线图、Li‘s have a solution and plan.
  3. apollo热布署mysql_docker部署apollo详细教程
  4. C# C++ Java
  5. c语言统计最长单词长度,求3个字符串中最长单词的长度 求救 会一个的
  6. linux 内核 时间片,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...
  7. 如何学习修改linux系统固件,基于Linux的固件,如何实现更新的好方法?
  8. 指尖大冒险、跳一跳升级版html5游戏全代码
  9. Dapps-是一个跨平台的应用服务商店
  10. mysql 主键选择_mysql – 无论列名如何,都选择主键?