最快的距离变换算法

时间:2011-09-15 05:12:55

标签: algorithm image-processing transform distance

我正在寻找最快的距离变换算法。

根据这个网站http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm,它描述了:“距离变换可以使用聪明的算法在两次传递中更有效地计算(例如Rosenfeld和Pfaltz 1968)。” < / p>

四处寻找,我找到了:“Rosenfeld,A和Pfaltz,J L. 1968.数字图片上的距离函数。模式识别,1,33-61。”

但我相信我们应该拥有比1968年更好更快的算法?事实上,我从1968年找不到来源,所以任何帮助都受到高度赞赏。

6 个答案:

答案 0 :(得分:13)

本文回顾了已知的精确距离变换算法:

“2D欧几里德距离变换算法:比较调查”
http://liu.diva-portal.org/smash/get/diva2:23335/FULLTEXT01

最快的精确距离变换来自Meijster:

“计算线性时间距离变换的通用算法。”
http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

该算法的设计特别适合并行计算。

这是在我的开源库中实现的,它试图模仿Photoshop的“图层样式:”

https://github.com/vinniefalco/LayerEffects

答案 1 :(得分:12)

OpenCV库为其近似cv::distanceTransform函数使用了一种算法,该算法将图像从左上角传递到右下角。该算法在Gunilla Borgefors (Comput.Vision Graph.Image Process.34 3,pp 344-371,1986)的论文“数字图像中的距离变换”中描述。

算法通过一些基本跳跃(水平,垂直,对角线和骑士移动)的组合来计算距离。每次跳跃都会产生成本。下表显示了不同跳转的成本。

+------+------+------+------+------+
| 2.8  |2.1969|   2  |2.1969|  2.8 |
+------+------+------+------+------+
|2.1969|  1.4 |   1  |  1.4 |2.1969|
+------+------+------+------+------+
|   2  |   1  |   0  |   1  |   2  |
+------+------+------+------+------+
|2.1969|  1.4 |   1  |  1.4 |2.1969|
+------+------+------+------+------+
| 2.8  |2.1969|   2  |2.1969|  2.8 |
+------+------+------+------+------+

从一个像素到另一个像素的距离是所需跳跃成本的总和。下图显示了从0细胞到每个其他细胞的距离。箭头显示了通向某些细胞的方式。彩色数字反映了确切的(欧几里德)距离。

enter image description here

算法的工作原理如下:掩码

+------+------+------+
|   0  |   1  |   2  |
+------+------+------+
|   1  |  1.4 |2.1969|
+------+------+------+
|   2  |2.1969|  2.8 |
+------+------+------+

从图像的左上角移动到右下角。在此过程中,位于掩码边界内的单元格要么保持其值(如果已知且较小),要么通过将掩码值与单元格值(如果已知)相加来计算得到的值在mask-0-cell下面。 之后,执行从右下到左上的第二次通过(具有垂直和水平翻转掩模)。在第二次通过后,计算距离。

答案 2 :(得分:9)

有许多关于计算距离函数的新工作。

顺便说一下,你真的想用这些而不是Rosenfeld的作品,特别是当你想在有障碍物的情况下计算距离时。

答案 3 :(得分:5)

Felzenszwalb和Huttenlocher在他们的论文“采样函数的距离变换”here中提出了一种精确的算法和O(N)。他们利用欧几里德距离变换的平方是抛物线的事实,可以在每个维度上独立地进行评估。

源代码也是available

答案 4 :(得分:3)

我已经实施了Vinnie的回答中引用的Meijster的O(N)方法。 &#34;计算线性时间距离变换的通用算法。&#34; http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

好处是它可以非常有效地并行化,独立地计算每个像素线(它是一个可分离的方法)。在12个CPU核心上运行,1000 ^ 3体积图像的距离字段可以在几秒钟内完成。

Felzenszwalb和Huttenlocher的解决方案&#34;采样函数的距离变换&#34;从2012年开始(引自bw1024&#39;答案)基于完全相同的想法。有趣的是,他们没有引用12年前Meijster的工作。

答案 5 :(得分:0)

Michael Rauter和David Schreiber在“ GPU加速的快速方向倒角匹配算法以及与高度优化的CPU实现的详细比较”中,使用“用于计算距离图的统一线性时间算法”的距离变换算法描述了它们的性能。 ”。

2012年,他们在无多线程的Intel Xeon CPU上使用了大约15ms的8个距离转换(720×576)。他们在GPU GTX 460上做到了7毫秒。

我从未见过更快的dt。