当前位置: 首页 > 知识库问答 >
问题:

OpenCV-从数独游戏中删除网格线

陆信瑞
2023-03-14

我正在编写一个Android应用程序,从图片中提取数独谜题。对于9x9数独网格中的每个单元格,我需要确定它是包含数字1到9中的一个还是空白。以下是我的算法的大致要点:

  • 自适应阈值拼图
  • 扩展以减少要考虑的轮廓数
  • 找到拼图的轮廓并将其扭曲成正方形
  • 将正方形分成81个相等的单元格;寻找至少有20%白色像素的单元格
  • 找到最靠近这些单元格中心的白色斑点并得到其边界矩形
  • 对边界矩形内的图像部分使用字符识别(k-最近邻/Tesseract/etc.)

虽然我可以用一个简单的泛光填充来移除数独游戏厚厚的外部边界,但内部网格线并不连续,即使在膨胀之后,也无法如此轻松地移除。为了进行说明,以下是移除外部网格线后的示例数独:

问题:有时,一个单元格中有足够多的网格线,以至于超过20%的像素是白色的,所以我误认为该单元格中有数字。以下是此类单元的示例:

我已经考虑过取消图像覆盖以降低内部网格线的可见性。我可以使用Hough变换或本文描述的方法来查找网格线,作为取消旋转的前奏。然而,我看不到任何其他显著的好处,完全删除网格线应该更安全、更容易。

或者,我可以修改我的预处理,以便内部网格线保持不变。目前我的预处理是:

    Imgproc.GaussianBlur(mat, mat, new Size(11,11), 0);
    Imgproc.adaptiveThreshold(mat, matBW, 255, 
        Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 2);
    Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3));
    Imgproc.dilate(matBW, matBW, kernel);

高斯模糊是在阈值化之前降低噪声所必需的。扩张是为了确保外部网格线连接,但不足以重新连接内部线。

如何在不影响图像其余部分的情况下始终删除内部网格线?

非常感谢。

共有1个答案

刘运浩
2023-03-14

如果您不想进行适当的unwarp,那么在digit\u present测试中使用较小的单元格可能是值得的。

假设左上角的单元格有坐标(x1, y1, x2, y1)==(0,0,10,10)。您可以将新单元格定义为(x1 k, y1 k, x2-k, y2-k), k=min(x2-x1, y2-y1)/4

另一种可能有效的策略是在测试前使用侵蚀,具体取决于网格线与数字的厚度。

最后,您可以将所有单元格输入分类器,并使用其置信度指数(如果有的话);如果分类器可信度太低,则可能不是数字。

如果所有这些方法都失败了,为了进行填充,无论如何都必须获得栅格线的扭曲,因此您最好取消扭曲

 类似资料:
  • 数独游戏,游戏分三个难度来生成数独矩阵,有标记功能。关于挑战模式还没有实现。 [Code4App.com]

  • 这个程序的作用: 这个程序从一个类中获取值,并使用这些值作为数独游戏的起始值。我们将在一个典型的数独9x9网格中打印这些内容。然后,程序会提示用户在网格上给出一个坐标点,并在其中输入一个值。目前我正在做的是确保用户输入的值对解决这个难题是有效的。填好拼图后,每列、每行和3x3方块中不再有任何重复值,游戏应结束,输出应为“拼图完成”。 到目前为止,我的程序成功地检查了列和行中的重复值,但我不知道从哪

  • 问题内容: 让我们开始吧,我有一个’handler’类,里面充满了getters和setters,并且其中包括添加和删除对象的代码,它看起来像这样: 请注意,“ GameObject”是一个类,所有对象都对该类进行扩展, 然后在此处创建一个对象, 内部参数是我要添加的对象的参数。当然,每个对象都是其自己的类。现在我想删除对象F1Jutsu(如果它的x值在游戏外部),并且该对象每秒向右移动一次(这样

  • 例如,在Name和Description列之间有一条线,我假定它是网格线。我不知道用CSS删除它。我可以在Java Swing中使用setShowGrid(false)来完成;但这在JavaFX中是不可用的。

  • 如何从播放控制台删除应用程序?有没有办法删除被拒绝的应用程序从谷歌播放开发者控制台?我们如何从Play控制台永久删除草稿应用程序或游戏。

  • 在过去的几天里,我一直在尝试从图片中获取数独网格,我一直在努力获取网格中较小的正方形。我正在制作下面的图片。我原以为用canny过滤器处理图像会很好,但事实并非如此,我无法得到每个正方形的所有轮廓。然后,我将自适应阈值、otsu和一个经典阈值用于测试,但每次,它似乎都无法捕获每个小正方形。 最终的目标是获得包含数字的单元格,并使用Pytork识别数字,因此我非常希望获得一些数字的清晰图像,以便识别