当前位置: 首页 > news >正文

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

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 测试三:规则矩形

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

相关文章:

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

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

WPF如何跨线程更新界面

WPF如何跨线程更新界面 在WPF中&#xff0c;类似于WinForms&#xff0c;UI控件只能在UI线程&#xff08;即主线程&#xff09;上进行更新。WPF通过Dispatcher机制提供了跨线程更新UI的方式。由于WPF的界面基于Dispatcher线程模型&#xff0c;当你在非UI线程&#xff08;例如后…...

Ubuntu 24.04 LTS 服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问Ubuntu安装Tailscale&am…...

ROS机器人学习和研究的势-道-术-转型和变革的长期主义习惯

知易行难。说说容易做到难。 例如&#xff0c;不受成败评价影响&#xff0c;坚持做一件事情10年以上&#xff0c;专注事情本身。 机器人专业不合格且失败讲师如何让内心保持充盈的正能量&#xff08;节选&#xff09;-CSDN博客 时间积累 注册20年。 创作历程10年。 创作10年…...

Linux 管道操作

Linux 管道操作 在 Linux 中&#xff0c;管道&#xff08;Pipe&#xff09;是一个非常强大且常用的功能&#xff0c;它允许将一个命令的输出直接传递给另一个命令作为输入&#xff0c;从而能够高效地处理和分析数据。管道在多个命令之间建立数据流&#xff0c;减少了文件的读写…...

【Python】深入探讨Python中的单例模式:元类与装饰器实现方式分析与代码示例

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&…...

imbinarize函数用法详解与示例

一、函数概述 众所周知&#xff0c;im2bw函数可以将灰度图像转换为二值图像。但MATLAB中还有一个imbinarize函数可以将灰度图像转换为二值图像。imbinarize函数是MATLAB图像处理工具箱中用于将灰度图像或体数据二值化的工具。它可以通过全局或自适应阈值方法将灰度图像转换为二…...

【NextJS】PostgreSQL 遇上 Prisma ORM

NextJS 数据库 之 遇上Prisma ORM 前言一、环境要求二、概念介绍1、Prisma Schema Language&#xff08;PSL&#xff09; 结构描述语言1.1 概念1.2 组成1.2.1 Data Source 数据源1.2.2 Generators 生成器1.2.3 Data Model Definition 数据模型定义字段(数据)类型和约束关系&…...

ASP.NET Core - 配置系统之配置提供程序

ASP.NET Core - 配置系统之配置提供程序 3. 配置提供程序3.1 文件配置提供程序3.1.1 JSON配置提供程序3.1.2 XML配置提供程序3.1.3 INI配置提供程序 3.2 环境变量配置提供程序3.3 命令行配置提供程序3.4 内存配置提供程序3.5 配置加载顺序 3.6 默认配置来源 3. 配置提供程序 前…...

【LeetCode: 215. 数组中的第K个最大元素 + 快速选择排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08…...

JavaScript网页设计案例-JavaScript实现数据脱敏的几种解决方式

数据脱敏是指对数据进行处理&#xff0c;使其在不改变原始数据含义的前提下&#xff0c;降低数据泄露的风险&#xff0c;保护用户隐私。 案例&#xff1a;JavaScript实现数据脱敏 1. 掩码脱敏 掩码脱敏是通过替换或隐藏数据中的部分字符来达到脱敏的效果。常见的掩码方式包括…...

第12篇:从入门到精通:掌握python高级函数与装饰器

第12篇&#xff1a;高级函数与装饰器 内容简介 本篇文章将深入探讨Python中的高级函数与装饰器。您将学习什么是高阶函数&#xff0c;掌握常用的高阶函数如map、filter、reduce的使用方法&#xff1b;理解闭包的概念及其应用&#xff1b;深入了解装饰器的定义与使用&#xff…...

审计文件标识作为水印打印在pdf页面边角

目录 说明 说明 将审计文件的所需要贴的编码直接作为水印贴在页面四个角落&#xff0c;节省辨别时间 我曾经写过一个给pdf页面四个角落加上文件名水印的python脚本&#xff0c;现在需要加一个图形界面进一步加强其实用性。首先通过路径浏览指定文件路径&#xff0c;先检测该路…...

leetcode416.分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...

使用docker-compose安装ELK(elasticsearch,logstash,kibana)并简单使用

首先服务器上需要安装docker已经docker-compose&#xff0c;如果没有&#xff0c;可以参考我之前写的文章进行安装。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下载并启动elk容器 先创建一个网关&#xff0c;让所有的容器共用此网…...

深度学习中超参数

深度学习中的超参数(hyperparameters)是决定网络结构的变量(例如隐藏层数量)和决定网络训练方式的变量(例如学习率)。超参数的选择会显著影响训练模型所需的时间&#xff0c;也会影响模型的性能。超参数是在训练开始之前设置的&#xff0c;而不是从数据中学习的参数。超参数是模…...

[JavaScript] 运算符详解

文章目录 算术运算符&#xff08;Arithmetic Operators&#xff09;注意事项&#xff1a; 比较运算符&#xff08;Comparison Operators&#xff09;注意事项&#xff1a; 逻辑运算符&#xff08;Logical Operators&#xff09;短路运算&#xff1a;逻辑运算符的返回值&#xf…...

Hooks 使用规则

Hooks 使用规则 命名规则 Hook 必须 useXxx 格式来命名。 PS&#xff1a;这种命名规则也很易读&#xff0c;简单粗暴 调用位置 Hook 或自定义 Hook &#xff0c;只能在两个地方被调用 组件内部其他 Hook 内部 组件外部&#xff0c;或一个普通函数中&#xff0c;不能调用…...

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...