【Python基础】—— scipy.spatial.KDTree、matplotlib.pyplot、imageio

scipy.spatial参考博客:Python点云处理——建立KDtree

1 KDtree算法原理

KDtree构建出了一种类似于二叉树的树形数据存储结构,每一层都对应原始数据中相应的维度,以K层为一个循环,因此被称为KDtree。

每一层的左右子树的划分依据则是一个人为指定的超平面,该平面对应的坐标为根节点,小于的放在左子树,大于的放在右子树,一直不停的分割下去,将所有维度遍历一遍之后,再从第一个维度重新选择一个超平面开始分割,直至将左右子树分割到都只剩一个叶子节点为止。这样就将所有的数据都在KDtree上唯一确定了位置,以便进行最近邻搜索半径搜索等操作。

2 计算过程

给出一组三维点云数据(1,1,1),(2,2,2),(1,3,1),(3,4,2),(4,5,6):

  1. 首先,x坐标划分,以2为分界,(2,2,2)为根节点,小于2的在左子树:(1,1,1),(1,3,1),大于2的在右子树:(3,4,2),(4,5,6)
  2. 然后以y坐标划分,前一层的左子树以1为分界,(1,1,1)在根节点,(1,3,1)在右子树;前一层右子树以4为分界,(3,4,2)在根节点,(4,5,6)在右子树,这样就将所有点云数据唯一地存储在了KDtree中

3 代码实现

import numpy as np
from scipy.spatial import KDTreepoint= np.random.rand(1000,7)
tree = KDTree(point[:, 0:3])

先随机生成一个7维的点云数据(xyz坐标,xyz法向量,标签),然后调用Scipy中的scipy.spatial.KDTree库函数。与Open3D相比,该库函数可以生成任意维度的KDtree,而不是只能输入三维点云,在处理带有法向量和标签等其他维度的点云数据时具有天然的优势。

4 应用

生成KDtree后,最常见的应用就是对其进行各种搜索。

import numpy as np
from scipy.spatial import KDTreepoint= np.random.rand(1000,7)
tree = KDTree(point[:, 0:3])for i in range(0,len(point)):neighbors = tree.query_ball_point(point[i,0:3], 0.1,workers=-1,return_length=True)

这句代码调用了Scipy的KDtree模块中的“球查询”,即半径查找功能,可以查找点云中指定点在半径0.1内的所有近邻点,workers=-1代表启用多线程,poinr[i,0:3]代表只对前三列数据进行查找,若不指定return_lengeth参数,默认返回这些近邻点的索引。若指定其为True,则返回这些点的个数,从而便于进行滤波算法的构建。

最近邻:

一个是tree = spatial.KDTree(mesh.points)输入点云
一个是nearest = tree.query(pos[i],k=2) 寻找最近的两个点。因为第一个点必定是自己所以找俩。返回的是两个np array。第一个是所有的最小距离,第二个是所有的最近点index

matplotlib.pyplot参考博客:Python 数据分析(二):Matplotlib 绘图
只记录学习过程中常用的

1 简单使用

from matplotlib import pyplot as pltx = range(1, 7)
y = [13, 15, 14, 16, 15, 17]
plt.title('折线图')
plt.xlabel('x 轴')
plt.ylabel('y 轴')
plt.plot(x, y)
plt.show()

在这里插入图片描述
改变折线的样式、颜色等

from matplotlib import pyplot as pltx = range(1, 7)
y = [13, 15, 14, 16, 15, 17]
'''
figsize:设置图片的宽、高,单位为英寸
dpi:设置分辨率
'''
plt.figure(figsize=(8, 5), dpi=80)
plt.title('折线图')
plt.xlabel('x 轴')
plt.ylabel('y 轴')
'''
color:颜色
linewidth:线的宽度
marker:折点样式
linestyle:线的样式,主要包括:'-'、'--'、'-.'、':'
'''
plt.plot(x, y, color='red', marker='o', linewidth='1', linestyle='--')
# 保存
plt.savefig('test.png')
plt.show()

在这里插入图片描述

2 多线

from matplotlib import pyplot as pltx = range(15, 25)
y1 = [50, 55, 58, 65, 70, 68, 70, 72, 75, 70]
y2 = [52, 53, 60, 63, 65, 68, 75, 80, 85, 72]
plt.figure(figsize=(10, 6), dpi=80)
plt.title('体重年龄折线图')
plt.xlabel('年龄(岁)')
plt.ylabel('体重(kg)')
plt.plot(x, y1, color='red', label='张三')
plt.plot(x, y2, color='blue', label='李四')
# 添加网格,alpha 为透明度
plt.grid(alpha=0.5)
# 添加图例
plt.legend(loc='upper right')
plt.show()

在这里插入图片描述

3 子图

from matplotlib import pyplot as plt
import numpy as npa = np.arange(1, 30)
# 划分子图
fig, axs = plt.subplots(2, 2)
# 绘制子图
axs1 = axs[0, 0]
axs2 = axs[0, 1]
axs3 = axs[1, 0]
axs4 = axs[1, 1]
axs1.plot(a, a)
axs2.plot(a, np.sin(a))
axs3.plot(a, np.log(a))
axs4.plot(a, a ** 2)
plt.show()

在这里插入图片描述
imageio库参考博客:
【python】利用imageio库制作动态图
Python快速生成gif图
将多张图片合成GIF,需要的 python 库为 imageio,使用 imageio 可方便的使多张图片生成 gif 图。首先我们需要一个列表存储图片路径,此处为了方便演示,直接使用列表作为存储,并且创建一个变量为图片的保存路径:

import os
import imageioframes = []
for image_name in os.listdir("./image"): # 读取image下的图片名称image_name = "D:\随笔\测试\image\\" + image_name # 绝对路径frames.append(imageio.imread(image_name))imageio.mimsave("./res.gif", frames, 'GIF', duration=0.1) # 保存在当前文件夹
# 参数:duration=0.1,间隔时间

合成gif图

import imageio
def compose_gif():img_paths = ["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg","img/5.jpg","img/6.jpg"]gif_images = []for path in img_paths:gif_images.append(imageio.imread(path))imageio.mimsave("test.gif",gif_images,fps=1)

通过fps参数可以控制合成gif图片播放图片的速度和视频的播放帧率是一样的,fps参数越大播放的速率越大,fps越小播放的速度越慢

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

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

相关文章

视频自定义字幕,中英文,彩色的,你也可以,不会不知道吧

前言 关于【SSD系列】: 前端一些有意思的内容,旨在3-10分钟里,有所获,又不为所累。 字幕,大家见过吧,其实你也可以,真的可以,真的真的可以。不难,不难,真的…

如何评估一个RAG(检索增强生成)系统

本文首发自博客文章 如何评估一个RAG(检索增强生成)系统 RAG 概念最初来源于 2020 年 Facebook 的一篇论文,这是 Facebook 博客对论文内容的进一步解释 👉《检索增强生成:简化智能自然语言处理模型的创建》。大家都知…

【C++对于C语言的扩充】函数重载、引用以及内联函数

文章目录 🚀前言🚀函数重载注意:✈️为什么C可以实现函数重载,而C语言却不行呢? 🚀引用✈️引用的特性✈️C中为什么要引入引用✈️引用与指针的区别 🚀内联函数✈️内联函数特性 🚀…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程,不做其他的深入的讲解 Github和Gitlab的操作类似,只不过Github叫PR,GitLab叫MR,基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ(一)comm 文章目录 C项目 -- 负载均衡OJ(一)comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ,实现类似…

研发岗-统信UOS系统配置npm git等前端常用配置

第一步 获取root权限 配置环境等都需要用到root权限,所以我们先获取到root权限,方便下面的操作 下载软件 在UOS应用商店下载的所需应用 版本都比较低 安装node 官网下载了【arm64】的包,解压到指定文件夹,设置链接&#xff0…

苹果电脑启动磁盘是什么意思 苹果电脑磁盘清理软件 mac找不到启动磁盘 启动磁盘没有足够的空间来进行分区

当你一早打开苹果电脑,结果系统突然提示: “启动磁盘已满,需要删除部分文件”。你会怎么办?如果你认为单纯靠清理废纸篓或者删除大型文件就能释放你的启动磁盘上的空间,那就大错特错了。其实苹果启动磁盘的清理技巧有很…

STM32之HAL开发——CubeMX配置串行Flash文件系统

配置流程 在开始配置FATFS前,需要提前配置好RCC的时钟,以及时钟的频率,另外还要配置好Debug选项(选择串行) 选项介绍 文件系统适用于SD卡,Disk磁盘等,需要我们将对应的驱动打开才可以使用。 …

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下(三处修改) import { createApp } from vue //…

SimpleImputer缺失数据处理报错解决方案

作者Toby,来源公众号:Python风控建模,SimpleImputer缺失数据处理报错解决方案 今天有学员反馈缺失值代码报错,由于sklearn缺失值处理的包升级,下面把官网最新的缺失值处理代码奉上。 参考https://scikit-learn.org/st…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况:明明知道睡眠很重要,但却总是有意无意地熬夜。 比如: 给自己排了太多的学习和工作量,一不小心就到了凌晨一两点; 总觉得过去的一天什么都没干,宁愿在网上闲逛,也不…

低代码开发平台权威推荐:创新开发、领跑市场!

Gartner是低代码领域的一家权威机构,该机构常常通过"魔力象限"的研究方法,评选全球范围内IT细分领域的产品,来帮助决策者提供重要的咨询建议。本文盘点了Gartner机构推荐的6款低代码平台:Zoho Creator、Mendix、Oracle、…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢? 1.2. 市场主流 JVM 分析? 1.3. 为什么要学习 JVM? 1.4. 字节码底层是如何执行呢? 如何理解 JIT 呢? 为什么 JVM 中解释执行与编译执行的并存(混合模式&…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

🔥个人主页:Forcible Bug Maker 🔥专栏:C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容:类的6个默认成员函数中的拷贝构造函数…

el-drawer二次封装进行可拖拽

1.想要的效果 鼠标放到上面出现箭头显示可拖拽得图标 2.代码实现 2.1封装成自定义指令 // drawerDragDirective.js // 定义指令 const drawerDragDirective {// 指令绑定时的处理函数bind(el, ) {const minWidth 300;const dragDom el.querySelector(.el-drawer);// 创…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么?二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送🚪:hardhat入门 与 hardhat进阶 在之前的文章中,我们已经探讨了使用Har…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 目录 定义 特点 使用场景 优缺点 (1) 优点…

故障转移-redis

4.4.故障转移 集群初识状态是这样的: 其中7001、7002、7003都是master,我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢? 直接停止一个redis实例,例如7002: redis-cli -p 7002 sh…

保持微软Microsoft Teams始终在线的方案

保持微软Microsoft Teams始终在线的方案 背景方案 背景 目前使用微软Teams办公的小伙伴很多,但是长时间不操作电脑就被自动设置成离线状态。对于在电脑前学习书本或者在思考问题的小伙伴就显得不太友好,因为即使我们不操作电脑我们也时刻在电脑前&#…

定时器产生延时停止

1,需求: 当按下按钮SB1,输出信号为0N,指示灯点亮;按下按钮SB2,经过10s的延时后,指示灯熄灭 2,关闭使用定时的常闭触电