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

Canvas 点到图像边缘的最短距离,canvas,shortest-path,Canvas,Shortest Path,这可能是在其他地方提到的,但我找不到任何相关内容。我试图找到图像上任意点和最近的透明像素之间的最短距离,更强调速度而不是准确性 目前我正在做的是每0.1弧度检查一行中的每个像素,当它到达一个透明像素时停止,并跟踪最短的像素。但这并不是特别快或准确。有更好的办法吗?也许是人们用来做这类事情的算法 我正在使用javascript/canvas进行此操作 最快的精确算法是简单地围绕点做圆周运动。检查每个相邻的像素,然后检查下一层,本质上是一个广度优先的搜索,它将在O(n)时间内运行,其中n是像素数。现

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

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


我正在使用javascript/canvas进行此操作

最快的精确算法是简单地围绕点做圆周运动。检查每个相邻的像素,然后检查下一层,本质上是一个广度优先的搜索,它将在O(n)时间内运行,其中n是像素数。现在,您所做的是一种更快的概率方法

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

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


如果你可以说你只寻找大于x像素的透明区域,并且你想精确地找到任何直径为x像素的区域,那么你可以调整你的圆的大小,使其增长x-1,然后,为了提高精度,您可以沿着透明像素向原点移动,直到找到最近的像素。

一种方法是计算所有像素到最近的透明像素的距离,这可以在原始图像的两个过程中执行。 计算距离变换后,可以在恒定时间内找到最近的透明像素O(1)。 如果透明区域随时间缓慢变化,则此方法更优越


在透明区域快速变化的情况下,您可能会做得更好。

图像是矩形的(即没有透明区域)?不,它是透明背景上的图形。本质上,它可以被认为是一个二值图像,因为我要寻找的是透明/不透明的。你的度量标准是什么?例如,假设原点旁边有一个透明像素,而您没有对其进行测试。返回图片另一边的一个透明点可以接受吗?@ajon可以接受丢失一个或两个透明像素。这看起来很有希望,因为图像实际上根本没有变化,只是要测量的点是。然而,从一开始它似乎会非常昂贵,是这样还是我没有正确理解它?事实上,我认为我已经想出了一个很好的方法来实现它,让我试试,我会公布结果。不幸的是,这个例子有点糟糕,因为我不知道如何使用除JSFIDLE徽标之外的任何其他图像,因为跨源安全性,但这非常有效。谢谢