改进的DBSCAN算法,点云可变 EPS 阈值 DBSCAN 聚类(附open3d python代码)

对传统的 DBSCAN 算法进行了改进,
聚类半径随扫描距离的变化自适应地改变,
远距离障碍物 点云聚类效果得到提高。
实验结果表明,所提方法对不同距离的障碍物都
能实现良好的聚类。

对比效果图:


激光点云数据密度与扫描距离呈负相关,扫描距离越近,点云数据越稠密,
扫描距离越远,点云数据越稀疏,DBSCAN 算法对数据密度和聚类间距差较敏感,
主要依赖对 eps 距离参数的调试,在数据分布均匀时聚类效果良好,
但在数据分布不均匀时聚 类效果较差,不同的参数对最后的聚类效果有很大影响。
针对激光点云数据量大和分布不均的问题,对传统 DBSCAN 算法
改进参数输入方式。DBSCAN 算法对参数 eps 和 MinPts 非常敏感,
当点云数据分布不均匀且聚 类间距相差较大时,很难选取一个恰当的参数值
使 得在不同距离上都能实现良好聚类。


# coding:utf-8

import numpy as np


# 点云聚类变形
def vector_distance_v2(v):
    """
    把单个向量内部的每个元素两两相减,得到一个差值矩阵,矩阵是上三角和下三角刚好相反的结果
    :param v: 可以是一个一维数组,或者一个一维的列表
    :return:
    """
    if type(v) is list:
        v = np.array(v)
    # result = []
    # for i in range(len(v)):
    #     result.append(v[i] - v)  # 可以改为列表推导式
    result = [v[i] - v  for i in range(len(v))]
    return np.vstack(result)


def point_distance(points):
    """   是否可以只计算上三角或者下三角矩阵,这样计算量减少了一半&#

你可能感兴趣的:(点云处理代码合集,python,算法,聚类)