在文本正文中定位 ASCII 艺术图像,并具有一定的错误容忍度

2024-01-03

是否有任何算法可以找到以下 ASCII 艺术图像?

    +
    +
   +++
 +++++++
 ++   ++
++  +  ++
++ +++ ++
++  +  ++
 ++   ++
 +++++++
   +++

在以下正文中?

此处完成文件 https://dl.dropbox.com/u/28167627/TestData.txt

              + +    +              ++           +       +++    +     +
 +  ++     +   + ++++    + +       +         +          +  +   +++     +++ +
     +            + +   ++      ++  ++    + ++       +     +      +  +   +
+   ++      +  ++       +          + +       ++        ++  +           +
 ++++++ + +    +   ++  +  +   +   +  ++      +         +                     +
  + +   +      +               +      ++     +  ++            +   +    + +
+++   + ++   +  +            +  +++       + +       ++                     +
  +++++  +      +                            +  + +            +   +  +
 +   +   +              +    +      +            +  +   +      +    +     +
 ++    +              +     +       ++   +          +       +           ++

我必须用黄色突出显示 ASCII 艺术图像,它对应于完整的形状。见附图:

我必须搜索一个包含粗略形状但不完整的文件,其中包含许多+可能会丢失)。对缺失的容忍度+形状应用手设定。

现在,我有两个 2D 数组数据数组:[100][100] 和 SlimeTorpedo 数组:[13][11]。

如何进行检测的代码,如@kjartan(3-4 项目符号)所述:

int match = 0;
for (int i = 0; i < 100; i++) {
    for (int j = 0; j < 100; j++) {
        //Compare DataArr[i][j] with SlimeTorpedoArr[i][j]
        //Look for "checked" position in the picture ("+"), 
        //which corresponds to a checked position in the 
        //slime torpedo array.
        //match++;
    }
}

如何解决这个问题的一般指导是什么?


尝试使用匹配分数进行暴力破解:

  • 在你的“史莱姆鱼雷”周围定义一个“正方形”;这是一个 2D 阵列,其宽度和高度比鱼雷稍宽和稍高。
  • 在该 2D 数组中,根据需要将单元格标记为选中或未选中,以创建所需的图像。
  • 现在循环遍历完整图像中的每个字符(我们将其称为“索引”位置),并将每个字符附近的位置与二维数组中相应字符的位置进行比较。
  • 查找图片中“选中”(或未选中)的位置,该位置对应于粘液鱼雷数组中选中(或未选中)的位置(例如,图片中当前索引位置上方的字符 X 和左侧的字符 Y,即与史莱姆鱼雷阵列中心点上方的状态 X 和左侧的 Y 相匹配)。对于每个这样的“匹配”,向图片中的索引位置添加一个“点”。

现在这是窍门:为了使其更有效,只需检查粘液鱼雷中的某些位置 - 例如,每 10 个位置甚至更少。粗略地说,这应该将运行时间减少 10 倍。

这意味着你必须检查(1/10) * the number of characters in the 2D array对于整张图片中的每个角色。

Now 跟踪得分最高的位置在全貌中。得分最高的位置应该是最好的匹配。

如果需要,您可以多次运行此操作,具体程度不同,例如第一次仅检查 1/20 的位置,然后是 1/2,下一次,但这次仅关注最高的 20 个位置(或者50?100?)第一轮的得分位置。

(或者,您可以对得分高于某个阈值 S 的所有位置进行更详细的扫描)。

希望您让我们知道无论您决定如何,有趣的问题! :)

针对以下评论进行更新:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在文本正文中定位 ASCII 艺术图像,并具有一定的错误容忍度 的相关文章

随机推荐