Ransac 算法的探索和应用

Ransac 算法python 应用和实现

Ransac 算法是一种常用的图像匹配算法,在参数估计领域也经常被使用到。针对估计各种曲线的鲁棒模型参数,效果显著。这里对ransac算法进行某些探索。

python program:

import numpy as np
import matplotlib.pyplot as plt
import random
import math

# 数据量。
SIZE = 60
SIZE_N = 10 # the numbe of noise
# 产生数据。np.linspace 返回一个一维数组,SIZE指定数组长度。
# 数组最小值是0,最大值是10。所有元素间隔相等。
X = np.linspace(0, 10, SIZE)
Y = -2 * X + 5

fig = plt.figure()
# 画图区域分成1行1列。选择第一块区域。
ax1 = fig.add_subplot(111)
# 标题
ax1.set_title("title ")


# 让散点图的数据更加随机并且添加一些噪声。
random_x = []
random_y = []

random_x2 = []
random_y2 = []

random_x2b = []
random_y2b = []

random_x22 = []
random_y22 = []

random_x22b = []
random_y22b = []
# 添加直线随机噪声
for i in range(SIZE):
    random_x.append(X[i] + random.uniform(-1, 1)) 
    random_y.append(Y[i] + random.uniform(-1, 1)) 
# 添加随机噪声
for i in range(SIZE_N):
    random_x.append(random.uniform(-SIZE,SIZE))
    random_y.append(random.uniform(-SIZE,SIZE))
RANDOM_X = np.array(random_x) # 散点图的横轴。
RANDOM_Y = np.array(random_y) # 散点图的纵轴。



# 使用RANSAC算法估算模型
# 迭代最大次数,每次得到更好的估计会优化iters的数值
iters = 1000
iters2 = int(iters/2)
# 数据和模型之间可接受的差值
sigma = 3
sigma2 = 10
# 最好模型的参数估计和内点数目
best_a = 0
best_b = 0
best_a2 = 0
best_b2 = 0
pretotal = 0
pretotal2 = 0
# 希望的得到正确模型的概率
P = 0.99

for i in range(iters):
    # update the record position for seconde RANSAC 
    random_x2 = []
    random_y2 = []
    # 随机在数据中红选出两个点去求解模型
    sample_index = random.sample(range(SIZE + SIZE_N),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,b
    a = (y_2 - y_1) / (x_2 - x_1)
    b = y_1 - a * x_1

    # 算出内点数目
    total_inlier = 0
    for index in range(SIZE + SIZE_N): # SIZE * 2 is because add 2 times noise of SIZE
        y_estimate = a * RANDOM_X[index] + b
        if abs(y_estimate - RANDOM_Y[index]) < sigma:
            total_inlier = total_inlier + 1
            # record these points that between +-sigma
            random_x2.append(RANDOM_X[index])
            random_y2.append(RANDOM_Y[index])

    # 判断当前的模型是否比之前估算的模型好
    if total_inlier > pretotal:
        iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE + SIZE_N), 2))
        pretotal = total_inlier
        best_a = a
        best_b = b
        # update the latest better points
        random_x2b = np.array(pretotal) # 散点图的横轴。
        random_y2b = np.array(pretotal) # 散点图的纵轴。
        random_x2b = random_x2
        random_y2b = random_y2
        SIZE2 = pretotal
 
    # 判断是否当前模型已经超过八成的点
    if total_inlier > 0.8 * SIZE:
        break

# 用我们得到的最佳估计画图
# 横轴名称。
ax1.set_xlabel("top view x-axis")
# 纵轴名称。
ax1.set_ylabel("top view y-axis")

Y = best_a * RANDOM_X + best_b

# show the ransac2 points:
ax1.scatter(random_x2b, random_y2b, c='b', marker='v')

# 直线图
ax1.scatter(RANDOM_X, RANDOM_Y, c='r', marker='^')

ax1.plot(RANDOM_X, Y, c='b',)
text = "best_a = " + str(best_a) + "\nbest_b = " + str(best_b)
plt.text(5,50, text,
         fontdict={'size': 12, 'color': 'b'})


# the seconde ransac call the point that cover the largest area
RANDOM_XX = np.array(random_x2b) # 散点图的横轴。
RANDOM_YY = np.array(random_y2b) # 散点图的纵轴。

for i in range(iters2):
    random_x22 = []
    random_y22 = []
    # 随机在数据中红选出一个点去求解模型
    sample_index2 = random.sample(range(SIZE2),1)
    x_12 = RANDOM_XX[sample_index2[0]]
    y_12 = RANDOM_YY[sample_index2[0]]


    # y = ax + b 求解出a,b
    a2 = -1 / a
    b2 = y_12 - (a2 * x_12)

    # 算出内点数目
    total_inlier2 = 0
    for index in range(SIZE2):    # SIZE * 2 is because add 2 times noise of SIZE
        y_estimate2 = a2 * RANDOM_XX[index] + b2
        if abs(y_estimate2 - RANDOM_YY[index]) < sigma2:
            total_inlier2 = total_inlier2 + 1
            # record these points that between +-sigma
            random_x22.append(RANDOM_XX[index])
            random_y22.append(RANDOM_YY[index])
            

    # 判断当前的模型是否比之前估算的模型好
    if total_inlier2 > pretotal2:
        print("total_inlier2:", total_inlier2)
        print("SIZE2:", SIZE2)
        iters = math.log(1 - P) / math.log(1 - pow(total_inlier2 / SIZE2, 2))
        pretotal2 = total_inlier2
        best_a2 = a2
        best_b2 = b2
        
        # update the latest better points
        random_x22b = np.array(pretotal2) # 散点图的横轴。
        random_y22b = np.array(pretotal2) # 散点图的纵轴。
        random_x22b = random_x22
        random_y22b = random_y22
 
    # 判断是否当前模型已经超过八成的点
    if total_inlier2 > 0.8 * SIZE2:
        break
    
# 用我们得到的最佳估计画图
YY = best_a2 * RANDOM_XX + best_b2

# show the ransac2 points:
ax1.scatter(random_x22b, random_y22b, c='g', marker='o')

ax1.set_aspect('equal', adjustable='box')
# 直线图
ax1.plot(RANDOM_XX, YY, c='g' )
text = "best_a2 = " + str(best_a2) + "\nbest_b2 = " + str(best_b2)
plt.text(1,30, text,
         fontdict={'size': 12, 'color': 'g'})
plt.show()

ptyhon results:

在这里插入图片描述

References:

ransac实现参考:
scatter()使用方法
Matplotlib 绘制等轴正方形图
random.uniform( ) 函数教程与实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/244500.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Profibus、Profinet、Ethernet有什么区别?

PROFINET 是一种新的以太网通讯系统&#xff0c;是由西门子公司和 Profibus 用户协会开发。 PROFINET 具有多制造商产品之间的通讯能力&#xff0c;自动化和工程模式&#xff0c;并针对分布式智能自动化系统进行了优化。其应用结果能够大大节省配置和调试费用。 PROFINET 系统集…

_pickle.PicklingError: Can‘t pickle : import of module failed

有问题 没问题的 python - pickle cant import a module that exists? - Stack Overflow

华媒舍:怎样利用旅游业发展媒体套餐宣传推广分析7个经典案例

1.分析经典案例在旅游业发展中&#xff0c;依靠媒体套餐开展宣传推广成为了一种常见的方法。下面将详细介绍7个经典案例&#xff0c;从这当中我们可以得出一些宝贵经验。 案例一&#xff1a;目标市场定位成功宣传推广一定要明确市场定位&#xff0c;针对不同的受众群体制定合理…

【FPGA/verilog -入门学习12】Verilog可配置的PWM设计,参数传递的3种方式

需求&#xff1a; 基于任务&#xff08;task&#xff09;的PWM设计仿真验证 需求分析&#xff1a; 1,需求实现可配置PWM输出&#xff08;频率&#xff0c;占空比&#xff09; 2,输入&#xff0c;输出端口 input i_clk, //clk 50Mhz input i_rst_n, input i_en, output…

设计模式(三)-结构型模式(1)-适配器模式

一、为何需要适配器模式&#xff08;Adapter&#xff09;? 在软件设计中&#xff0c;某个模块里有很多公用的功能接口&#xff0c;其中有些公用接口需要用到不同的类当中时&#xff0c;会出现接口不兼容的问题。因为这些不同的类对这个相同任务的接口&#xff0c;都有各自代码…

DNSLog漏洞探测(七)之SQL注入漏洞实战

DNSLog漏洞探测(七)之SQL注入漏洞实战 在前面的文章之中&#xff0c;我们已经学习了XSS、RCE、XXE、SSRF漏洞中有关于DNSLog平台的使用。这些漏洞本身在执行时就有解析URL地址&#xff0c;发起网络请求的操作&#xff0c;所以只要我们把DNSLog平台获取的子域名地址发送到存在漏…

优化钢铁加工:RFID技术的革新应用

优化钢铁加工&#xff1a;RFID技术的革新应用 RFID是一种无线通信技术&#xff0c;通过将标签上的电子数据以无线电信号的形式传输&#xff0c;实现对物品的远程识别和跟踪。在钢铁加工领域&#xff0c;RFID技术的应用能够提高生产效率、降低成本并优化物流管理。本文将探讨RF…

DevOps 和人工智能 – 天作之合

如今&#xff0c;人工智能和机器学习无处不在&#xff0c;所以它们开始在 DevOps 领域崭露头角也毫不令人意外。人工智能和机器学习正在通过自动化任务改变 DevOps&#xff0c;并使各企业的软件开发生命周期更高效、更深刻和更安全。我们在 DevOps 趋势中简要讨论过这一问题&am…

【Hive】——DDL(DATABASE)

1 概述 2 创建数据库 create database if not exists test_database comment "this is my first db" with dbproperties (createdByAllen);3 描述数据库信息 describe 可以简写为desc extended 可以展示更多信息 describe database test_database; describe databa…

有意思!40小时工作制来了,996再见

​在中国&#xff0c;加班文化已经深入人心。工资越高加班越多&#xff0c;“996”已成为一些行业标签&#xff0c;月薪30k以上的职场人中超过86&#xff05;经常加班。所以今天我就来说一下这40小时工作制到底是从何而来&#xff0c;感兴趣的往下看看吧&#xff01; 40小时工…

【Hive_02】查询语法

1、基础语法2、基本查询&#xff08;Select…From&#xff09;2.1 全表和特定列查询2.2 列别名2.3 Limit语句2.4 Where语句2.5 关系运算函数2.6 逻辑运算函数2.7 聚合函数 3、分组3.1 Group By语句3.2 Having语句3.3 Join语句&#xff08;1&#xff09;等值与不等值Join&#x…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…

uniapp原生插件之安卓动态权限申请原生插件

插件介绍 安卓动态权限申请原生插件&#xff0c;集成了常用的权限申请&#xff0c;可以自定义权限申请 该插件为原生开发&#xff0c;如果您想使用UTS版本可以点击这里 插件地址 安卓动态权限申请原生插件&#xff0c;支持常用的权限申请&#xff0c;支持自定义权限申请 - DC…

CleanMyMac X2024中文版好不好用?有哪些特点

CleanMyMac X您的 Mac。极速如新。点按一下&#xff0c;即可优化调整整个 Mac畅享智能扫描 — 这款超级简单的工具用于优化您的 Mac。只需点按一下&#xff0c;即可运行所有任务&#xff0c;让您的 Mac 保持干净、快速并得到最佳防护。CleanMyMac 是一款功能强大的 Mac 清理程序…

【网络安全】Suspicious DNS Query(可疑的DNS查询)

文章目录 名词解释可能原因分析Action sinkhole在防火墙里面查询Suspicious DNS Query预防Suspicious DNS查询带来的风险推荐阅读 名词解释 “Suspicious DNS Query&#xff08;可疑的DNS查询&#xff09;”通常指的是在网络中检测到的可能具有风险或异常行为的DNS&#xff08…

【数据结构】栈和队列超详解!(Stack Queue)

文章目录 前言一、栈1、栈的基本概念2、栈的实现&#xff08;数组实现&#xff09;3、栈的基本操作3.1 栈的结构设计3.2 栈常见的基本函数接口 4、栈的实现4.1 初始化栈4.2 栈的销毁4.3 入栈4.4 出栈4.5 判空4.6 长度4.7 获取栈顶元素 完整代码Stack.hStack.cTest.c 二、队列1、…

点对点协议PPP

目录 一. PPP协议的特点1.1 PPP 协议应满足的需求1.2 PPP 协议的组成 二. PPP协议的帧格式2.1 PPP协议的透明传输2.1.1 同步传输2.1.2 异步传输 三. PPP协议的工作状态 \quad 一. PPP协议的特点 \quad \quad 用户到ISP的链路使用PPP协议 \quad \quad 1.1 PPP 协议应满足的需求 …

面试题:HashMap 为什么不能一边遍历一遍删除

文章目录 前言foreach 循环&#xff1f;HashMap 遍历集合并对集合元素进行 remove、put、add1、现象为什么会抛出这个异常呢&#xff1f;2、细究底层原理 前言 上面出现这样的原因是在使用 foreach 对 HashMap 进行遍历时&#xff0c;同时进行 put 赋值操作会有问题&#xff0c…

6-6 堆排序 分数 10

typedef int Datatype; typedef struct {Datatype* elem; int Length; }SqList; typedef SqList HeapType; void swap(int* a, int* b) {int tmp *a;*a *b;*b tmp; } //建大堆 //m: 结点个数 s: 待下调父结点下标 void HeapAdjust(HeapType H, int s, int m) {int child …

骨传导耳机和开放式耳机哪个对听力的损伤小一些?

先说结论&#xff0c;骨传导耳机对听力的损伤更小&#xff0c;并且更值得入手。 其实骨传导耳机也算开放式耳机的一种&#xff0c;开放式耳机中又包括了骨传导耳机和气传导耳机&#xff0c;与其说骨传导耳机和入耳式耳机&#xff0c;不如说是骨传导耳机和气传导耳机&#xff0…