GPS抽稀之道格拉斯-普克(Douglas-Peuker)算法

道格拉斯-普克算法是我们常用的一种轨迹点的抽稀算法,抽稀出来的点可以尽可能的维持原先轨迹点的大体轮廓,剔除一些非必要的点。

道格拉斯-普克原理

假设在平面坐标系上有一条由N个坐标点组成的曲线,已设定一个阈值epsilon。

(1)首先,将起始点与结束点用直线连接, 再找出到该直线的距离最大,同时又大于阈值epsilon的点并记录下该点的位置(这里暂且称其为最大阈值点),如图所示:

(2)接着,以该点为分界点,将整条曲线分割成两段(这里暂且称之为左曲线和右曲线),将这两段曲线想象成独立的曲线然后重复操作(1),找出两边的最大阈值点,如图所示:

(3)最后,重复操作(2)(1)直至再也找不到最大阈值点为止,然后将所有最大阈值点按顺序连接起来便可以得到一条更简化的,更平滑的,与原曲线十分近似的曲线,如图所示:

具体思路

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

Matlab代码实现:

%% 主函数入口(在该函数界面下点击运行实验)
clc;clear;close all;
points(:,1) = 5:5:300; %x值为1到60
points(:,2) = 10 + 3 * rand(60,1); %y为10加一个0到1的随机数
points(25:35,2) = 5 + 3 * rand(11,1); %其中第25到第35个点低一点
% =========================================================================
[r,c] = size(points);
A(1,1) = points(1,1); A(1,2) = points(1,2);
A(2,1) = points(r,1); A(2,2) = points(r,2);
Threshold = 3; %给定阈值
[A] = ARecursionFun(points,A,Threshold); % 递归
A = sortrows(A,1);
figure(1); %创建图层
plot(points(:,1),points(:,2),'-k'); %绘制原始折线
hold on; %保留当前图层的要素
plot(A(:,1),A(:,2),'*-r'); %在原图基础上绘制特征点
title(['阈值为:',num2str(Threshold)]);
% 输入两个相邻特征点之间的扫描线pointsTab,特征点表A(A是折线首尾两个端点)
% 输出补充新发现的特征点后的特征点表A
% 函数名称为ARecursionFun(一个递归函数)
function [A] = ARecursionFun(pointsTab,A,Threshold)
[r,~] = size(pointsTab); % 获取扫描线片段上点的个数
if r > 2 % 如果这条扫描线片段上点数大于2则执行操作Q1 = [pointsTab(1,1);pointsTab(1,2)]; % 起点坐标对的列向量表示(为了便于点到直线距离计算的表示方法)Q2 = [pointsTab(r,1);pointsTab(r,2)]; % 终点坐标对的列向量表示(作用同上)% 遍历这个扫描线,依次计算每个点到扫描线起点终点连线的距离==================for i = 1:1:rP = [pointsTab(i,1);pointsTab(i,2)]; % 当前点坐标的列向量表示d(i,1) = abs(det([Q2-Q1,P-Q1]))/norm(Q2-Q1); % 计算点到直线的距离end% 计算完毕,每个点到直线的距离存入列向量d中================================if max(d) > Threshold % 如果距离列向量中最大值大于阈值则进行下述操作ind = find(all(repmat(max(d),size(d,1),1)==d,2)); % 获取列向量中最大值对应的点的序号[rA,~] = size(A); % 获取当前特征点表A已存点的个数A(rA+1,1) = pointsTab(ind,1); % 将这个点作为特征点存储起来(x坐标)A(rA+1,2) = pointsTab(ind,2); % 将这个点作为特征点存储起来(y坐标)pointsTabb = pointsTab(1:ind,:); % 以刚才存储的特征点为界限,起点到该点建立新的片段扫描线A = ARecursionFun(pointsTabb,A,Threshold); % 函数自身调用进行递归,进一步获取片段内的特征点pointsTabe = pointsTab(ind:r,:); % 以刚才存储的特征点为界限,该点到终点建立新的片段扫描线A = ARecursionFun(pointsTabe,A,Threshold); % 函数自身调用进行递归,进一步获取片段内的特征点end
end

2021-03-20 GPS抽稀之道格拉斯-普克(Douglas-Peuker)算法相关推荐

  1. GPS定位轨迹抽稀之道格拉斯-普克(Douglas-Peuker)算法详解

    目录 1. 抽稀 2. 原理 3. 具体思路 4. 代码示例 道格拉斯-普克算法是我们常用的一种轨迹点的抽稀算法,抽稀出来的点可以尽可能的维持原先轨迹点的大体轮廓,剔除一些非必要的点 2. 原理 假设 ...

  2. 道格拉斯-普克 Douglas-Peuker(DP算法) python java实现

    1.道格拉斯-普克抽稀算法说明 道格拉斯-普克抽稀算法是用来对大量冗余的图形数据点进行压缩以提取必要的数据点. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并 ...

  3. 道格拉斯-普克 Douglas-Peuker(DP算法)

    道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点. 该算法实现抽稀的过程是: 1)对曲线的首末点虚连一条直线,求曲线上所有点与直线的距离,并找出最大距离值dmax,用dm ...

  4. (2)【路径插值与抽稀篇】路径插值与抽稀方向--线性/双线性插值、步距抽稀、等长抽稀、垂直限制抽稀、道格拉斯-普克(Douglas-Peuker)DPR抽稀、去除共线点抽稀等

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.路径曲线插值.拟合和逼近的区别 1.拟合 2.插值 3.逼近 二 ...

  5. 道格拉斯—普克(Douglas一Peukcer)算法

    Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是目前公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...

  6. 【Java代码】道格拉斯-普克 Douglas-Peucker 抽稀算法(算法流程图解+使用JDK8方法实现+详细注解源码)

    1.算法说明   道格拉斯-普克算法 Douglas-Peucker Algorithm 简称 D-P 算法,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法,是将曲线近似表示为一系列点 ...

  7. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  8. 道格拉斯-普克算法(经纬度或坐标点抽稀)

    起因 最近在做一个车联网项目,有一个场景是车辆定时上报当前所在经纬度等位置信息上报给平台,平台通过web页面在高德地图上展示车辆行驶路径. 由于车辆上报规则是每隔4s上报一次,一个小时也就是900个点 ...

  9. 道格拉斯-普克 抽稀算法

    道格拉斯-普克抽稀算法,是用来对大量冗余的图形数据点进行压缩以提取必要的数据点.该算法实现抽稀的过程是:先将一条曲线首尾点虚连一条直线,求其余各点到该直线的距离,取其最大者与规定的临界值相比较,若小于 ...

最新文章

  1. 125KHz 100cm ID 读卡电路_7 个别出心裁的树莓派优质项目集锦(完整代码+电路设计资料)...
  2. 【研究院】滴滴研究院,都在做什么
  3. Oracle Sequence
  4. android里的oneshot模式,android – 使用ONE_SHOT标志等待意图
  5. 一篇文章带你弄懂大数据!
  6. 巩固shell基础知识
  7. java的字符串池_翻译-Java字符串池
  8. MongoDB简单使用 —— 安装
  9. 金针工具箱5.0安装版(多功能软件快捷工具)hh852作品
  10. php判断电脑还是手机浏览器打开网页,PHP函数判断电脑端浏览器访问访问还是手机端浏览器访问...
  11. 线性回归--假设检验(F统计量、P-value)
  12. U盘重装win10系统专业版——启动盘制作
  13. edge浏览器internet选项的设置方法
  14. Android使用SubsamplingScaleImageView完美查看超大图片
  15. 20170918-20170924C#工作学习周总结
  16. iOS MVVM + RxSwift 关键词zip 的调用时机问题
  17. 国开大学 C语言程序 形考任务4,[国家开放大学] 国开电大人体生理学形考任务4...
  18. Android中实现截图的几种方式
  19. 在 SAP BTP 上体验 SAP HANA Cloud 试用版本
  20. java 反射 field.set_java从入门到精髓 - 反射Field

热门文章

  1. Linux疑难杂症解决方案100篇(二)-SHELL编程函数的定义及调用
  2. shell编程 case语句
  3. Numpy中的array
  4. 【问底】严澜:数据挖掘入门——分词
  5. Tomcat 处理 HTTP 请求源码分析(下)【转】
  6. kafka源码分析之二客户端分析
  7. spring与memcache的整合
  8. 项目经理原则(转载)
  9. Serverless应用场景
  10. Python做文本挖掘的情感极性分析