线简化算法:Visvalingam vs Douglas-Peucker

时间:2016-02-09 11:31:56

标签: algorithm polygon simplification

我正在尝试实施一个siplification算法。我找到的主要2种算法是Ramer-Douglas-Peucker:https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm  和Visvalingam-Whyatt:https://bost.ocks.org/mike/simplify/ 目前我在matlab上运行了一些模拟,以便更好地确定我需要的答案。

该算法的主要目标是在地图中同化多边形。 我的输入是一个多边形\折线和一个错误epsilon的阈值。

我需要将simlified多边形尽可能接近原始多边形, 我没有要求保留点数的要求。

我在比较这两种算法时遇到困难,因为: R-D-P的epsilon是距离,而V-W的epsilon是一个区域。 我需要帮助了解如何比较两种算法。 这可以给我少点保持在门槛之内?

1 个答案:

答案 0 :(得分:6)

  

我需要将simlified多边形尽可能接近   原来,我没有要求保留点数的要求。

DP方法将为您提供更好的可感知的适合更少数量的点 - 因为它的控制参数,即距离容差是根据您的要求捕获的尽可能接近'。

话虽如此,整个多边形或点云相对于像素尺寸的比例将对较小的图像产生更大的影响。下面的练习可以给你一种“感觉”。这两种算法的表现如何。

以下是我在Visvalingam-Whyatt和Ramer-Douglas-Peucker之间进行的一些比较,其中包含最初约为100x100位图的几个轮廓。图像是轮廓上~10倍变焦的屏幕截图。

(您可能希望下载图像以了解性能上的差异)

Visvalingam-Whyatt方法结果:礼貌Zach's implementation on github移植到opencv数据类型。 VSV simplification - with 0.1(white), 0.5(red), 1(magenta), 2(cyan) distance tolerances

VSV简化 - 0.55(白色),0.4(红色),0.25(品红色),0.15(青色)百分比公差

VSV - 点减少t:%容差。这直接决定了n = t * orig / 100。 n是最终点数

orig 88: [n=47 for t=0.55], [n=34 for t=0.4], [n=20 for t=0.25], [n=12 for t=0.15]
orig 133: [n=72 for t=0.55], [n=52 for t=0.4], [n=32 for t=0.25], [n=18 for t=0.15]
orig 118: [n=63 for t=0.55], [n=46 for t=0.4], [n=28 for t=0.25], [n=16 for t=0.15]
orig 107: [n=57 for t=0.55], [n=41 for t=0.4], [n=25 for t=0.25], [n=15 for t=0.15]
orig 107: [n=57 for t=0.55], [n=41 for t=0.4], [n=25 for t=0.25], [n=15 for t=0.15]
orig 268: [n=146 for t=0.55], [n=106 for t=0.4], [n=65 for t=0.25], [n=39 for t=0.15]
orig 158: [n=85 for t=0.55], [n=62 for t=0.4], [n=38 for t=0.25], [n=22 for t=0.15]
orig 158: [n=85 for t=0.55], [n=62 for t=0.4], [n=38 for t=0.25], [n=22 for t=0.15]
orig 109: [n=58 for t=0.55], [n=42 for t=0.4], [n=26 for t=0.25], [n=15 for t=0.15]
orig 192: [n=104 for t=0.55], [n=75 for t=0.4], [n=46 for t=0.25], [n=27 for t=0.15]
orig 132: [n=71 for t=0.55], [n=51 for t=0.4], [n=31 for t=0.25], [n=18 for t=0.15]
orig 89: [n=47 for t=0.55], [n=34 for t=0.4], [n=21 for t=0.25], [n=12 for t=0.15]
orig 110: [n=59 for t=0.55], [n=42 for t=0.4], [n=26 for t=0.25], [n=15 for t=0.15]
orig 40: [n=20 for t=0.55], [n=14 for t=0.4], [n=8 for t=0.25], [n=4 for t=0.15]


使用openCV aboutPolyDP

DP方法结果

DP simplification - with 0.1(white), 0.5(red), 1(magenta), 2(cyan) distance tolerances

Douglas-Peucker - 点数减少t:像素距离公差=>与n无直接关系 - 最终点数

orig 88: [n=33 for t=0.1], [n=29 for t=0.5], [n=8 for t=1], [n=6 for t=2]
orig 133: [n=57 for t=0.1], [n=45 for t=0.5], [n=12 for t=1], [n=7 for t=2]
orig 118: [n=50 for t=0.1], [n=40 for t=0.5], [n=15 for t=1], [n=8 for t=2]
orig 107: [n=47 for t=0.1], [n=35 for t=0.5], [n=11 for t=1], [n=6 for t=2]
orig 107: [n=30 for t=0.1], [n=24 for t=0.5], [n=8 for t=1], [n=6 for t=2]
orig 268: [n=126 for t=0.1], [n=110 for t=0.5], [n=32 for t=1], [n=23 for t=2]
orig 158: [n=80 for t=0.1], [n=62 for t=0.5], [n=17 for t=1], [n=11 for t=2]
orig 158: [n=66 for t=0.1], [n=52 for t=0.5], [n=16 for t=1], [n=9 for t=2]
orig 109: [n=50 for t=0.1], [n=38 for t=0.5], [n=12 for t=1], [n=9 for t=2]
orig 192: [n=74 for t=0.1], [n=64 for t=0.5], [n=18 for t=1], [n=15 for t=2]
orig 132: [n=58 for t=0.1], [n=45 for t=0.5], [n=14 for t=1], [n=11 for t=2]
orig 89: [n=37 for t=0.1], [n=31 for t=0.5], [n=7 for t=1], [n=6 for t=2]
orig 110: [n=42 for t=0.1], [n=36 for t=0.5], [n=9 for t=1], [n=7 for t=2]
orig 40: [n=18 for t=0.1], [n=15 for t=0.5], [n=9 for t=1], [n=3 for t=2]

<小时/> 摘要:

  • 这两种方法都会优雅地降级。
  • VSV允许您指定近似点的数量(在此实现中)
  • 此实现中的VSV允许您一次性选择多个近似多边形。
  • 即使对于大曲率部分,VSV仍保留很多像素级凸度变化 - 在某些情况下这可能是不合需要的。
  • DP更好地跟随凸起并更多地消除变形,但牺牲了“紧密度”。
  • 因此,DP为相同的容差提供了更少的分数 - 无论如何,这两种方法之间难以比较
  • DP可以更好地感受公差作为线性距离规范。

对于我的应用,我更喜欢VWV在此实现中提供的控制,而不是DP方法的可能效率。

但总的来说,我觉得openCVs的DP实现让人感觉更顺畅。

虽然我对VSV性能的结论仅基于Zach的实现,但我怀疑其他实现是否会给出特征上不同的多边形子集。

[UPDATE1]以下是最坏情况的比较。 DP在视觉上更容易接受。

enter image description here