【计算机视觉40例】案例17:求解数独图像

导读】本文是专栏《计算机视觉40例简介》的第17个案例《求解数独图像》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例17】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文简要介绍了案例《求解数独图像》的基本流程,更详细的理论介绍请参考《计算机视觉40例简介》。

数独是非常流行的一种益智游戏,广受人们的喜爱。如图1所示,数独的目标是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,使每一行、每一列和每一个粗线宫(3*3)内都包含1到9之间的所有数字。数独也被称为“九宫格”游戏。

图1  数独

本案例中,我们的关注点在于对一张待求解的数独图像求解,并将求解结果打印在该图像上。主要过程如下:

  1. 定位数独图像内的数字;
  2. 识别数独图像内的数字;
  3. 求解图像对应的初始数独状态;
  4. 将数独求解结果显示在原始图像内;

书中详细介绍了上述处理过程的实现方法,并进行具体实现。下面把其中一些关键的知识点分享给大家。

1、识别过程

数独图像的求解过程如图2所示。图中,

  1. 图(a)是原始数独图像;
  2. 图(b)中每一个单元格都被轮廓包围了,该轮廓用于后续寻找数字轮廓。
  3. 图(c)中每一个数字被矩形包围框包围,等待被识别。
  4. 图(d)是针对图像(c)中数字的识别结果。
  5. 图(e)求解图(d)所对应的数独结果后,将结果绘制在原始图像内的最终结果。

2  数独图像求解过程

2、定位单元格、识别数字

该步骤完成定位小单元格、定位数字轮廓。这里,主要借助了OpenCV中关于轮廓的结构关系这一知识点。

图3 定位单元格、定位数字轮廓

3、构造CNN模型

我们构造一个KNN模型用于识别数独图像内的数字。我们将构造模型放在一个函数内,其基本步骤如图4所示,具体如下:

  1. step1:预处理。该过程处理的是磁盘上用来训练的原始图像。这些图像是大小各异的,预处理首先要对图像进行色彩空间转换、调整大小、阈值分割等预处理,以便于提取特征,符合KNN模型的数据要求。规范化后图像大小为15×20像素大小;接下来,预处理(通过循环)将磁盘上经过预处理的所有图像组合在一起。具体来说,采用glob获取每一个图像样本文件的路径,采用嵌套循环的方式将预处理后的图像放入到列表内;从1到9共9个数字(没有数字0),每个数字单独构成一行、共9行,每个数字10个样本、共10列。此时,列表大小为9×10×15×20(行*列*单个图像大小)。
  2. step2:拆分数据集。选取每个数字的前8个样本作为训练集、后2个样本作为测试集。
  3. step3:塑形。将图像调整为一行,作为其特征值。此时,一个数字图像的大小由15×20调整为1×300像素大小。也就是将一个15×20像素大小的数字图像展平为一行。
  4. step4:打标签。给每一个数字的特征打上标签。标签是其所代表的实际值。
  5. step5:KNN。操作模型的三个主要步骤,构造模型、训练模型、测试模型。
  6. step6:验证。计算KNN模型的准确性。
  7. step7:返回。返回构造好的KNN模型。

4 构造KNN流程

4、识别数字

识别数字的过程,就是使用KNN的过程。使用KNN时,直接把要识别的数据传递给训练好的KNN模型即可。其流程图如图5所示。其中:

  1. 预处理F1:主要完成灰度变化、阈值处理。阈值处理主要目的是实现反色,将数字图像由白底黑字、变换为与训练样本一致的黑底白字。
  2. 提取F2:从数独图像内提取出单个的数字图像。
  3. 规范化F3:完成出现的大小调整,将其处理为15×20像素大小。
  4. 重塑F4:将图像展开为一维形式,即由15×20像素大小调整为1×300大小,以符合KNN的格式要求,与训练样本保持一致。
  5. 识别F5:将待识别数字的数据传递给KNN。
  6. 识别输出F6:使用KNN将识别结果输出,并打印在数独图像上。

5  识别流程

5、求解数独

我们采用第三方库“py-sudoku”求解数独。

如图6所示图像,其中左侧是待求解数独、右侧是求解结果。

6 显示数独

6、绘制数独求解结果

绘制数独时,直接判断每个单元格所在位置,然后在单元格附近绘制数独中对应的数值即可。绘制展示如图6所示。

图7 绘制数独结果

在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书中,从算法原理、实现流程等角度系统深入地介绍了该案例的理论基础和实现过程,并对具体的代码实现进行了细致的介绍与解释。欢迎大家阅读第17章《求解数独图像》获取详细内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数独算法说明:用三个二维数组记录数独每个点的状态,SD(i, j)显示数值,也是真实数值(1到9)。ST(i, j)状态,1可由用户输入,2是题目给定的,不能改。SY(i, j)字符串,记录每个点中可能的值。 1、在进行自动计算时,只计算ST(i, j)为1的点,首先将所有状态为1的点的SY(i, j)值全部设为"123456789",SD(i, j)值全部设为0 2、逐点扫描,找到一个点,然后将该点所在的行、列、区域中已存在的SD(x, y)值从SY(i, j)中删除,因为数独规则是一个数值,在行、列、区域都不重复。 3、经第二步处理后,SY(i, j)为空,说明前面的步骤出错,SY(i, j)值为一位数字,就说明该点的值是唯一的,可以确定了。重复第2步。 4、剩余的SY(i, j)中字符串长度最少也是两位,或更多位数。随机从这些两位数的SY(i, j)中选取一个点。取其中的一位确定为该点的值后,重复第2步。如果错误遇错,则重复执行第4步。直到所有点都被确定。 注意:第2步是需要多次重复执行的,所以可用递归函数完成。如果执行结果出现错误(某数出现重复,或某点无值),需要对该过程所执行的所有操作进行回退。 第4步也是需要重复执行的。本程序用Goto跳转方式实现多次执行。 简单的数独,要么所有的点都具有唯一值,第1步执行完成后,就已全部完成。或者具有多个解,随意猜测一个二位数的SY(i, j)的值都能成功。 难的数独是:可唯一确定的点很少,大部分点都有两种或多种可能的值,但最终正确答案只有一种或很少种解。 软件在自动计算过程中,具有很大的偶然性,对于骨灰级的数独题目在计算过程中,时间短的可能不到1秒就能完成,长的可能要几分钟,需要将各种可能性都测试一遍才会有结果。 只要题目正确,多计算几次就能得到答案。 软件是VB6.0开发的,只用到MSHFLXGD控件用于显示。程序只处理各点有两种可能值的情况,对只存在三种可能值的情况未进一步处理,该情况非常极端了。 软件可以保存布局,可选择预存的关数,退出时自动保存界面状态。程序在用到配置文件枚举方法、表格编辑、递归函数等,可作入门级学习研究。 软件可以进一步修改拓展,增加对数独题目难容度的判断等功能。 软件中自带网上下载的200个数独题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值