加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

干货 | 手把手教你用115行代码做个数独解析器!

发布时间:2020-09-12 15:47:38 所属栏目:模式 来源:51cto
导读:你也是数独爱好者吗? Aakash Jhawar和许多人一样,乐于挑战新的难题。上学的时候,他每天早上都要玩数独。长大后,随着科技的进步,我们可以让计算机来帮我们解数独了!只需要点击数独的图片,它就会为你填满全部九宫格。 叮~ 这里有一份数独解析教程,等

squares = []   side = img.shape[:1]   sideside = side[0] / 9 for j in range(9):      for i in range(9):          p1 = (i * side, j * side)  #Top left corner of a box            p2 = ((i + 1) * side, (j + 1) * side)  #Bottom right corner                squares.append((p1, p2)) return squares 

5、得到每一位数字

下一步是从其单元格中提取数字并构建一个数组。

digits = []  img = pre_process_image(img.copy(), skip_dilate=True)  for square in squares:      digits.append(extract_digit(img, square, size)) 

extract_digit 是从一个数独方块中提取一个数字(如果有的话)的函数。它从整个方框中得到数字框,使用填充特征查找来获得框中间的最大特征,以期在边缘找到一个属于该数字的像素,用于定义中间的区域。接下来,需要缩放并填充数字,让适合用于机器学习的数字大小的平方。同时,我们必须忽略任何小的边框。

def extract_digit(img, rect, size):      digit = cut_from_rect(img, rect)      h, w = digit.shape[:2]      margin = int(np.mean([h, w]) / 2.5)      _, bbox, seed = find_largest_feature(digit, [margin, margin], [w      - margin, h - margin])      digit = cut_from_rect(digit, bbox)       w = bbox[1][0] - bbox[0][0]      h = bbox[1][1] - bbox[0][1]      if w > 0 and h > 0 and (w * h) > 100 and len(digit) > 0:          return scale_and_centre(digit, size, 4)      else:          return np.zeros((size, size), np.uint8) 

干货 | 手把手教你用115行代码做个数独解析器!     

最后的数独的形象

现在,我们有了最终的数独预处理图像,下一个任务是提取图像中的每一位数字,并将其存储在一个矩阵中,然后通过某种算法计算出数独的解。

第二步:提取图像中出现的每个数字

对于数字识别,我们将在MNIST数据集上训练神经网络,该数据集包含60000张0到9的数字图像。从导入所有库开始。

import numpy  import cv2from keras.datasets   import mnistfrom keras.models   import Sequentialfrom keras.layers   import Densefrom keras.layers   import Dropoutfrom keras.layers   import Flattenfrom keras.layers.convolutional   import Conv2Dfrom keras.layers.convolutional   import MaxPooling2Dfrom keras.utils   import np_utilsfrom keras   import backend as K  import matplotlib.pyplot as plt 

需要修复随机种子以确保可重复性。

K.set_image_dim_ordering( th )  seed = 7numpy.random.seed(seed)  (X_train, y_train), (X_test, y_test) = mnist.load_data() 

然后将图像重塑为样本*像素*宽度*高度,并输入从0-255规范化为0-1。在此之后,对输出进行热编码。

X_trainX_train = X_train.reshape(X_train.shape[0], 1, 28,                             28).astype( float32 )  X_testX_test = X_test.reshape(X_test.shape[0], 1, 28,                             28).astype( float32 )   X_trainX_train = X_train / 255  X_testX_test = X_test / 255 y_train = np_utils.to_categorical(y_train)  y_test = np_utils.to_categorical(y_test)  num_classes = y_test.shape[1] 

接下来,我们将创建一个模型来预测手写数字。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读