OpenCV的Delaunay三角剖分和Voronoi图的实现

本文介绍Delaunay三角剖分与Voronoi图的基本概念及其相互关系,探讨了这两种几何结构在图像处理中的应用,并通过OpenCV实现了它们的计算。

左图:奥巴马总统的形象,使用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); 

使用subdiv.insert(point)将点插入到subdiv中。 上面的视频显示了一个三角形的动画,因为我们向点添加点。
使用subdiv.getTriangleList获取Delaunay三角形的列表。
使用subdiv.getVoronoiFacetList获取Voronoi面的列表。


最终实现的效果为:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值