数独是一个基于逻辑的数字放置难题,它由81个单元格组成,分为9列9行。该游戏的目标是用数字1–9填充每个单元格,以便在每一行,每一列和每一块中都没有重复的数字。
在这篇文章中,旨在介绍一种基于数字识别和基于整数线性规划的自动数独求解器,它使用以下内容:Keras(基于MNIST数据库)和OpenCV用于数字识别,而PuLP用于整数线性规划。
另外,计划详细介绍整数线性规划部分,只稍微涉及数字识别和提取部分(图像处理)
MNIST数据库是手写数字的大型数据库,通常用于训练各种图像处理系统。该数据库还广泛用于机器学习领域的训练和测试。
这篇文章的其余部分安排如下:
使用OpenCV进行数字提取并使用Keras进行数字识别
用于数独解谜的带有PuLP的公式和Python3代码
数独游戏图像上的数字位置
用示例数独难题测试所开发的求解器
图1 自动数独求解器的概念图
1. 使用OpenCV进行数字提取并使用Keras进行数字识别
在本节中,将解释用于数字识别的图像处理概述。下面,对示例代码进行了简单描述。
图像处理:高斯模糊,阈值处理,调整大小以使用基于MNIST的数字识别模型进行预测
数字提取:基于轮廓,裁剪和变形图像
数字识别:基于MNIST的数字识别模型(当我使用现有的经过训练的模型时,我将不提供用于数字识别建模的示例代码。)
第1部分 设置
import cv2
import pulp
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from PIL import Image
from itertools import product
from tensorflow.keras.models import load_model
from keras.preprocessing import image
MNIST_MODEL_PATH = 'model/mnist_model.h5' # trained model path
SUDOKU_PUZZLE_IMAGE_PATH = 'image/sample_sudoku_puzzle.png' # sample sudoku puzzle image path
第2部分 数字提取和识别函数
def _image_processing_for_extracting_digits(_SUDOKU_PUZZLE_IMAGE_PATH):
# read image as gray scale
_image = cv2.imread(_SUDOKU_PUZZLE_IMAGE_PATH)
_gray_scale_image = cv2.cvtColor(_image, cv2.COLOR_BGR2GRAY)
# applying gaussian blurring to reduce background noise
_gaussian_blurred_gray_scale_image = cv2.GaussianBlur(_gray_scale_image,(1,1),cv2.BORDER_DEFAULT)
# applying inverse binary threshold
_ret, _inverse_binary_threshold_image = cv2.threshold(_gray_scale_image, 180, 255,cv2.THRESH_BINARY_INV)
# applying probabilistic hough transform