图像的点到边缘的最短距离

时间:2012-12-04 18:31:28

标签: canvas shortest-path

这可能在其他地方得到解决,但我找不到任何内容。我试图找到图像上任意点和最近的透明像素之间的最短距离,更加强调速度而不是精度。

目前我所做的是每0.1弧度检查一行中的每个像素,当它到达透明像素时停止并跟踪最短的像素。但这并不是特别快或准确。有没有更好的办法?也许是人们用这种算法的算法?

我用javascript / canvas做这个。

2 个答案:

答案 0 :(得分:2)

一种方法是计算所有像素到最近的透明像素(distance transform)的距离,这可以在原始图像的两次通过中执行。 当计算了距离变换时,可以在恒定时间O(1)中找到最近的透明像素。 如果透明区域随时间缓慢变化,这种方法会更好。

如果透明区域变化很快,您可能会做得更好。

答案 1 :(得分:0)

最快的准确算法是简单地围绕该点做圆圈。检查每个相邻像素,然后检查下一层,基本上是广度优先搜索,并且将在O(n)时间运行,其中n是像素数。现在你正在做的是一种更快的概率方法。

我认为使算法比你的算法更快的唯一方法是选择一个圆形大小,例如3像素直径,并检查(例如)像素的75%(最佳百分比取决于您对精度的要求)在那个圈子上。如果找不到透明像素,请将圆的大小加倍。根据图像的外观,这可能非常不准确,但它更喜欢速度和准确性。

否则,除非您可以收集有关透明像素基于其周围像素的位置的数据,否则我并未真正看到您的算法有所改进。然后你可以更聪明地搜索。否则,你通过测试像素学到的只是一个像素是(或不是)透明的。

如果您可以说您只是在寻找大于x像素的透明区域,并且您想要准确找到直径为x像素的任何区域,那么您可以调整圆圈的大小以增加x-1,然后为了提高精度,您可以沿着原点的透明像素,直到找到最近的像素。