道格拉斯-普克算法(DP)轮廓点精简(Python)

embedded/2025/1/21 12:27:00/

1、介绍

     道格拉斯-普克算法由David H. Douglas和Thomas K. Peucker于1973年提出,主要用于简化曲线或折线。而实际中,激光点云的边缘点非常粗糙,如果直接将点进行连接,锯齿问题严重。经过DP算法处理后,数据显示会比较光滑,符合认知。

2、原理介绍

      对每一条曲线的首末点虚连一条直线,求所有点与直线的距离,并找出最大距离值dmax,用dmax与限差D相比。若dmax<D,这条曲线上的中间点全部舍去;若dmax ≥D,保留dmax对应的坐标点,并以该点为界,把曲线分为两部分,对这两部分重复使用该方法。

算法的详细步骤如下:

     (1) 在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离,如图(1)。

    (2) 选其最大者与阈值相比较,若大于阈值,则离该直线距离最大的点保留,否则将直线两端点间各点全部舍去,如图(2),第4点保留。

    (3) 依据所保留的点,将已知曲线分成两部分处理,重复第1、2步操作,迭代操作,即仍选距离最大者与阈值比较,依次取舍,直到无点可舍去,最后得到满足给定精度限差的曲线点坐标,如图(3)、   (4)依次保留第6点、第7点,舍去其他点,即完成线的化简。

3、算法测试

3.1 源代码与测试数据说明

       使用python语言,在pycharm平台上按照上述原理对其实现,源代码下载链接:https://download.csdn.net/download/qq_32867925/90283351

包括源代码与三块测试数据。

3.2 使用说明

     首先说明的是,提取的边缘点必须要有序结构,即将点依次连接起来,是一个闭合的结构,如下图所示。对于无序轮廓点,本程序不适合。若建构简单点云,可参考之前博客点云轮廓点排序——旋转角法(python pycharm)_不规则点云排序-CSDN博客,对轮廓点进行排序。

使用时,需要修改( filepath = "D:\\长方形.txt")这一块路径,修改成自己电脑上存储路径即可。

# 生成示例点云数据
def generate_example_points():boundpts = []filepath = "D:\\长方形.txt"with open(filepath, 'r') as pointsFile:for line in pointsFile:x, y, z, r, g, b = map(float, line.split())if r == 255 and g == 0 and b == 0:boundpts.append([x, y])boundpts = np.array(boundpts)return boundpts

这一块为随机生成的100个数据,使用DP算法对其进行精简。

# 生成示例点云数据
def generate_example_points():"""生成一个示例点云"""x = np.linspace(0, 10, 100)y = np.sin(x) + np.random.normal(0, 0.1, size=len(x))  # 添加噪声return np.column_stack((x, y))

3.3 测试一:随机数精简

     如下是随机生成100个数据,使用DP算法精简结果。使用不同距离阈值约束,精简效果不相同。其中绿色多边形为精简后的直线,红色点为关键点。

3.4 测试二:多边形精简

        多边形点进行精简,精简效果理想。其中绿色多边形为精简后的直线,红色点为关键点。

3.5 测试三:规则矩形

        对于规则矩形,精简后为矩形,效果理想。其中绿色多边形为精简后的直线,红色点为关键点。


http://www.ppmy.cn/embedded/155768.html

相关文章

FPGA工程师成长四阶段

朋友&#xff0c;你有入行三年、五年、十年的职业规划吗&#xff1f;你知道你所做的岗位未来该如何成长吗&#xff1f; FPGA行业的发展近几年是蓬勃发展&#xff0c;有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前&#xff0c;都会抱着满腹对职业发…

pyspark连接clickhouse数据库的方式(其它数据库同样适用)

目录 一、背景简记二、pyspark连接clickhouse方式记录三、结语参考学习博文 一、背景简记 实际工作中&#xff0c;大部分所用的数据存储地址都是在数据库中&#xff0c;如我司现在常用的数据库是clickhouse&#xff0c;相关数据的统计分析都在此上操作。如果想用pyspark连接cl…

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

【玩转全栈】----Django制作部门管理页面

大致效果 我先给个大致效果&#xff0c;基本融合了Django、Bootstrap、css、html等等。 基于Django的部门管理系统 BootStrap BootStrap简介 Bootstrap 是一个由 Twitter 团队开发的开源前端框架&#xff0c;专注于帮助开发者快速构建响应式和现代化的网页。它基于 HTML、CSS …

Linux测试处理fps为30、1920*1080、一分钟的视频性能

前置条件 模拟fps为30、1920*1080、一分钟的视频 项目CMakeLists.txt cmake_minimum_required(VERSION 3.30) project(testOpenGl)set(CMAKE_CXX_STANDARD 11)add_executable(testOpenGl main.cpptestOpenCl.cpptestOpenCl.hTestCpp.cppTestCpp.hTestCppThread.cppTestCppTh…

uniapp 自定义日历组件 源码

效果图&#xff1a; 一、问题1&#xff1a;每个月的1号&#xff0c;样式上的起始位置 样式上来说实际困难点在于每个月的1号对应的位置&#xff1a; 解决方式就是判断1号是周几&#xff0c;就在前面放几个空盒子&#xff0c; 二、问题2 : 状态样式控制 定义一个结构来存储…

vue使用教程

‌Vue.js主要基于MVVM模式&#xff08;Model-View-ViewModel&#xff09;和观察者模式‌。MVVM模式是Vue.js的核心设计模式&#xff0c;它将应用程序的数据&#xff08;Model&#xff09;、用户界面&#xff08;View&#xff09;和业务逻辑&#xff08;ViewModel&#xff09;分…

使用 Parcel 和 NPM 脚本进行打包

使用 Parcel 和 NPM 脚本进行打包 Parcel Parcel 是一个零配置的网页应用程序打包工具&#xff0c;主要用于快速构建现代 JavaScript 应用。 我们可以使用npm直接安装它 npm install --save-dev parcel //这将把 Parcel 添加到 devDependencies 中&#xff0c;表明它是一个…