工具
系统:Windows 10
Python版本:Version 3.6
OpenCV版本:Version 2.4.9
具体实现
本文将用python语言,结合OpenCV视觉库来解决数独问题。主要工作为用OpenCV的相关函数来获取图形上的数独矩阵,然后设计一定的算法求出数独的解,最后在图片上画出数独的解。
下图为一个数独题目,数独的解题实际上就是在一个9*9网格上的空白处填上若干数字,并且,要使填到空白格子上的数字在其所在的行、所在的列和所在的宫格上不能重复出现。宫格是一个3*3的网格,整个数独网格又可以分为9个宫格。
上面的数独可以用如下的矩阵表示:
[[0 0 0 7 0 0 4 1 0]
[0 0 3 0 2 0 0 0 6]
[1 0 7 4 0 0 5 2 3]
[4 0 1 6 0 0 0 8 0]
[0 2 9 0 7 0 6 3 0]
[0 7 0 0 0 4 2 0 1]
[7 5 2 0 0 6 3 0 9]
[3 0 0 0 4 0 1 0 0]
[0 1 4 0 0 3 0 0 0]]
首先要做的工作就是从图像中识别出这个矩阵(空白空格用0表示)。具体的步骤如下:
1.读取图片,并获取灰度图
2.反色处理,使得数字的颜色为白色
3.裁剪图形,裁去多余的边界
4.分割图形,将原图分成9*9=81个更小的图形
5.识别图形,将识别的数字填入numArray
图像识别部分的功能我用一个名字叫ImageProcessor的类来实现,具体代码如下展示。
from cv2 import *
from numpy import *
class ImageProcessor:
__originalImage=0 #原图
__grayScaleImage=0 #灰度图
__binaryImage=0 #二值图
__invBinaryImage=0 #颜色反转之后的二值图
__theCutImage=0 #裁剪后的图像
__tightSize=[] #裁剪后的图像的尺寸,宽度和高度
__cutImage=0
__imageList=[] #81个小格子
numArray