【计算机视觉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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

superdont

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

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

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

打赏作者

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

抵扣说明:

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

余额充值