• 【计算机视觉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个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

  • 相关阅读:
    如何显示标注的纯黑mask图
    发UPS国际快递到墨西哥的收费标准
    Vue.js 的模板语法
    Wireshark TS | 快速重传和乱序之混淆
    【Linux】项目日志——输出重定向
    模拟器抓HTTP/S的包时如何绕过单向证书校验(XP框架)
    Zookeeper 和 Kafka 工作原理及如何搭建 Zookeeper集群 + Kafka集群
    首发 自媒体博客最新版Spimes主题 X6.0开心免授权
    数学建模三大类模型适用场景及建模方法(纯干货)
    基于labview的信号采集与频率计算2
  • 原文地址:https://blog.csdn.net/superdont/article/details/126243714