用图像处理的方法破解数独

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数独破解

记得小时候玩过数独游戏,每次一玩总是好几个小时。最近在学直线检测,所以就像用图像识别的知识解决这个问题,后来发现直线检测并不能产生自己想要的结果,就采用另外一种方法分割数字。

一.数独游戏规则

数独游戏在9x9的方格内进行,我们称之为“大九宫格”(红线表示区域),大九宫格格又分为3x3的小方格,每个小方格被称为“小九宫格”(蓝色线表示区域),小九宫格中为为9个“数字格”,下图中暗红色所示区域:

数独游戏首先从已经填入数字的格子开始:

游戏的目的是根据下列规则,

1.用1至9之间的数字填满空格,一个格子只能填入一个数字:

2. 每个数字在每一行只能出现一次:

允许

不允许

3.每个数字在每一列只能出现一次:

允许

不允许

4.每个数字在每一区只能出现一次:

允许不允许

- 总结这些规则,即每个数字在每一行、每一列和每一区只能出现一次。

二.程序简介

1.为识别数独中的数字,我们做如下合理的假设,

1.我们假设,拍摄到的图片中数独部分占据图像的大部分

2.数独大九宫格的外边缘,和小九宫格的边缘比里面的数字格分界线线要粗

如下图为在一幅报纸上拍摄到的数独,我们将以它来说明我们的识别过程。

2.简单介绍下程序的执行过程,和产生的效果,1.对图像滤波和阈值化处理

2.利用漫水填充提取数独中的大九宫格

3.提取有畸变的大九宫格的外边缘,并找出四个角点。

3.利用四个角点将有畸变的大九宫格进行畸变矫正(透视变换)效果图为下图右侧

4.提取小九宫格,下图左侧为原始的小九宫格,中间为提取的轮廓采用漫水填充并提取角点的图,右侧为畸变矫正后的图

若直接直接分割,可以看到下图中,提取的数字特征不准确,会提取失败

5.找到小数字格中的小正方形并检测小正方形中白色像素点,并以此作为漫水填充的起点

6对小九宫格中数字进行精确提取

6训练数字分类器并识别提取后的数字

7使用迭代算法将数独解出来

三.流程图

下面是程序的流程图(略简单,visio可以查看)

开始

载入图像,滤波,自适应阈值分割得

到黑白图像

利用漫水填充算法找到大九宫格(大九宫格为白色像素点联通域面

积最大区域)

提取大九宫格的最外层轮廓,采用较大轮廓拟合阈值,拟合轮廓,并用提取大

九宫格的4个角点来进行透视变换

利用透视变换后的图,提取小九宫格轮廓后找到其四个角点,对其进行透视变换,将透

视变换后的图存入map 结构中

对map 结构中的每个小九宫格进行定

位,定位点为数字格的中心

构造以数字格的中心为中心的正方形,正方形边长为数字格的一半

遍历正方形之中白色像素点,以此点为满水填充的起始点,对数字进

行分割

数字分割后,中心化归一化处理,

并存贮数字图片

正方形中是否存在白色

像素点

此数字格中无数字,数字格中数字

为0用训练好的SVM 分类器分类数字并

得到数字格中数字

将数字录入Mat 结构中

对Mat 结构中数字进行数独破解并

显示

结束

四.程序截图

具体代码大约太长,只是列出类的头文件中函数声明部分和主函数,具体函数实现这里因篇幅原因即不列出

主函数

Digitrecognizer.h类为

训练SVM分类器的类,(SVM分类器所采用的训练字符集为手写数字字符集)

Precess.h

这个类中主要提取大九宫格和小九宫格

Sudoku.h

这个类作用主要将提取的未破解的数独破解出来(类为网上下载的,非自己编写)具体可以参考博客:/sq_zhuyi/article/details/7717324

相关文档
最新文档