课程笔记-三维点云处理02 ——Nearest Neighbor Problem

课程笔记-三维点云处理02 ——Nearest Neighbor Problem

本系列笔记是对深蓝学院所开设的课程:《三维点云处理》的笔记
课程每周更新,我也会努力将每周的知识点进行总结,并且整理成笔记发上来,欢迎各位多多交流&批评指正!!

本文主要为课程第二章的笔记!

课程链接:

三维点云处理——深蓝学院

目录

正式内容:
####################################################

最邻近问题(NN problems)

本节课主要讲最邻近问题(Nearest Neighbor Problem)
用来找一个点离他比较近的点
处理的主要方法一个是KD树,一个是八叉树,本节课主要就是讲这两个方面,但是讲这两个方面之前还会讲一下二叉树

方法概述

在这里插入图片描述
一般常见的两种方法就是K-NN 和R-NN
如上图所示 一个是根据距离排序,另一个是给定区域内搜索 是两种不同的思路

NN问题的重要性

在这里插入图片描述
对于点云处理来说,最邻近问题是一个基本且重要的问题,因为点云的特征信息就储存在点云的位置信息中,所以这个问题是非常基本的且常用的。
目前开源的库有很多,但是库里面集成的最临近算法都不够快(不知道为什么)

NN问题对于处理点云的困难点

在这里插入图片描述
主要有以下原因:

  1. 点云不像图像像素,是有规则排列的,具有无序性
  2. 点云存在在三维空间坐标中,比二维的要高,处理计算量要大一个数量级
  3. 按照网格化来划分的话,点云会存在很多空白的网格,而且处理起来效率很低
  4. 算法事实上运行起来非常大,比较吃力。
本节课结构

在这里插入图片描述

  1. 二叉树
  2. KD树
  3. 八叉树(专门为3D空间结构设计(因为2的3次方是8)) 相比于KD树更加适合三维
算法的核心思想:空间分割

在这里插入图片描述
space partition 空间分割是这三个算法的核心思想
比较直观的理解,寻找一个点的临近点时,肯定不能漫无目的的搜索,而是要首先在他的周围进行寻找。 这就是空间分割的原理

K-NN问题 :就是找他最近的K个点的意思

worst distance: 就是目前查找到的最远的点。 也就是说,如果查找的是K-NN问题的话,如果已知有K个点了,且其中最远的点的距离为x,那么这个x就是 worst distance,也就是说,不用在worst distance以外查找,只需要在这个距离里面查找就行了(因为在这个距离外面就算找到了也是没有意义的)

核心任务提炼

  1. 怎样对空间进行分割
  2. 如何去判断以及跳过搜索空间
  3. 如何去判断何时停止搜索

Binary Search Tree

认识二叉树

在这里插入图片描述
二叉树就是一个数分两个叉,跟两个数建立联系
但是这种联系是有规律的:

  1. 一个二叉树节点有且最多有两个分支

  2. 在划分分支的时候,小的放左边,大的放右边

二叉树早在计算机科学的开端就已经被提出使用了(是计算机一些很基础的数据结构)
很多算法岗在找工作的时候也会被问到 怎么搜索或遍历一个二叉树

二叉树定义

在这里插入图片描述一个二叉树由三个部分组成:左边界点 右边节点 储存值 key(储存一些比如源文件路径之类的信息)

因此在计算机里面可以对其进行一个赋值 如上图定义一个二叉树类

二叉树插入数值

在这里插入图片描述
总结起来很简单,就是从二叉树的头开始判断,如果比他小就判断左边,如果比他大就判断右边,最后填充到二叉

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Python来实现三维点云区域生长算法。以下是一个基本的示例代码: ```python import numpy as np from sklearn.neighbors import NearestNeighbors def region_growing(points, seed_index, threshold): num_points = points.shape[0] visited = np.zeros(num_points, dtype=bool) cluster = [] def region_growing_recursive(curr_index): visited[curr_index] = True cluster.append(curr_index) # Find neighboring points within the threshold curr_point = points[curr_index] distances, indices = nbrs.radius_neighbors([curr_point], threshold, return_distance=True) neighbors = indices[0] for neighbor_index in neighbors: if not visited[neighbor_index]: region_growing_recursive(neighbor_index) nbrs = NearestNeighbors(n_neighbors=1).fit(points) region_growing_recursive(seed_index) return cluster # Example usage # points: Nx3 numpy array containing the 3D coordinates of the point cloud # seed_index: Index of the seed point for region growing # threshold: Distance threshold for neighboring points to be considered part of the same region cluster = region_growing(points, seed_index, threshold) ``` 在这个示例代码中,`points` 是一个大小为 Nx3 的 numpy 数组,其中包含了点云的三维坐标。`seed_index` 是种子点的索引,它将作为算法的起始点。`threshold` 是一个阈值,用于确定哪些邻近点被认为是同一个区域的一部分。 这个实现使用了 `sklearn.neighbors.NearestNeighbors` 来查找种子点附近的邻居点。通过递归地访问每个邻居点,并将其添加到簇集合中,实现了区域生长算法。 请注意,这只是一个基本的示例代码,你可能需要根据你的具体需求进行一些修改和优化。另外,你可能还需要安装 `scikit-learn` 库来运行这段代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值