基于像素的模式识别的数据结构

Data structure for pixel based pattern recognition

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

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

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

对于这个问题,你可以使用不同类型的树。

这似乎是一个被广泛研究的话题,答案可能比正常的 SO 答案要长得多。参考下一个链接:

https://books.google.co.uk/books?id=ixDjBQAAQBAJ&pg=PA119&lpg=PA119&dq=best+data+structure+for+pattern+recognition&source=bl&ots=BLEx5TOrW9&sig=d_1HjGTeQ7SptvHJ0iZ_yXUG5Vo&hl=sl&sa=X&ei=dgI6VYDTKZPVapmTgdgD&ved=0CFcQ6AEwCA#v=onepage&q=best%20data%20structure%20for%20pattern%20recognition&f=false

http://www.computer.org/csdl/trans/ts/1977/02/01702419.pdf

http://www.ablesw.com/3d-doctor/3dseg.html

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

以通常的图形 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搜索颜色检查(会是边)

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

我建议您看一下可能适用于您的问题的 kd-tree 书Algorithms in a Nutshell. You can find an easy implementation

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

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

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

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

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

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