GUI Smart Sudoku Solver that tries to extract a sudoku puzzle from a photo and solve it.
pip install virtualenv
Create a virtual environment with the name sudokuenv.
virtualenv sudokuenv
cd sudokuenv/Scripts
activate
source sudokuenv/bin/activate
Clone this repository, extract it if you downloaded a .zip or .tar file and cd into the cloned repository.
cd A:\AI_Sudoku-master
Install the required packages by typing:
pip install -r requirements.txt
'''Run this file to run the application'''
from MainUI import MainUI
from CNN import CNN
from KNN import KNN
import os
# Change the model type variable value to "CNN" to use the Convolutional Neural Network
# Change the model type variable value to "KNN" to use the K Nearest Neighbours Classifier
modeltype = "KNN"
python Run.py
You need to select an image of a Sudoku Puzzle through the GUI Home Page.
Once you press Next, a number of stages of image processing take place which are displayed by the GUI leading up to recognition. Here are snapshots of two of the stages:
For recognition, a CNN or KNN can be used. This option can be toggled as mentioned in the first point. Once recognized, the board is displayed and you can rectify any wrongly recognized entries in the board.
Finally click on reveal solution to display the solution.
Gaussian Blurring Blurring using a Gaussian function. This is to reduce noise and detail.
Adaptive Gaussian Thresholding Adaptive thresholding with a Gaussian Function to account for different illuminations in different parts of the image.
Inverting to make the digits and lines white while making the background black.
Dilation with a plus shaped 3X3 Kernel to fill out any cracks in the board lines and thicken the board lines.
Flood Filling Since the board will probably be the largest blob a.k.a connected component with the largest area, floodfilling from different seed points and finding all connected components followed by finding the largest floodfilled area region will give the board.
The largest blob a.k.a the board is found after the previous step. Let's call this the outerbox
Eroding the grid a bit to undo the effects of the dilation on the outerbox that we did earlier.
Hough Line Transform to find all the lines in the detected outerbox.
Merging related lines. The lines found by the Hough Transform that are close to each other are fused together.
Finding the Extreme lines . We find the border lines by choosing the nearest line from the top with slope almost 0 as the upper edge, the nearest line from the bottom with slope almost 0 as the lower edge, the nearest line from the left with slope almost infinity as the left edge and the nearest line from the right with slope almost infinity as the right edge.
Finding the four intersection points. The four intersection points of these lines are found and plotted along with the lines.
Warping perspective. We find the perspective matrix using the end points, correct the perspective and crop the board out of the original image.
Thresholding and Inverting the grid. The cropped image from the previous step is adaptive thresholded and inverted.
Slicing the grid into 81 slices to get images of each cell of the Sudoku board.
Blackfilling and centering the number. Any white patches other than the number are removed by floodfilling with black from the outer layer points as seeds. Then the approximate bounding box of the number is found and centered in the image.
Read about CNNs here
Read about KNN here
Contributions are welcome :smile:
Just a few guidelines:
If you find any bugs/issues, raise an issue.