我在理解JFA时遇到了麻烦。据我了解的算法,它遍历每个像素log(n)次(无论是否是种子),并在$(x + i,y + j)$中查看该像素的邻居,其中$ i ,j \ in \ {-step \ length,0,step \ length \} $。

在这些邻居中找到种子(即彩色像素)时,它会检查找到的邻居种子与当前像素之间的距离是否小于当前像素已存储的距离(前一轮)。如果是这样,当前像素将被找到的种子的颜色和新的距离覆盖,因此将用作下一轮的输入种子。

因此,我尝试理解作者自己制作的一些幻灯片中的示例,但在第2步长时失败了,尤其是使用了最下面的三个红色种子:



例如,为什么在第2步长的情况下,蓝色圆圈的种子为什么仍保持红色,却找到了两个距离较小的绿色种子(以我的理解,圆圈红色像素存储了4,并且到顶部的距离最下面的绿色邻居是2)?或为什么另一个蓝色圆圈像素变成红色,尽管其(x + 2,y)邻居是绿色的像素,其距离小于(x + 2,y + 2)红色邻居?

我还在纸上画了另一个例子,但是当步长为1时,该算法会发现多个等距离的邻居种子,那么它将如何决定呢?我们还可以想到一个更简单的示例,例如:



在这种情况下,根据算法应该对角像素是多少?我怎么了?

评论

也许是因为实现修改了运行LtR的位置?这意味着上面的像素发生了变化,一个像素插入了左侧,但没有插入右侧。

好的,但是进行适当的修改意味着,看着第二张图片,最下面的圆圈空白像素变为红色。然后,它旁边的绿色种子也应该获取该信息并变成红色,但仍保持绿色...

有点相关,但绝对不是重复的(免责声明:我写了一个答案)

#1 楼

我认为术语有些混乱。我的理解是,只有第1步之前的最初有色点称为种子。

也许这也有助于阐明算法。当颜色为$ s $的点$ p $找到颜色为$ s'$的邻居$ q $时,他会将距离$ d(p,s)$与$ d(p,s')$(不是$ d(p,q)$)决定他的新颜色。这就是每个像素都至关重要地保持其种子颜色的$(x,y)$坐标(在本文中,他们使用r,g通道进行此操作)而不仅仅是距离的原因。在每个步骤中,此数据还将传递到邻居。

因此,在该示例中,从步长4到步长2,红色方块(仍为红色的带圆圈的圆圈)看到绿色方块,绿色方块告诉红色方块绿色种子的价格为$ (8,6)$。然后,红场计算出他到绿场的距离为$ \ sqrt {2 ^ 2 + 4 ^ 2} $,该值大于到红场的距离($ 4 $),因此仍为红色。

评论


$ \ begingroup $
就是这样!因此,当像素找到有色邻居时,它会计算该像素与初始种子(从邻居知道其位置)之间的距离。我不清楚这是彩色像素还是种子之间的区别。谢谢,您帮了我大忙!但是仍然存在一个问题:4x4示例中的对角像素如何?他们到两个初始种子的距离相同...
$ \ endgroup $
–阿联酋
17 Mar 10 '17 at 21:23



$ \ begingroup $
现在很高兴! voronoi图的定义中的对角线是模棱两可的:(在第一页上)论文提到等距离种子,他们任意选择种子。如果您一贯选择一种颜色而不是另一种颜色,也许看起来会更好,我不知道!
$ \ endgroup $
– StinkySkunk
17 Mar 10 '17 at 21:36