python图像数独_Python图像识别+KNN求解数独的实现

本文介绍了一种使用Python OpenCV和KNN算法实现图像识别求解数独的方法。通过读取图像,识别数字,再利用KNN算法进行识别,最终求解并显示数独答案。整个过程平均耗时0.5秒。
摘要由CSDN通过智能技术生成

Python-opencv+KNN求解数独

最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。

整体思路大概就是识别出图中数字生成list,然后求解。

输入输出demo

数独采用的是微软自带的Microsoft sudoku软件随便截取的图像,如下图所示:

8dd4610dcb5d1a983eb200b0e7c5da15.png

经过程序求解后,得到的结果如下图所示:

b5ac39dc9b943f0cc4c485165d32c7ea.png

程序具体流程

程序整体流程如下图所示:

1c6dafd0ffedf746170b7ed70fb9d0ed.png

读入图像后,根据求解轮廓信息找到数字所在位置,以及不包含数字的空白位置,提取数字信息通过KNN识别,识别出数字;无数字信息的在list中置0;生成未求解数独list,之后求解数独,将信息在原图中显示出来。

# -*-coding:utf-8-*-

import os

import cv2 as cv

import numpy as np

import time

####################################################

#寻找数字生成list

def find_dig_(img, train_set):

if img is None:

print("无效的图片!")

os._exit(0)

return

_, thre = cv.threshold(img, 230, 250, cv.THRESH_BINARY_INV)

_, contours, hierarchy = cv.findContours(thre, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

sudoku_list = []

boxes = []

for i in range(len(hierarchy[0])):

if hierarchy[0][i][3] == 0: # 表示父轮廓为 0

boxes.append(hierarchy[0][i])

# 提取数字

nm = []

for j in range(len(boxes)): # 此处len(boxes)=81

if boxes[j][2] != -1:

x, y, w, h = cv.boundingRect(contours[boxes[j][2]])

nm.append([x, y, w, h])

# 在原图中框选各个数字

cropped = img[y:y + h, x:x + w]

im = img_pre(cropped)#预处理

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于数独问题的Python实现,我可以给您提供一个基本的算法: 首先,我们需要一个函数来判断某个数字是否可以放在数独的某个位置上,这个函数我们命名为“check()”,实现如下: ```python def check(board, row, col, num): # 判断同一行是否有相同的数字 for i in range(9): if board[row][i] == num: return False # 判断同一列是否有相同的数字 for i in range(9): if board[i][col] == num: return False # 判断同一个3*3的宫格内是否有相同的数字 start_row = (row // 3) * 3 start_col = (col // 3) * 3 for i in range(start_row, start_row + 3): for j in range(start_col, start_col + 3): if board[i][j] == num: return False return True ``` 接下来,我们需要一个递归函数来填充数独,这个函数我们命名为“solve()”,实现如下: ```python def solve(board, row, col): # 如果当前行和列都大于等于9,表示已经填充完毕,返回True if row >= 9 and col >= 9: return True # 如果当前列大于等于9,表示当前行填充完毕,转到下一行 if col >= 9: row += 1 col = 0 # 如果当前位置已经有数字,跳过,转到下一列 if board[row][col] != 0: return solve(board, row, col + 1) # 尝试填充数字1~9 for i in range(1, 10): if check(board, row, col, i): board[row][col] = i # 如果能够成功填充,继续填充下一个位置 if solve(board, row, col + 1): return True # 如果填充失败,回溯,将当前位置的数字清零 board[row][col] = 0 # 如果1~9都不能填充成功,返回False return False ``` 最后,我们需要一个函数来调用“solve()”函数,实现如下: ```python def solveSudoku(board): solve(board, 0, 0) ``` 这样,我们就完成了数独的算法实现调用“solveSudoku()”函数,传入一个9*9的二维数组即可求解数独
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值