赞
踩
左图:奥巴马总统的形象,使用CLM检测。 中心:Delaunay三角剖分。 右:对应的Voronoi图。
这篇文章将帮助我们了解Delaunay三角剖分和Voronoi图。
什么是Delaunay 三角剖分?
给定平面中的一组点,三角测量指的是将平面细分为三角形,将点作为顶点。在图1中,我们在左图像上看到一组界标,以及在中间图像中的三角测量。一组点可以有许多可能的三角剖分,但Delaunay三角剖分出众,因为它有一些不错的属性。在Delaunay三角剖分中,选择三角形使得没有点在任何三角形的外接圆内。图2示出了4点A,B,C和D的Delaunay三角剖分。在顶部图像中,为了使三角剖分是有效的Delaunay三角剖分,点C应该在三角形ABD的外接圆外,并且点A应该在三角形BCD的外接圆。
Delaunay三角形的一个有趣的属性是它不喜欢“瘦”三角形(即具有一个大角度的三角形)。
图2显示了当移动点时,三角形如何改变以选择“胖”三角形。在顶部图像中,点B和D的x坐标在x = 1.5,在底部图像中,它们向右移动到x = 1.75。在顶部图像中,角度ABC和ABD大,并且Delaunay三角剖分在B和D之间创建边缘,将两个大角度分割成更小的角度ABD,ADB,CDB和CBD。另一方面,在底部图像中,角度BCD太大,并且Delaunay三角剖分产生边缘AC以划分大角度。
有很多算法来找到一组点的Delaunay三角剖分。最明显的(但不是最有效的)一个是从任何三角形开始,并检查任何三角形的外接圆包含另一个点。如果是,翻转边缘(如图2所示),并继续,直到没有三角形的外接圆包含一个点。
关于Delaunay三角剖分的任何讨论必须包括Voronoi图,因为一组点的Voronoi图是对其Delaunay三角剖分的数学对。
什么是Voronoi 图?
给定平面中的一组点,Voronoi图分割该空间使得边界线与相邻点等距。 图3示出了从显示为黑点的点计算的Voronoi图的示例。 你会注意到每条边界线都穿过两点的中心。 如果你连接在邻近的Voronoi地区的点,你得到德劳内三角!
Delaunay三角剖分和Voronoi图在更多的方面是相关的。
利用OPENCV实现剖分
给定一组点,您可以使用Subdiv2D类计算Delaunay三角剖分或Voronoi图。 这里是步骤。
首先收集点数据:
- vector<Point2f> points;
- // This is how you can add one point.
- points.push_back(Point2f(x,y));
使用矩形(rect)定义要分区的空间。 如果您在上一步中定义的点在图像上定义,则此矩形可以是(0,0,width,height)。 否则,您可以选择一个矩形来限制所有点。
- Mat img = imread("image.jpg");
- Size size = img.size();
- Rect rect(0, 0, size.width, size.height);
使用上一步中获取的矩形创建Subdiv2D的实例。
Subdiv2D subdiv(rect);
最终实现的效果为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。