为了说明光栅/图像处理解决方案,我从发布的图像开始。由于蓝点,灰线,彩色区域和文本的叠加,它的质量比原始数据低得多;以及原始红线的加粗。因此,它提出了一个挑战:尽管如此,我们仍然可以高精度获得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镶嵌的功能,这些点包括点,线性块,甚至多边形,而不管其形状如何,并且可以区分线性要素的边。