【问题标题】:Fastest available algorithm for distance transform最快的距离变换算法
【发布时间】:2011-11-17 13:48:21
【问题描述】:

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

根据该站点http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm,它描述:“使用巧妙的算法,只需两次通过(例如 Rosenfeld 和 Pfaltz 1968),就可以更有效地计算距离变换。”

四处搜索,我发现:“Rosenfeld, A and Pfaltz, J L. 1968. Distance Functions on Digital Pictures. Pattern Recognition, 1, 33-61。”

但是我相信我们应该已经有了比 1968 年的算法更好更快的算法了?事实上,我找不到 1968 年的来源,因此非常感谢任何帮助。

【问题讨论】:

    标签: algorithm image-processing transform distance


    【解决方案1】:

    OpenCV 库为其近似 cv::distanceTransform 函数使用一种算法,该算法将图像从左上角传递到右下角并返回。该算法在 Gunilla Borgefors (Comput. Vision Graph. Image Process. 34 3, pp 344–37​​1, 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 下方。 之后,执行从右下角到左上角的第二遍(使用垂直和水平翻转掩码)。在第二遍之后计算距离。

    【讨论】:

    • 这种方法比现代技术慢很多(最值得注意的是来自 A. Meijster 的方法)。
    • 为什么值 2.1969 而不是 2.2360 大约。 sqrt(3)?
    【解决方案2】:

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

    “二维欧几里得距离变换算法:比较调查”
    https://rfabbri.github.io/stuff/fabbri-EDT-survey-ACMCSurvFeb2008.pdf

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

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

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

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

    https://github.com/vinniefalco/LayerEffects

    【讨论】:

      【解决方案3】:

      在计算距离函数方面有大量新工作。

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

      【讨论】:

        【解决方案4】:

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

        源码也是available

        【讨论】:

        【解决方案5】:

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

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

        Felzenszwalb 和 Huttenlocher 的解决方案“采样函数的距离变换”可追溯到 2012 年(在 bw1024 的回答中引用)基于完全相同的想法。有趣的是,他们没有引用 Meijster 12 年前所做的工作。

        【讨论】:

        • 不管怎样,我发现 Felzenszwalb 和 Huttenlocher 的论文比 Mejister 等人的论文更容易阅读。他们不引用那篇论文似乎很奇怪,我想他们不知道吗?
        • 我同意,Felzenszwalb 算法只是 Meijster 算法的复制粘贴,该算法已在十多年前发布。
        • Felzenszwalb 和 Huttenlocher 算法最初发表于 2004 年
        猜你喜欢
        • 1970-01-01
        • 2011-12-26
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多