我正在寻找最快的距离变换算法。
根据这个网站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年找不到来源,所以任何帮助都受到高度赞赏。
答案 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的“图层样式:”
答案 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细胞到每个其他细胞的距离。箭头显示了通向某些细胞的方式。彩色数字反映了确切的(欧几里德)距离。
算法的工作原理如下:掩码
+------+------+------+
| 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。