Douglas Peucker算法的C#实现
一、算法原理
Douglas-Peucker算法
在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度
上保持原有的形状。
经典的Douglas-Peucker算法描述如下:
(1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦;
(2)得到曲线上离该直线段距离最大的点C,计算其与AB的距离D;
(3)比较该距离与预先给定的阈值threshold的大小,如果小于threshold,则该直线段作为曲线的近似,该段曲线处理完毕。
(4)如果距离大于阈值,则用C将曲线分为两段AC和BC,并分别对两段取信进行1~3的处理。
(5)当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。
二、算法C#实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication2 7 { 8 public struct cvPoint 9 { 10 public int X; 11 public int Y; 12 public cvPoint(int x, int y) 13 { 14 X = x; 15 Y = y; 16 } 17 } 18 class Program 19 { 20 static void Main(string[] args) 21 { 22 var points = new List<cvPoint>(); 23 points.Add(new cvPoint(1, 1)); 24 points.Add(new cvPoint(2, 2)); 25 points.Add(new cvPoint(3, 3)); 26 points.Add(new cvPoint(4, 3)); 27 points.Add(new cvPoint(5, 3)); 28 points.Add(new cvPoint(6, 3)); 29 points.Add(new cvPoint(5, 3)); 30 points.Add(new cvPoint(6, 3)); 31 points.Add(new cvPoint(7, 3)); 32 points.Add(new cvPoint(8, 3)); 33 var epsilon = 0.8d; 34 var filteredPoints = new List<cvPoint>(); 35 DouglasPeucker(points, epsilon, ref filteredPoints); 36 Console.WriteLine("Filtered points:"); 37 foreach (var f in filteredPoints) 38 { 39 Console.WriteLine(string.Format("{0},{1}", f.X, f.Y)); 40 } 41 Console.ReadKey(); 42 } 43 private static double distanceToSegment(cvPoint p, cvPoint start, cvPoint end) 44 { 45 var m1 = ((double)(end.Y - start.Y)) / ((double)(end.X - start.X)); 46 var c1 = start.Y - m1 * start.X; 47 var interPointX = 0d; 48 var interPointY = 0d; 49 if (m1 == 0) 50 { 51 interPointX = p.X; 52 interPointY = c1; 53 54 } 55 else 56 { 57 var m2 = -1 / m1; 58 var c2 = p.Y - m2 * p.X; 59 interPointX = (c1 - c2) / (m2 - m1); 60 interPointY = m2 * interPointX + c2; 61 } 62 return Math.Sqrt(Math.Pow(p.X - interPointX, 2) + Math.Pow(p.Y - interPointY, 2)); 63 } 64 65 private static void DouglasPeucker(IList<cvPoint> PointList, double epsilon, ref List<cvPoint> filteredPoints) 66 { 67 var dmax = 0d; 68 int index = 0; 69 int length = PointList.Count; 70 for (int i = 1; i < length - 1; i++) 71 { 72 var d = distanceToSegment(PointList[i], PointList[0], PointList[length - 1]); 73 Console.WriteLine(string.Format("{0}.distence:{1}", i, d)); 74 if (d > dmax) 75 { 76 index = i; 77 dmax = d; 78 } 79 } 80 Console.WriteLine(string.Format("dMax:{0}", dmax)); 81 // If max distance is greater than epsilon, recursively simplify 82 if (dmax > epsilon) 83 { 84 filteredPoints.Add(PointList[0]); 85 filteredPoints.Add(PointList[index]); 86 filteredPoints.Add(PointList[length - 1]); 87 DouglasPeucker(PointList.Take(index + 1).ToList(), epsilon, ref filteredPoints); 88 DouglasPeucker(PointList.Skip(index + 1).Take(PointList.Count - index - 1).ToList(), epsilon, ref filteredPoints); 89 } 90 } 91 } 92 }
三、算法验证
近似前:
近似后的线段:
本文地址: http://www.cnblogs.com/deepleo/p/Douglas-Peucker.html
参考:http://www.codeproject.com/Articles/18936/A-C-Implementation-of-Douglas-Peucker-Line-Approxi
转载于:https://www.cnblogs.com/deepleo/p/Douglas-Peucker.html
Douglas Peucker算法的C#实现相关推荐
- 道格拉斯-普克算法(Douglas–Peucker algorithm)
道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法.该算法的原 ...
- 【图像处理】道格拉斯-普克算法(曲线的折线段逼近)
目录 一.提要 二.为什么要道格拉斯-普克算法 三.算法描述 四.代码实现 4.1 Python代码1 4.2 python代码2 五.结论 该文的应用见文章:[Halcon算子]get_contou ...
- 数据挖掘技术在出行体验上的应用!
桔妹导读:每天滴滴都会为上千万人提供出行服务,在这一过程中积累了海量轨迹数据.这些轨迹数据来自于公共服务,本文介绍如何利用这些数据回馈大众,改善出行体验. 1. 背景 首先简要介绍一下什么是数据挖掘 ...
- Python OpenCV3 计算机视觉秘籍:1~5
原文:OpenCV 3 Computer Vision with Python Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采 ...
- opencv findcourter之后的轮廓点拟合
1.Douglas-Peucker(DP)算法 -- 多边形逼近 //! approximates contour or a curve using Douglas-Peucker algorithm ...
- 【论文翻译】《A Neural Representation of Sketch Drawings》
论文标题:<A Neural Representation of Sketch Drawings>草图的神经表示 写在前面:深度学习入门生,水平有限,其中错误的地方请指正. 摘要: 我们提 ...
- 170316.道格拉斯-普克算法
道格拉斯-普克算法 道格拉斯-普克算法 (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是乌尔斯·拉默(Urs Ramer)于19 ...
- opencv 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸包convexHull.道格拉斯-普克算法Douglas-Peucker algorithm.approxPloyDP 函数 道格拉斯-普克算法(Douglas–Peucker algorithm) ...
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- matlab Douglas-Peucker 道格拉斯-普克算法
c道格拉斯-普克算法 [1] (Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算 ...
最新文章
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示中位数、分位数)实战
- 安装jdk后出现bash: ./java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
- php算法入门,a011.PHP实战:加密解密,简单算法入门
- 暑期训练日志----2018.8.9
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
- MVC中modelstate的使用
- 长时间工作意味着什么
- 在线读取office 文件(Word excel 等)
- 基于php的物流系统设计与实现
- 智慧路灯综合解决方案
- [业务流程图]与[数据流程图]的比较
- SCRM升级--企业微信数字营销解决方案
- 记一次从某多多上买的斐讯N1黑盒的电视盒子刷机经历
- 什么是根证书和中间证书(中级证书)?
- Apache OpenNLP介绍(一)
- 【ChatGPT4】王老师零基础《NLP》(自然语言处理)第一课
- Visual Studio 2013 下载地址 V12各种版本官方下载网址
- 中景园LCD显示主函数
- COALESCE()函数 一个非常有用的函数
- vue中如何利用js如何检测网络状况,监听网络状态