机器视觉:ransac算法详解

article/2025/9/8 14:10:23

目录

一、说明:

二、算法步骤

三、算法代码

四、其它补充


一、说明:

        RANSAC是一种常用的参数估计方法,全称为Random Sample Consensus(随机抽样一致性)。它通过随机选择数据中的一部分,然后根据这些数据拟合模型,统计模型与其他数据的偏差,最终筛选出符合一定阈值的数据,用于估计参数。RANSAC可以应用于很多领域,如计算机视觉、机器人和地理信息系统等。其优点在于对噪声数据和异常值有很强的鲁棒性,能够有效地估计参数。

        在线性回归问题中,采样点具备明显的线性相关性;如下图左。然而有些情性中,噪声很大,线性性散布在非线性点的噪声中,将无法用线性回归 的方法进行直线提取。

         随机样本一致性 (RANSAC) 是一种迭代方法,用于从一组包含异常值的观察数据中估计数学模型的参数,此时异常值不会对估计值产生影响。因此,它也可以解释为一种异常值检测方法。 [1]从某种意义上说,它是一种非确定性算法,它仅以一定的概率产生合理的结果,随着允许更多的迭代,这种概率会增加。该算法于 1981 年由 SRI International 的 Fischler 和 Bolles 首次发布。他们使用 RANSAC 来解决位置确定问题 (LDP),其目标是确定空间中投射到图像上的点到一组地标中已知地点。

二、算法步骤

RANSAC 算法的输入是一组观测数据值、一种将某种模型拟合到观测值的方法以及一些置信度参数。 RANSAC 通过重复以下步骤来实现其目标:

  • 选择原始数据的随机子集。将此子集称为假设的内点。
  • 将模型拟合到一组假设的内点。
  • 然后针对拟合模型测试所有其他数据。根据某些特定于模型的损失函数,那些很好地拟合估计模型的点被视为共识集的一部分。
  • 如果足够多的点已被归类为共识集的一部分,则估计模型相当好。
  • 之后,可以通过使用共识集的所有成员重新估计模型来改进模型。

算法步骤说明:

1)给定数据点如图

 2)随机找出2点作为假象拟合连线为L,则任意点与P距离小于阈值s,认为在线上,否则不在线上;显然下图的线上点为4

 3)再次随机抽取两点做为假象拟合线,如下图:显然线上点为7;因此,原先的模型点,被目前的模型点取代。

 4)继续随机抽取两点作为模型,直到线上点数量不再增加为止。最终拟合结果也就得到。

一维度的ransac算法。直线拟合,可以构成曲线拟合,或者曲面拟合。

三、算法代码

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/1/4 18:42
# @Author  : shaocanfan
# @File    : Ransac.py
import numpy as np
import matplotlib.pyplot as plt
import random
import math# 数据量。
SIZE = 50
# 产生数据。np.linspace 返回一个一维数组,SIZE指定数组长度。
# 数组最小值是0,最大值是10。所有元素间隔相等。
X = np.linspace(0, 10, SIZE)
Y = 3 * X + 10fig = plt.figure()
# 画图区域分成1行1列。选择第一块区域。
ax1 = fig.add_subplot(1,1, 1)
# 标题
ax1.set_title("RANSAC")# 让散点图的数据更加随机并且添加一些噪声。
random_x = []
random_y = []
# 添加直线随机噪声
for i in range(SIZE):random_x.append(X[i] + random.uniform(-0.5, 0.5))random_y.append(Y[i] + random.uniform(-0.5, 0.5))
# 添加随机噪声
for i in range(SIZE):random_x.append(random.uniform(0,10))random_y.append(random.uniform(10,40))
RANDOM_X = np.array(random_x) # 散点图的横轴。
RANDOM_Y = np.array(random_y) # 散点图的纵轴。# 画散点图。
ax1.scatter(RANDOM_X, RANDOM_Y)
# 横轴名称。
ax1.set_xlabel("x")
# 纵轴名称。
ax1.set_ylabel("y")# 使用RANSAC算法估算模型
# 迭代最大次数,每次得到更好的估计会优化iters的数值
iters = 100
# 数据和模型之间可接受的差值
sigma = 0.25
# 最好模型的参数估计和内点数目
best_a = 0
best_b = 0
pretotal = 0
# 希望的得到正确模型的概率
P = 0.99
for i in range(iters):# 随机在数据中红选出两个点去求解模型sample_index = random.sample(range(SIZE * 2),2)x_1 = RANDOM_X[sample_index[0]]x_2 = RANDOM_X[sample_index[1]]y_1 = RANDOM_Y[sample_index[0]]y_2 = RANDOM_Y[sample_index[1]]# y = ax + b 求解出a,ba = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1# 算出内点数目total_inlier = 0for index in range(SIZE * 2):y_estimate = a * RANDOM_X[index] + bif abs(y_estimate - RANDOM_Y[index]) < sigma:total_inlier = total_inlier + 1# 判断当前的模型是否比之前估算的模型好if total_inlier > pretotal:iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE * 2), 2))pretotal = total_inlierbest_a = abest_b = b# 判断是否当前模型已经符合超过一半的点if total_inlier > SIZE:break# 用我们得到的最佳估计画图
Y = best_a * RANDOM_X + best_b# 直线图
ax1.plot(RANDOM_X, Y)
text = "best_a = " + str(best_a) + "\nbest_b = " + str(best_b)
plt.text(5,10, text,fontdict={'size': 8, 'color': 'r'})
plt.show()

四、其它补充

        确定数据点何时适合模型 t 的阈值,以及断言模型与数据 d 良好拟合所需的接近数据点的数量是根据应用程序和数据集的特定要求确定的,并且可能基于实验评估。

        然而,可以使用理论结果将迭代次数 k 确定为所需成功概率 p 的函数。令 p 为 RANSAC 算法在运行后提供至少一个有用结果的期望概率。如果 RANSAC 在某些迭代中选择估计模型参数的 n 个点时仅从输入数据集中选择内点,则返回成功的结果。令w 为每次选择单个点时选择内点的概率,即:

\LARGE w = \tfrac{number\_of\_lines}{number\_of\_data}

        一个常见的情况是 w 事先并不为人所知,但可以给出一些粗略的值。假设估计模型所需的 n 个点是独立选择的,\LARGE {\displaystyle w^{n}}是所有 n 个点都是内点的概率,\LARGE {\displaystyle 1-w^{n} }是 n 个点中至少有一个是异常值的概率,这种情况意味着将从该点集估计出一个坏模型。 k 次方的概率是算法永远不会选择一组 n 个点的概率,这些点都是内点,这必须与 {\displaystyle 1-p}1-p 相同。所以,


http://chatgpt.dhexx.cn/article/JdE7kQmn.shtml

相关文章

RANSAC算法介绍与总结

RANSAC算法 简介RANSAC地面分割 简介 粒子分割主要使用RANSAC算法. RANSAC全称Random Sample Consensus, 即随机样本一致性, 是一种检测数据中异常值的方法. RANSAC通过多次迭代, 返回最佳的模型. 每次迭代随机选取数据的一个子集, 并生成一个模型拟合这个子样本, 例如一条直线…

RANSAC算法原理

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法&#xff0c;有一定的概率得出一个合理的结果。为了提高得出合理结果的概率必须…

RANSAC算法理解

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC算法(附RANSAC直线拟合C++与Python版本)

文章目录 RANSAC算法简介RANSAC算法基本思想和流程迭代次数推导RANSAC与最小二乘区别RANSAC直线拟合代码&#xff08;C及Python版本&#xff09;C版本代码Python版本代码如下&#xff1a; RANSAC优缺点参考 RANSAC算法简介 RANSAC(RANdom SAmple Consensus,随机采样一致)算法是…

php 枚举类代替hard code代码

新建OrderEnum枚举类 在控制器调用

ERP text object hard code

Created by Wang, Jerry, last modified on Sep 28, 2016 要获取更多Jerry的原创文章&#xff0c;请关注公众号"汪子熙":

Do not hardcode /data/; use Context.getFilesDir().getPath() instead 解决方法

在Android项目中如果使用字符串路径会提示 Do not hardcode "/data/"; use Context.getFilesDir().getPath() instead&#xff0c;如图所示 原因是因为硬编码不是对任何设备都适合&#xff0c;在一些设备上可能会给出错误消息或无法正常工作。可以做如下替换。 Stri…

Drool7s 什么叫KIE和生命周期-系列03课

KIE是缩写&#xff0c;knowledge is everything。可以理解成一个上层接口&#xff0c;本质是由很多个实现类去实现功能的。 另外关于drool7s的生命周期&#xff0c;请看下图 本文只是让你了解drools7的一些概念&#xff0c;也是开始实践的基础。如果不了解这些知识的话&#xf…

drool 7.x 属性 : agenda-group

Agenda Group 是用来在Agenda 的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group 属性来实现。 agenda-group 属性的值也是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group,默认情况下,引擎在调用这些设置了agenda-group …

drools视频教程(drool实战实例+数据库+视频讲解)

特别说明&#xff1a;此教程适用任何版本的drools&#xff0c;因为编程思想是不变的 drools的资料网上也有不少&#xff0c;但是大都是讲基础的&#xff0c;几乎没有讲在项目中到底怎么用的&#xff0c;小哥当时学的时候也是&#xff0c;网上看了很多文档&#xff0c;但是还是不…

Drool实战系列(二)之eclipse安装drools插件

这里演示是drools7.5.0&#xff0c;大家可以根据自己需要安装不同的drools版本 drools安装地址: http://download.jboss.org/drools/release/ 一、 二、点击进入7.6.0.Final,并选择droolsjbpm-tools-distribution-XXX.zip(XXX为版本号)进行下载 三、将下载完的插件解压到本地 启…

drool 7.x 属性 : lock-on-active

lock-on-active true&#xff1a;通过这个标签&#xff0c;可以控制当前的规则只会被执行一次&#xff0c;因为一个规则的重复执行不一定是本身触发的&#xff0c;也可能是其他规则触发的&#xff0c;所以这个是no-loop的加强版。当然该标签正规的用法会有其他的标签的配合&…

Drool7s kmodule的作用--系列02课

本文是介绍drool7s kmodule。 一、为什么komdule.xml文件一定要放在resources下的META-INF文件夹中 ---》直接看源码吧&#xff0c;请看下图&#xff0c;应该都知道为什么要放在固定文件夹下。 二、下面是一些知识点&#xff0c;需要大家记住的 kmodule中可以包含一个或多个…

Java Drool规则引擎

2019独角兽企业重金招聘Python工程师标准>>> Drools是一个基于java的规则引擎&#xff0c;开源的&#xff0c;可以将复杂多变的规则从硬编码中解放出来&#xff0c;以规则脚本的形式存放在文件中&#xff0c;使得规则的变更不需要修正代码重启机器就可以立即在线上环…

Drool学习记录(二) Kie Session、Truth maintenance

参考Drools官方文档(3.1 KIE Session和3.2 Inference and truth maintenance in the Drools engine)&#xff0c;学习关于Kie Session和Truth maintenace的内容。这两节内容虽然很基础&#xff0c;但是感觉官方文档说的还是不够明了&#xff0c;尤其是Stateless Session和State…

drool 7.x 属性 : no-loop

drool 7.x 属性 : no-loop 测试类参考:https://blog.csdn.net/qq_21383435/article/details/82872537 实体类:com.secbro.drools.model.Product 规则:/Users/lcc/IdeaProjects/AllTest/drools_test7/src/main/resources/rules.blog/noLoopSession.drl package rules.blogim…

Drool实战系列(一)之入门程序

Drools官网地址为:https://www.drools.org/ maven环境 入门程序例子如下: 项目结构截图: 一、导入pom文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://…

drool 7.x 属性:duration

规则 package com.rulesimport entity.Pingdeclare Ping@role(event) // 要把插入的数据声明为event,默认是fact,@expires(20s) // 用来显示设置事件的过期时间,也就是说过了这个时间,该事件就会从会话中移除,不能再使用 endrule "testComplexEvent1"du…

drool-6.5的自学demo

先丢代码地址 https://gitee.com/a247292980/drools 再丢pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven…