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 + 5fig = 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.99for 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,ba = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1# 算出内点数目total_inlier = 0for index in range(SIZE + SIZE_N): # SIZE * 2 is because add 2 times noise of SIZEy_estimate = a * RANDOM_X[index] + bif abs(y_estimate - RANDOM_Y[index]) < sigma:total_inlier = total_inlier + 1# record these points that between +-sigmarandom_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_inlierbest_a = abest_b = b# update the latest better pointsrandom_x2b = np.array(pretotal) # 散点图的横轴。random_y2b = np.array(pretotal) # 散点图的纵轴。random_x2b = random_x2random_y2b = random_y2SIZE2 = 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,ba2 = -1 / ab2 = y_12 - (a2 * x_12)# 算出内点数目total_inlier2 = 0for index in range(SIZE2):    # SIZE * 2 is because add 2 times noise of SIZEy_estimate2 = a2 * RANDOM_XX[index] + b2if abs(y_estimate2 - RANDOM_YY[index]) < sigma2:total_inlier2 = total_inlier2 + 1# record these points that between +-sigmarandom_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_inlier2best_a2 = a2best_b2 = b2# update the latest better pointsrandom_x22b = np.array(pretotal2) # 散点图的横轴。random_y22b = np.array(pretotal2) # 散点图的纵轴。random_x22b = random_x22random_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( ) 函数教程与实例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Jmeter】Jmeter基础7-Jmeter元件介绍之后置处理器

后置处理器主要用于处理请求之后的操作&#xff0c;通常用来提取接口返回数据 2.7.1、JSON JMESPath Extractor 作用&#xff1a;可以通过JmesPath语法提取所需要的值使用场景&#xff1a;取样器返回格式为jsonJmesPath语法&#xff1a;参考https://jmespath.org/tutorial.htm…

怎么让mac右上角的时间不显示

时间成了影响工作效率和心态的一个东西&#xff0c;当我看不见时间的时候我是听命于我的平静而稳定的内心的&#xff0c;当时间时刻在我的眼前晃动的时候&#xff0c;我是慌乱而浮躁的&#xff0c;所以我决定在我工作的时候我不需要时间&#xff0c;我要听命于自己的状态&#…

2023自动化测试框架的设计原则你都知道吗?快来看!

1.代码规范 测试框架随着业务推进&#xff0c;必然会涉及代码的二次开发&#xff0c;所以代码编写应符合通用规范&#xff0c;代码命名符合业界标准&#xff0c;并且代码层次清晰。特别在大型项目、多人协作型项目中&#xff0c;如果代码没有良好的规范&#xff0c;那么整个框架…

自动化测试 (二) Web自动化测试原理

目前市面上有很多Web UI自动化测试框架&#xff0c;比如WatiN, Selinimu,WebDriver&#xff0c;还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件&#xff0c;模拟用户输入&#xff0c;点击等操作&#xff0c;实现Web自动化测试。其实这些工具的原理都一样&#xf…

现代雷达车载应用——第2章 汽车雷达系统原理 2.3节 信号模型

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.3 信号模型 雷达的发射机通常发出精心设计和定义明确的信号。然而&#xff0c;接收到的返回信号是多个分量的叠加&#xff0c;包括目标的反射、杂波…

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…

819. 最常见的单词

819. 最常见的单词 Java&#xff1a;split() 过滤 class Solution {public String mostCommonWord(String paragraph, String[] banned) {String s paragraph.replaceAll("\\p{Punct}", " "); // 去除所有标点符号String arr[] s.split(" "…

Google视频广告的格式

Google是全球最大的搜索引擎和在线广告平台之一&#xff0c;也提供了广告服务&#xff0c;包括在其视频平台上展示视频广告。Google视频广告是一种强大的营销工具&#xff0c;可以帮助企业将品牌推广到更广泛的受众中。 Google视频广告的格式可以分为以下几种&#xff1a; 1、…

通俗易懂:插入排序算法全解析(C++)

插入排序算法是一种简单直观的排序算法&#xff0c;它的原理就像我们玩扑克牌时整理手中的牌一样。下面我将用通俗易懂的方式来解释插入排序算法的工作原理。 假设我们手上有一副无序的扑克牌&#xff0c;我们的目标是将它们从小到大排列起来。插入排序算法的思想是&#xff0…

vue整个页面可以拖拽导入文件

效果图 原理与源码 我们这里的思路是用ant组件库的upload组件&#xff0c;就是如下这个 用这个包裹住所有页面&#xff0c;你可以是包裹住App.vue&#xff0c;或者是你的homepage。但是这个涉及到一个问题&#xff0c;就是我们现在确实是可以拖拽导进来文件了&#xff0c;但是…

2.两数相加

借文引流&#xff1a;五点钟科技_大道至简系列,机器学习算法系列,学习经验分享-CSDN博客 欢迎大家阅览我的其它专栏。 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数…

台式扫描电镜与落地式扫描电镜详细对比

随着材料科学和微纳技术的快速发展&#xff0c;扫描电子显微镜已成为研究微观结构的一种重要工具。根据外形体积的不同&#xff0c;扫描电镜可以分为两大类:落地式扫描电镜和台式扫描电镜。本文将从探测器、易操作性、安装环境和价格等多个方面对两者进行比较。 一、发展历史 …

迎接更高效的数据安全合规与风险评估,美创科技DCAS正式商用发布!

数据安全合规与风险评估&#xff0c;是清晰数据安全合规与风险差距&#xff0c;实现可落地数据安全建设和持续改进的关键一环。然而实施起来&#xff0c;你的团队是否面临着这些烦恼&#xff1a; 数据安全合规要求繁多&#xff0c;难以全面掌握&#xff1f; 复杂评估流程带来效…

Unity | Shader基础知识(第四集:Shader结构体)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、结构体的需求 1 数据的接入 2 开始写结构体 三、unity封装好的结构体 1 unity封装好了很多结构体 2 如何使用封装好的结构体 四、下集预告 一、本节介绍 1 上集回顾 上一集&#xff0c;我们做了一个可以改变颜色的案例…

Java stream 进阶版

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

火狐浏览器怎么设置网络代理?代理起到了哪些作用

火狐浏览器是一款流行的网页浏览器&#xff0c;它支持多种网络代理设置。设置网络代理可以帮助用户访问某些网站或提高网络访问速度。但是&#xff0c;使用代理IP时需要注意一些事项&#xff0c;以确保安全和正常使用。 以下是在火狐浏览器中设置网络代理的步骤&#xff1a; 1.…

ubuntu20.04在noetic下编译orbslam2

ubuntu20.04在noetic下编译orbslam2 参考链接1&#xff1a;https://blog.csdn.net/qq_58869016/article/details/128660588 参考链接2&#xff1a;https://blog.csdn.net/dong123456789e/article/details/129693837 在noetic下的安装环境 1.库安装 sudo apt-get update sudo …

UDP特性之广播

UDP特性之广播 1. 广播的特点2. 设置广播属性3. 广播通信流程4. 通信代码总结 1. 广播的特点 广播的UDP的特性之一&#xff0c;通过广播可以向子网中多台计算机发送消息&#xff0c;并且子网中所有的计算机都可以接收到发送方发送的消息&#xff0c;每个广播消息都包含一个特殊…

《Linux从练气到飞升》No.28 Linux中的线程同步

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

陪玩系统圈子系统:打破孤单,寻找游戏共伴!APP小程序H5三端源码交付,支持二开!喜欢软件开发的朋友可以一起交流!

在如今快节奏的生活中&#xff0c;游戏作为一种娱乐方式&#xff0c;早已融入了人们的生活&#xff0c;成为许多人放松心情、释放压力的方式之一。然而&#xff0c;与此同时&#xff0c;游戏中的孤独感也成为一些玩家所面临的问题。为了解决这个问题&#xff0c;陪玩系统圈子系…