我正在寻找算法,给定包含填字游戏的图像
可以将填字游戏本身假定为常规填字游戏(即,我对某些程序生成并以图像形式发布的填字游戏感兴趣,而不是扫描的基于纸张的填字游戏),我希望该程序无需任何输入即可运行除了图像位图。
我可以想到一些强力的多遍方法来做到这一点(本质上是使用imagemagick的hit-and-miss filter的变体,然后遍历图像以寻找剩余的点),但是我希望从真正了解图像处理的人们那里得到更好的想法。
最佳答案
以链接的填字游戏的屏幕截图为例,我假设:
然后,您可以从上到下扫描图像,以找到足够长的水平黑线。一条线以黑色像素开始,以白色像素结束。其他像素指示它不是一条线。 (这是为了清除文本和按钮。)对垂直线也是如此。
理想情况下,您现在拥有填字游戏行。如果您的图像没有裁剪为填字游戏,则可能会有误报,例如按钮边框。要查找填字游戏行,请按长度对其进行排序,然后查找相同长度的最大连续块。这些应该是您的填字游戏行,除非您有一些degenerate cases
现在,执行水平和垂直线的嵌套循环,但是跳过第一行。在直线相交的西北方向看两个或三个像素。如果像素较暗,则为空白。如果很轻,那就是一个牢房。这种启发式方法似乎效果很好。我在这里说的是明暗,是因为某些填字游戏在打印时使用灰色单元格来节省墨水,而某些单元格在屏幕截图中突出显示。
如果最后没有空格,则有禁止的填字游戏。您可以通过检查单元格边框左右两侧的像素之一是否为黑色来找到这些条。
最后,提示:如果要使用算法在使用Crossword Compiler生成的填字游戏中查找单元格,请查看源代码。您会找到指向Javascript文件
/puzzles/sample/cryptic_demo/cryptic_demo_xml.js
的链接,该链接将填字游戏包含为XML字符串,这也为您提供了一些提示。Crossword编译器的较旧版本(例如Independent Cryptic所用的版本)将其数据隐藏在从applet加载的文件中。该文件的格式为二进制,但是如果您知道原始数据,则不会太难阅读。
关于从图像分类和提取填字游戏网格的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21447701/