什么是剔除错误匹配?

在我之前的一篇文章中使用了很简陋的一对一特征点匹配算法。获得了如下的结果:

这个结果是粗糙且不令人满意的,我们接下来要介绍两种算法来剔除上述结果中的错误匹配对。

RANSAC 与 MASC 思想概述

RANSAC全称Random Sample Consensus(随机抽样一致算法),MSAC全称M-Estimate Sample Consensus。这两种算法基本思路一致,都是随机选取一部分粗糙结果中的匹配对,再利用其他的算法(如本项目是估计2维透射投影矩阵,即匹配对中的两个点之间的关系为x3×1=H3×3x′3×1x^{3\times1} = H^{3\times3}x'^{3\times1}x3×1=H3×3x′3×1,那么我们就需要使用四点法来计算H3×3H^{3\times3}H3×3)反推模型并计算该模型对于所有粗糙匹配对的cost,反复迭代,最终找到一个优化的模型,剔除所有不符合该模型的匹配对。

RANSAC与MSAC唯一的区别在于cost的计算方式。下面是算法主体的伪代码和两种不同cost计算方式的c++伪代码(在很多情况下伪代码比文字叙述更容易理解一些):

ConsensusMinCost = +inf
For (Trails=0;Trails<maxTrails&&ConsensusMinCost>Threshold; ++Trails){Select a Random Sample;Calculate Model;Calculate Error;Calculate ConsensusCost; //具体Cost算法将在下面给出If (ConsensusCost<consensusMinCost){consensusMinCost = consensusCost;consensusMinCostModel = Model;}
}
Calculate the Error for consensusMinCostModel;// 对每一组匹配对
Calculate set of Inliers ;// Error<=Tolerence, Inliers就是经过筛选后的精确匹配对

其中Tolerance是一个超参,表示Error值比这个参数的匹配对将被保留。

RANSAC的cost算法伪代码:

count = number of Data Points //粗糙匹配对的组数
cost = 0
For (n=0; n<count; n++){cost += Error[n] <= Tolerance?0:1;
}

MSAC的cost算法伪代码:

count = number of Data Points //粗糙匹配对的组数
cost = 0
For (n=0; n<count; n++){cost += Error[n] <= Tolerance?Error[n]:Tolerance;
}

哪种算法更好呢???

理论上来说MSAC是更优的解法。维基百科的解释为

RANSAC can be sensitive to the choice of the correct noise threshold that defines which data points fit a model instantiated with a certain set of parameters. If such threshold is too large, then all the hypotheses tend to be ranked equally (good). On the other hand, when the noise threshold is too small, the estimated parameters tend to be unstable ( i.e. by simply adding or removing a datum to the set of inliers, the estimate of the parameters may fluctuate). To partially compensate for this undesirable effect, Torr et al.

大体意思是RANSAC对于threshold的值(上述代码中的Tolerance)选取过于敏感,这个值过大了算法就无效了,过小的话算法会变得很不稳定。而MSAC可以做到部分补偿这些负面影响。

最后经过MSAC筛选后的匹配对结果如下图:

很舒服。

想了想,我把MSAC的python代码贴出来吧还是(不包括上面提到的四点法),大家可以参考:

def MSAC(pts1, pts2, thresh, tol, p):# Inputs:#    pts1 - matched feature correspondences in image 1#    pts2 - matched feature correspondences in image 2#    thresh - cost threshold#    tol - reprojection error tolerance #    p - probability that as least one of the random samples does not contain any outliers   ## Output:#    consensus_min_cost - final cost from MSAC#    consensus_min_cost_model - planar projective transformation matrix H#    inliers - list of indices of the inliers corresponding to input data#    trials - number of attempts taken to find consensus settrials = 0trials_max = np.infconsensus_min_cost = threshpts1_homo=Homogenize(pts1)pts2_homo=Homogenize(pts2)while trials < trials_max:random_4pts_idx = random.sample(range(60),4)x1_4pts = pts1_homo[:,random_4pts_idx]x2_4pts = pts2_homo[:,random_4pts_idx]try:H = FourPointsAlgorithm(x1_4pts,x2_4pts)except:continueerror,delta = SampsonError(H,pts1_homo,pts2_homo)cost,num_inlier,temp_inliers = ComputeCost(H, pts1_homo, pts2_homo, tol)if cost<consensus_min_cost:consensus_min_cost = costconsensus_min_cost_model = Hinliers = temp_inlierss = 4 #sample sizew = num_inlier/pts1.shape[1]if w>0:trials_max = np.log(1-p)/np.log(1-w**s) print('trials_max: ',trials_max,'\t trials: ',trials,'\t num_inlier: ',num_inlier)trials = trials+1print("Number of attempts: ", trials)return consensus_min_cost, consensus_min_cost_model, inliers, trials

剔除错误匹配算法:RANSAC与MSAC分析相关推荐

  1. mysql数据库连接过多的错误,可能的原因分析及解决办法

    mysql数据库连接过多的错误,可能的原因分析及解决办法 来源:网络采集 作者:未知 系统不能连接数据库,关键要看两个数据: 1.数据库系统允许的最大可连接数max_connections.这个参数是 ...

  2. idcardweb装入失败_vpk安装错误0xffffe Android Crash问题分析以及解决 - 硬件设备 - 服务器之家...

    vpk安装错误0xffffe Android Crash问题分析以及解决 发布时间:2017-04-10 来源:服务器之家 1.问题介绍 Crash问题,无论是java侧还是native侧,在日常测试 ...

  3. ios 打印 详细错误日志_【专家专栏】林相宇 | IOS错误日志抓取和分析

    原标题:[专家专栏]林相宇 | IOS错误日志抓取和分析 在调试自己和别人的IOS App时,发生Crash是非常正常的情况,分析这些Crash的主要手段之一就是分析Crash发生时产生的错误日志.对 ...

  4. HTTP-500错误的常见原因与分析

    HTTP-500错误的常见原因与分析 前言: 最近使用阿里云windows2008R2云服务器搭建网站QQ互联接入(第三方登录 )服务的过程中,使用了phpcmsV9提供的V9.6.3压缩包内的.ht ...

  5. ORA-04031错误导致宕机案例分析

    今天遇到一起ORACLE数据库宕机案例,下面是对这起数据库宕机案例的原因进行分析.解读.分析过程中顺便记录一下这个案例的前因后果,攒点经验值,培养一下分析.解决问题的能力. 案例环境: 操作系统 :O ...

  6. select * 映射错误_高性能IO模型分析-浅析Select、Poll、Epoll机制(三)

    本章(第三章)内容其实和第二章内容,都是第一章内容的延伸.第二章内容是第一章内容的延伸,本章内容则是第一章内容再往底层方面的延伸,也是面试中考察网络方面知识时,可能会问到的几个点. select.po ...

  7. 登陆u9显示404服务器错误,U9常见技术问题分析与解决.docx

    PAGE5 / NUMPAGES50 U9常见技术问题分析及处理 发布人:U9平台技术部 目 录 TOC \o "1-4" \h \z \u HYPERLINK \l " ...

  8. php 异常值检测,PHP中的错误处理、异常处理机制分析

    例: $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: if(file_exists('tes ...

  9. 验证javascript错误使用Google Analytics(分析、统计)

    Google Analytics不只是一个流量统计工具,还可以用它来测量广告活动的有效性,跟踪用户进入的页面所需的时间, 如:从点击广告到购物车到结账页面的时间间隔. // 跟踪基本的 JavaScr ...

最新文章

  1. Java 数组的 12 个最佳方法
  2. jquery中动画效果的函数
  3. 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
  4. setfacl 权限导出_linux学习-setfacl设置特定目录用户权限
  5. i7 8700 服务器系统,i7 8700k 云服务器6
  6. java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
  7. java servlet 执行 多次_servlet 验证生命周期过程调用方法的次数
  8. TestNG+Maven+IDEA 自动化测试(一) 环境搭建
  9. 纯java程序jdbcjar包放在哪_oracle 11g jdbc jar包在哪个文件目录
  10. Python zipfile – Python ZIP
  11. Python操作IHTMLDocument2用于自动化测试
  12. Linux-安全加固
  13. 线性代数之 矩阵乘法的本质
  14. Java网上商城系统_JavaWeb源码网上商城系统
  15. matlab求伪逆,逆、伪逆、左右逆、最小二乘、投影矩阵
  16. 基于域名的虚拟主机配置
  17. bat脚本,windown定时关机,取消定时关机,设置延长关机时间
  18. 网络计算机win7为啥连不上,浅析win7旗舰版64位系统网络连接不上的解决方法
  19. 设置cookies过期时间的几种方法(cookies随浏览器关闭而失效的方法)
  20. 跟谁学计算机老师,跟谁学

热门文章

  1. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper...
  2. 卸载Nero8后,怎样删除它“Nero Sout”目录。
  3. 关于使用网页做托福TPO在chrome上没有声音,找不到autoplay-policy
  4. 笔记本Ubuntu系统关闭独显+省电降温设置
  5. 关于修复EeePC1008Ha在Ubuntu下系统快捷键部分失灵的解决
  6. 浅谈ArcGIS GP服务 :一、框架介绍
  7. Intellij-出现Module ** must not contain source root **. The root already belongs to module **
  8. csgo人机指令_csgo人机指令大全
  9. 机器学习(ML)中文视频教程
  10. 手机gps信号弱 服务器设置,手机GPS服务器设置