Douglas-Peucker算法的Matlab实现

2023-10-27

代码。

%% Douglas-Peucker 道格拉斯-普克算法

function curve = dpEdgeContour(pnts)
clc;
clear;
 
A = readmatrix('EdgeContour1.xls','Sheet','1');%输入数据
x = A(:,1)'; %输入的点横坐标
y = A(:,2)'; %输入的点纵坐标
             %也可以输入一个函数(y = f(x)还有其定义域,即x范围)

scatter(x,y,'.');
num = size(x,2); %返回x的列数

 

pnts = y;

figure; plot( x, pnts,'-.'); title('pnts');
 
head = [x(1), pnts(1)] ;
tail = [x(end), pnts(end)] ;
  
%距离阈值
dist_th = 0.1; 
 
hold on;
max_dist = 0;
max_dist_i = 0;
%把起始点和终止点加进去
curve = [head; tail];
pnt_index = [1, num];
 
while(1)         
    %目前抽稀后的曲线上的点数
    curve_num = size(curve,1);
   
    %标记是否添加了新点,若有,表明还要继续处理
    add_new_pnt = 0; 
    %  对区间头尾连线,然后计算各点到这条直线的距离 
    for nx = 1:curve_num-1
        cur_pnt = curve(nx,:);
        %下一个抽稀了的曲线上的点
        next_pnt = curve(nx+1,:);
        pnt_d = next_pnt - cur_pnt ;
         
        th = atan2(pnt_d(2), pnt_d(1));
        angle = th*180/pi;
        %直线方程
        % y = kx + b
        k = tan(th);
        b = cur_pnt(2) - k*cur_pnt(1);
        k2 = k*k;
        deno = sqrt(1 + k *k) ;
 
         max_dist = 0;
         pnt_index(nx);
         pnt_index(nx+1);
         
        %对这一区间的点计算到直线的距离
        for i= pnt_index(nx) : pnt_index(nx+1)
            dist = abs(pnts(i) - k*x(i) - b)/deno ;
 
            if(dist> max_dist)      
                max_dist = dist;
                max_dist_i = i;        
            end 
        end 
        max_dist;
        max_dist_i; 
 
        far_pnt = [x(max_dist_i), pnts(max_dist_i)];
 
        %最远的点加进去
        if(max_dist > dist_th)
             curve = [curve(1:nx,:); far_pnt; curve(nx+1:end,:)]; 
             pnt_index = [pnt_index(1:nx), max_dist_i, pnt_index(nx+1:end)];
             %标记添加了新点,可能还要继续处理
             add_new_pnt = 1;        
        end 
    end 
    close all ;
    figure; plot( x, pnts,'-.'); title('pnts');
    hold on;
    plot(curve(:,1), curve(:,2), '-g*');
    drawnow;
     
     %如果各点到直线距离都没有超过阈值则退出
     %处理完毕了,ok了,退出
     if(0 == add_new_pnt)
        break;
     end      
end 

% ans为最后取的点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Douglas-Peucker算法的Matlab实现 的相关文章

  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • 直方图均衡结果

    I am trying to code histogram equalization by my self but the results are different from the built in function in matlab
  • 将 Matlab 数组移植到 C/C++

    我正在将 matlab 程序移植到 C C 我有几个问题 但最重要的问题之一是 Matlab 将任何维度的数组都视为相同 假设我们有一个这样的函数 function result f A B C result A 2 B C A B and
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • Matlab:2行10列的子图

    如何在 matlab 中绘制 20 幅图像 2 行 10 列 我知道我必须使用 子图 功能 但我对给出的参数感到困惑 我尝试给予 子图 2 10 行索引 列索引 但它似乎不起作用 请帮忙 的前两个参数subplot函数分别给出图中子图的总行
  • 轴标注问题

    通过运行我编写的以下 matlab 函数 可以互换图中的 x 轴和 y 轴 谁能告诉我问题出在哪里或者帮我解决它吗 预先感谢您的任何帮助 function axislabeling n x 1 1 n y 1 1 n z zeros n n

随机推荐

  • C++---异常处理

    异常处理 异常处理 try语句块和throw表达式 异常的抛出和捕获 异常的抛出和匹配原则 异常安全 异常规范 标准异常 异常处理 异常是指存在于运行时的反常行为 这些行为超出了函数正常功能的范围 当程序的某部分检测到一个他无法处理的问题时
  • AcWing 3719. 畅通工程(并查集)(天津大学考研上机)

    输入样例 4 2 1 3 4 3 输出样例 1 include
  • 装jdk

    首先从官网上下载jdk安装包 如果后缀 i586 则是32位的 大部分电脑不要选 我们要选后缀X64的 这才是64位电脑应该选的 双击jdk 一路next 装好之后 还会弹出让你安装jre 因为jdk自带jre 所以这个jre装不装都行 装
  • 【经典】SpringBoot常用基本配置

    SpringBoot支持properties文件和yml文件 两个文件同时存在 优先以properties为准 通过properties文件配置 1 基本设置 server port 80 debug true server servlet
  • 超频到3200最佳时序_如何榨取更多CPU性能:CPU BIOS超频简单教程

    你为什么要超频 以前超频是可以换来性能的大幅度提升 但是近些年来超频带来的收益其实已经大幅降低 因为不论Intel还是AMD都已经把CPU的频率拉到接近极限 留给玩家的可超频空间其实不多 性能提升已经远没有以前明显 但是依然有不少人追求超频
  • STM32单片机初学者常用函数--I2C配置

    I2C的配置必须要按照其时序逻辑 首先先来了解I2C常见的几种工作情况 A 主机向从机发送数据 数据传输方向在整个传输过程中不变 B 主机在第一个字节后 立即从从机读数据 C 在传输过程中 当需要改变传输方向时 起始信号和从机地址都被重复产
  • MATLAB卡尔曼数字滤波惯性测量单元数据(行驶距离和速度估计)

    惯性测量单元 IMU 是惯性导航系统 INS 的一个组件 惯性导航系统是一种导航设备 用于在没有外部参考的情况下计算移动物体的位置 速度和方向 该项目开发了一种方法 用于消除加速度计测量中的偏差 并估计移动物体的行进距离和速度 估计是使用卡
  • linux 服务状态命令,Linux 查看服务列表,查看服务状态

    使用service查看命令说明 ubuntu VM 0 17 ubuntu service Usage service status all service name command full restart ubuntu VM 0 17
  • ElasticSearch聚合查询返回结果buckets取值

    ElasticSearch聚合查询返回结果buckets取值 1 聚合查询如下 size 0 query bool must wildcard county company keyword wildcard 3 boost 1
  • Stm32-SysTick详解

    写在最前 本文是个人学习Stm32时所做笔记 没有写过C51 但学校学过 微机原理 但没学好 实验套件是正点原子Stm32zet6精英板 参考资料为正点原子所提供 本文所涉及代码均使用固件库 本文供自己日后需要时复习所用 同时希望可以给有需
  • 若依框架注册新用户,且赋角色

    若依框架注册新用户 且赋角色 若依官网 1 如何开启注册功能 开启前端注册开关 不管使用下那种方式开启注册功能 首先 先在前端里面views下找到login vue 将启注册开关先给设置为true 保存重启即可 如下图 2 两种开启新增用户
  • 【每日算法 && 数据结构(C++)】—— 06

    文章目录 01 题目描述 02 解题思路 03 代码片段 Time waits for no one cherish every moment 岁月不居 时光荏苒 珍惜每分每秒 01 题目描述 给你若干个有序链表 请将他们合并为一个有序的链
  • TP-LINK 路由器设置内网穿透

    TP LINK 路由器设置内网穿透 开发中经常遇到调用第三方软件回调调试的情况 例如微信开发 支付回调等测试 用内网穿透是一种简单的方式也是偷懒的方式 以TP LINK路由器为例实现内网穿透 登录路由器 2 找到路由器虚拟服务器 添加映射
  • tsconfig之forceConsistentCasingInFileNames属性

    文章来源 Wflynn forceConsistentCasingInFileNames 作用 是否强制代码中使用的模块文件名必须和文件系统中的文件名保持大小写一致 示例 假设我们有一个文件名为 FileManager ts 我们从这个文件
  • ECharts合并地图上的区域

    对于某些特定需求 官方下载的地图数据可能并不能完全满足 例如 要求显示中国地图 但需要将山东江苏和浙江这3个省合并起来 显示 东部区域 其他省份不变 于是就需要对官方提供的地图数据进行修改 一个思路是借助第三方工具 生成新区域的轮廓点 然后
  • 刷脸支付打造数字小镇应用的全新探索

    刷脸支付打造数字小镇是特色小镇数字化应用的一项全新探索 主要是依托一部手机游云南平台 在精准治理 惠民服务 生态宜居等领域进行数字化应用 丽江大研古城数字小镇启动建设以来已经取得初步成效 1月16日 从云南省发展和改革委员会举行的1月定时定
  • 28、宏任务与微任务

    原理图 setImmediate 也是宏任务 在 Node 环境下 微任务还有 process nextTick JS 中用来存储待执行回调函数的队列包含 2 个不同特定的列队 宏列队 用来保存待执行的宏任务 回调 比如 定时器回调 DOM
  • VMware Workstation 15虚拟机使用教程

    VMware Workstation 15虚拟机使用教程 前言 一 在虚拟机中安装win7 1 1新建虚拟机一个win7虚拟机 1 2插入虚拟机光盘 即指定ISO镜像文件 1 3设置虚拟机的BIOS 光驱为第一启动 1 4开始在虚拟机中安装
  • 数据库中的字段名与实体类中的属性名不能一一对应时的三种处理方式

    当查询结果的列名和java对象的属性名对应不上时需要采用下列方式进行处理 第一种方式 在查询语句中使用关键字 as 给列起别名 第二种方式 使用resultMap结果映射 第三种方式 开启驼峰命名自动映射 配置settings 实体类Car
  • Douglas-Peucker算法的Matlab实现

    代码 Douglas Peucker 道格拉斯 普克算法 function curve dpEdgeContour pnts clc clear A readmatrix EdgeContour1 xls Sheet 1 输入数据 x A