Detecting X or O in a small image
Use the Classify[]
function to train your own classification function (name it c
) on a list of example photos of X's and O's (see reference pages on handwritten digits classification and the particular section in Classify
)
Note that Classify
is special algorithm that programs itself (it uses an artificial intelligence pattern recognition algorithm to "learn" which photo goes in which category). All you have to do is give it many different examples of X's and 0's and empty squares, point them to their "names" using ->
and run it. You will need to make different images of the three categories X
, 0
and emptySquare
(perhaps 300 or so) to get Classify
to generalise nicely and make a decent c
function. (When I say "generalise" I mean "recognise the 3 patterns in new photographs".)
Here is my own attempt:
In this case (distinguishing x's from o's), it is also pretty easy to design your own classifier. Begin by binarizing, and then calculate the EulerNumber
for each. The Eulernumber
for x's will be zero, while the o's will have a component with Eulernumber 1 (The Euler number is the number of encircled regions). The erosion will help to make it a little more general, for instance, in case the circle isn't completely closed.
ex1=Import["http://i.stack.imgur.com/4vK05.png"];
ex2=Import["http://i.stack.imgur.com/zzw53.png"];
ex3=Import["http://i.stack.imgur.com/28gkl.png"];
ex4=Import["http://i.stack.imgur.com/r8CJn.png"];
x = {ex1, ex2, ex3}
xb = Erosion[Binarize[#], 3] & /@ x;
ComponentMeasurements[#, "EulerNumber"] & /@ xb
{{1 -> 0}, {1 -> 0}, {1 -> 0, 2 -> 1}, {1 -> 0, 2 -> 1}}
training set
trainingSet = {
Import["http://i.stack.imgur.com/oJnVl.png"] -> x,
Import["http://i.stack.imgur.com/yrNij.png"] -> x,
Import["http://i.stack.imgur.com/pINOj.png"] -> x,
Import["http://i.stack.imgur.com/B1OUt.png"] -> x,
Import["http://i.stack.imgur.com/4g9x3.png"] -> x,
Import["http://i.stack.imgur.com/7rWxi.png"] -> x,
Import["http://i.stack.imgur.com/6yAA6.png"] -> x,
Import["http://i.stack.imgur.com/KNXYj.png"] -> x,
Import["http://i.stack.imgur.com/LF3aG.png"] -> x,
Import["http://i.stack.imgur.com/7HWtq.png"] -> x,
Import["http://i.stack.imgur.com/lxb1s.png"] -> x,
Import["http://i.stack.imgur.com/MHZS0.png"] -> blank,
Import["http://i.stack.imgur.com/poatG.png"] -> blank,
Import["http://i.stack.imgur.com/rPinx.png"] -> blank,
Import["http://i.stack.imgur.com/Dghwy.png"] -> blank,
Import["http://i.stack.imgur.com/k9Z2B.png"] -> blank,
Import["http://i.stack.imgur.com/aLTvV.png"] -> blank,
Import["http://i.stack.imgur.com/iAgyV.png"] -> blank,
Import["http://i.stack.imgur.com/ARq5z.png"] -> blank,
Import["http://i.stack.imgur.com/fzSjC.png"] -> blank,
Import["http://i.stack.imgur.com/sgcNF.png"] -> blank,
Import["http://i.stack.imgur.com/oFADs.png"] -> o,
Import["http://i.stack.imgur.com/cvphN.png"] -> o,
Import["http://i.stack.imgur.com/hTdzn.png"] -> o,
Import["http://i.stack.imgur.com/fNcLf.png"] -> o,
Import["http://i.stack.imgur.com/4Vzwu.png"] -> o,
Import["http://i.stack.imgur.com/TKCpt.png"] -> o,
Import["http://i.stack.imgur.com/ETAot.png"] -> o,
Import["http://i.stack.imgur.com/7kWOR.png"] -> o,
Import["http://i.stack.imgur.com/O8AaU.png"] -> o,
Import["http://i.stack.imgur.com/ZvfQe.png"] -> o}
newlyTrainedClassifyingFunction = Classify[trainingSet, Method -> "NeuralNetwork"]
testSet = { (* new data from a tic tac toe game*)
Import["http://i.stack.imgur.com/5n92Y.png"],
Import["http://i.stack.imgur.com/2ieav.png"],
Import["http://i.stack.imgur.com/HGjpN.png"],
Import["http://i.stack.imgur.com/e8JRg.png"],
Import["http://i.stack.imgur.com/sBh59.png"],
Import["http://i.stack.imgur.com/JB9hM.png"],
Import["http://i.stack.imgur.com/8ewT3.png"],
Import["http://i.stack.imgur.com/4hz6m.png"],
Import["http://i.stack.imgur.com/Pfezq.png"]}
newlyTrainedClassifyingFunction[testSet]