【问题标题】:Data structure for pixel based pattern recognition基于像素的模式识别的数据结构
【发布时间】:2015-04-16 21:16:54
【问题描述】:

我有一个基于约束构造随机图像的应用程序。随机选择不同颜色的像素并将其放置在满足所有约束的网格中。例如(简化),可能有一个约束,如果蓝色或绿色像素位于 (0,-1),红色像素位于 (-1,-1) 和 (-1, 0),则放置禁止白色像素。这些坐标是来自当前放置位置(即其邻域)的向量。

现在我将约束存储在一个数组中并循环遍历它们,检查每个约束是否适用。我必须对放置在网格中的每个像素执行此操作。因此,随着添加更多约束,性能会受到影响。此外,两个约束可能会发生冲突,但检查起来并不容易。

我认为图形类型的数据结构(树?)可能是一种存储所有约束的方法,这样我就可以从像素邻域中快速确定哪些(如果有的话)约束适用。但我不太清楚如何使这样的结构工作,因为单个坐标可以包含多种颜色,以及如何将一组坐标/颜色与一组禁止的像素颜色联系起来。有什么想法吗?

【问题讨论】:

    标签: data-structures pattern-matching


    【解决方案1】:

    没有使用过模式匹配,但想到的是:

    以通常的图形 ds 为例,其中顶点将是您的向量,边将是连接它们的禁止颜色。 在这里,您可以将所有顶点相互连接起来,更理想的做法是采用一些您将使用的方向来填充您的 ds,当您将通过像素阵列时,您应该使用相同的起点和方向。 从您的示例中,如果您从 (0,-1) 顺时针方向开始,它将类似于: (0,-1) --blue-- (-1, -1), (0,-1) --green- - (-1, -1), (-1, -1) --red -- (-1, 0), (-1, 0) --red--(-1, 1), (-1, 1) --white--(0, 1), (-1, 1) --white-- (1, 1), (-1, 1) --white-- (1, 0)

    现在使用 DFS 搜索颜色进行检查(它将是边缘)

    【讨论】:

      【解决方案2】:

      在我看来,一个方便的选择是 kd-tree。通过将约束存储在 kd-tree 中,您可以访问适用于最近邻类型查询的约束。

      我建议你看看这本书Algorithms in a Nutshell。您可以找到可能适用于您的问题的 kd 树的 easy implementation

      但是,请记住,如果约束在您的场景中分布不均匀,则生成的树可能不会很好地平衡。在这种情况下,您应该为约束找到更好的表示,否则算法的实际复杂度将更接近最差值 O(n),而不是平均(和最佳)值 O(log n)。

      【讨论】:

        【解决方案3】:

        您可以使用图形切割来解决这个问题。它甚至会处理提到的冲突。这基本上是它的工作原理:它尝试根据您希望最小化的成本函数分配标签。对于您的情况,成本函数可能类似于:

        E(x)=infinite ; if constraint is violated
        and  0        ; otherwise
        

        图割将分配最小化此成本函数的标签。另外,它非常快速和高效,并且收敛到最小值。看看以下两个参考:

        1. Graph cuts for energy Minimization
        2. Code for implementing graph cut

        第二个链接提供了用于图形切割的现成代码,您可以在其中使用自己的成本函数,该成本函数将被最小化(并且可能取决于您的情况下的邻居值)。

        【讨论】:

        • 谢谢!这看起来确实是正确的追求方向。我以前从未听说过图形切割。
        【解决方案4】:
        猜你喜欢
        • 1970-01-01
        • 2016-08-10
        • 2019-04-25
        • 1970-01-01
        • 2012-09-17
        • 2012-06-25
        • 2017-04-02
        • 2013-07-14
        • 2019-03-21
        相关资源
        最近更新 更多