使用线(而不是点)作为输入要素来创建蒂森(Voronoi)多边形?


24

我在特定的多边形边界内有一组线要素。对于每条线,我想生成一个多边形,在该多边形内,每个可能的点比该层中的任何其他线更靠近给定的线。过去,我已经使用Delaunay三角剖分对点输入要素进行了此操作,但是如果使用线要素进行相似的处理,则无法找到它。

ETA:我想到了Geogeek的解决方案,但是在较直的部分中,输入线的顶点较少,因此产生的多边形太接近(甚至重叠)了一条本不应该的线。在这里,红线是我的输入,您可以看到顶点和从中生成的Thiessen多边形。

在此处输入图片说明

也许一种快速且(非常)肮脏的解决方案可能是将每条线转换为一组均匀间隔的点(而不是仅线的顶点),从这些点生成蒂森多边形,然后根据原始线ID分解它们。


4
包含线段和点的Voronoi图不是由“多边形”组成;相反,它们的单元格具有可以包括抛物线部分的边界 因此,创建Voronoi镶嵌的最有效,最准确的方法之一就是使用栅格表示。ESRI将此过程称为欧几里得分配
ub

Answers:


11

为了说明光栅/图像处理解决方案,我从发布的图像开始。由于蓝点,灰线,彩色区域和文本的叠加,它的质量比原始数据低得多;以及原始红线的加粗。因此,它提出了一个挑战:尽管如此,我们仍然可以高精度获得Voronoi细胞。

通过从红色通道中减去绿色,然后将最亮的部分放大并腐蚀三个像素,提取了红色线性特征的可见部分。这用作欧几里得距离计算的基础:

i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]

地势图

(此处显示的所有代码均为Mathematica8。)

识别明显的“山脊”(必须包括将两个相邻的Voronoi单元分开的所有点)并将它们与线层重新组合,便可以完成大部分工作:

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]

组合影像

红色带代表我可以保存的线条,青色带代表距离变换中的脊。(由于原始行本身的中断,仍然有很多垃圾。)这些脊需要通过进一步的扩张进行清理和封闭(两个像素可以做到),然后我们才能确定由原始线和它们之间的脊线(其中一些线需要明确地重新组合):

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]

实际上,完成的工作是识别五个定向的线性特征。我们可以看到从汇合点发出的三个独立的线性特征。每个都有两个方面。我认为两个最右边的功能的右边是相同的,但是在其他方面却加以区分,给出了五个功能。彩色区域显示了这五个功能的Voronoi图。

结果

基于区分三个线性特征的图层的欧几里得分配命令(本例中我未提供该命令)不会区分每个线性特征的不同面,因此它将结合最左边一行的绿色和橙色区域; 它将最右边的蓝绿色特征一分为二;并将这些拼块与另一侧相应的米色和品红色特征组合在一起。

显然,这种栅格方法具有构造任意特征的Voronoi镶嵌的功能,这些点包括点​​,线性块,甚至多边形,而不管其形状如何,并且可以区分线性要素的边。


1
mathematica.stackexchange.com/questions/20696/…中说明了类似的解决方案。
ub

5

我认为您可以:

  • 将线顶点转换为点(line_points)。
  • 使用点(line_points)制作voronoi多边形。
  • 使用从线图层保存的id属性或通过与线图层的空间连接来溶解生成的多边形。

我希望我真的了解您的问题,如果不能,您可以提供一张图纸来进一步说明您的需求。


2
我认为您理解了这一点,并且确实找到了解决方案,但是您遇到了线较少顶点的问题。我将用截图更新我的问题。
Dan C

3
如果沿线使点更密集,则可以正常工作。尽管我会怀疑基于栅格的方法(如问题评论中提到的那样)会比这有效得多。
安迪W
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.