【问题标题】:Efficient Algorithm for Bitmap matching (or 2d array)?位图匹配(或二维数组)的高效算法?
【发布时间】:2012-09-22 14:37:34
【问题描述】:

下图显示了算法必须做什么。

对于一维数组,例如字符串匹配,我们可以使用String searching algorithms

我们如何有效地在位图或二维数组中找到此类匹配项?

附: 给出的示例仅用于说明目的。实现 Bejeweled 求解器不需要复杂的算法,只需将游戏板拆分并制作 N x N 表,并从每个单元格中采样一个像素,并通过检查其 RGB 值来确定每个单元格中的项目,然后我们就完成了。我想知道通用图像区域匹配算法,例如,一个不断点击匹配位图区域的宏程序。

【问题讨论】:

  • 实际上 Bejeweled 并不是这样实现的。它的板矩阵在其结构上包含其颜色的定义。 UI 是图形化的,但底层逻辑不是。所以解决它只是意味着动态遍历矩阵。
  • 算法需要解决的问题有多复杂? blob 检测和良好的 ol 神经网络怎么样?
  • 你对这件事有什么发现?维基百科中的标签Image processing 中列出了几种算法。 SO中有一个类似的问题:Image comparison - fast algorithm.
  • 这件事的另一个有趣的问题:Algorithm improvement for Coca-Cola can shape recognition.
  • 如果您正在寻找一种算法,您不必在问题中添加不同的语言标签。

标签: image algorithm


【解决方案1】:

这不是一件简单的事情。大多数游戏通过使用区域(正如您对宝石示例所推测的那样)或颜色图来解决此问题,它们会保持第二张绘图,按颜色将位置映射到特定项目。

在游戏之外,例程使用matrix transformation to attempt to identify edges and verticies,这往往会减少考虑可能匹配的数据量。一个简单的例子是使用带有内核的过滤器

 kernel = [ -1 -1 -1 ]
          [ -1  8 -1 ]
          [ -1 -1 -1 ]

强调任何与其邻国不平衡的地区。从中您可以尝试检测线和顶点,从而大大减少匹配中要考虑的项目数量。如果要检测“近”匹配,则尝试使用线性变换通过测量顶点的位移来描述匹配的距离,并设置一些标准来确定匹配是否与相同的距离太远。

一个简单的解决方案,但仅适用于“完美”数据的解决方案是针对每个可能的偏移量将位图与原始位图对比xor。如果已知图像是用精确的位图构造的,那么xor 应该产生一个与位图大小相同的零字段。通过在尝试更昂贵的xor 并验证计算之前检查几个选定像素的精确匹配,可以在一定程度上提高这种技术的性能,但是它的性能会随着空间的增大而降低,以非常不合需要的方式考虑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2011-06-22
    • 2011-01-01
    相关资源
    最近更新 更多