【Matlab案例】去除冗余路径点 Dougla-Peucker算法 (含matlab程序)

1 简介

在一段曲线中,存在着许多的特征点,但是这些特征点分布不均匀,有的地方非常密集,有的地方又很松散。如下图所示,是一个牙齿模型的.stl文件的某一截面,可以看到这个截面的上下部分的特征点十分密集,中间位置十分松散,当我们需要提取它的轮廓进行拟合时不是很方便,所以我们需要去除冗余的一些特征点。
在这里插入图片描述

2 算法实现思路

采用Dougla-Peucker算法 算法具体思路如下

  1. 设置残差ϵ;(也就是去除冗余点的精度,ϵ越小精度越高,去除的冗余点的数量也越少;)
  2. 用一条直线连接路径的首尾(图中P1,P8)
  3. 计算首尾点之间的所有路径点到这条直线的距离,并找到最大距离max以及对应的路径点(图中P5);
  4. 如果max<ϵ,则说明这个首尾P1 P8可以代表这段曲线的特征,去除首尾点之间的所有路径点,这段曲线处理完毕;
  5. 如果max>ϵ,则说明这个首尾P1 P8并不能完全体现这段曲线的特征,需要细分;在max对应的路径点P5处将当前路径一分为二,回到步骤2,重新进行;
  6. 直到所有的路径线处理完毕,就此完成冗余路径点地去除。

在这里插入图片描述

3 matlab程序

function result = DouglasPeuckerAO(Points,epsilon)
%Points  路径数组 N×2
%epsilon 残差
%作者 天才小傲傲
    p1 = Points(1,:);
    p2 = Points(end,:);
    %判断数组首尾点是否相同 相同则尾点向前取一个 首尾点不能相同
    if p1==p2
        p2=Points(end-1,:);
    end
        
    distanceList = zeros(length(Points),1);
    for i = 2:length(Points)-1
        pointTemp = Points(i,:);
        distanceTemp = pointLineDistance(p1,p2,pointTemp);
        distanceList(i) = distanceTemp;
    end
    [MAX,index] = max(distanceList);

    if MAX < epsilon
        result = [p1;p2];
    else
        recResult1 = DouglasPeuckerAO(Points(1:index,:),epsilon);
        recResult2 = DouglasPeuckerAO(Points(index:end,:),epsilon);
        result = [recResult1(1:length(recResult1)-1,:); 
                  recResult2(1:length(recResult2),:)];
    end

end

function result=pointLineDistance(Q1,Q2,P)
%采用的3维空间向量叉积的方法求点到直线的最短距离 如果是2维向量,需要补全第三维度
if  length(Q1)==2
Q1(end+1)=0;
Q2(end+1)=0;
P(end+1)=0;
end
result=norm(cross(Q2-Q1,P-Q1))/norm(Q2-Q1);
end

5 效果展示

5.1 ϵ取0.1

在这里插入图片描述

5.1 ϵ取0.01

在这里插入图片描述
如果对你有帮助的话,请点赞哦哈哈

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
Douglas-Peucker算法是一种用于曲线抽稀的算法,其难点主要涉及以下几个方面: 1. 抽稀误差的选择:Douglas-Peucker算法通过计算每个点到折线的垂直距离来确定是否保留该点。这个过程中需要选择合适的抽稀误差阈值,即判断点是否保留的阈值。选择过小的阈值会导致折线过于密集,保留过多的点;而选择过大的阈值会导致折线过于稀疏,可能会丢失重要的细节。 2. 折线拟合的准确性:Douglas-Peucker算法通过不断递归地进行抽稀操作,直到满足抽稀误差阈值。在每次递归中,需要拟合一条直线来代表原始曲线上的点。这个过程中,选择合适的直线拟合方法和准确的拟合结果是一个难点。 3. 算法复杂度和效率:Douglas-Peucker算法在每次递归中需要计算每个点到折线的垂直距离,这个计算量与点的数量成正比。当处理大规模数据时,算法的复杂度和效率成为一个挑战,需要考虑如何优化算法以提高处理速度。 4. 曲线的形状和特征:Douglas-Peucker算法对于不同形状和特征的曲线可能表现出不同的效果。例如,对于弯曲的曲线或存在局部细节的曲线,算法可能会有一定的局限性,需要考虑如何调整参数或采用其他方法来处理这些情况。 综上所述,Douglas-Peucker算法在曲线抽稀中存在一些难点,需要仔细选择抽稀误差、拟合准确性、算法效率以及适应不同曲线特征等方面的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天才小小傲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值