private IEnumerable <ImageMatrix> PrepareForRecognition(IEnumerable <List <SubMatrix> > linedLetters) { var avgW = (int)linedLetters.First().Where(m => m != null).Average(m => m.Width); var avgH = (int)linedLetters.First().Where(m => m != null).Average(m => m.Height); return(linedLetters.SelectMany(a => { List <ImageMatrix> toRet = new List <ImageMatrix>(); toRet.AddRange(a.Select(l => { if (l == null) { return null; } var preRecognition = PreRecognizeDotOrComma(l, avgW, avgH); if (preRecognition != '_') { return new ImageMatrix(preRecognition); } return MatrixTools.Scale(l.ToFullMatrix()); })); toRet.Add(new ImageMatrix('\n')); return toRet; })); }
public void TestConnectedLettersDistnignuish() { var folder = Path.Combine(DATA.testFolder, "Test Defense"); var qwe = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "qwe.png")))); var q = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "q.png")))); var w = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "w.png")))); var e = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "e.png")))); qwe = qwe.CopyMatrix(new MatrixTools(qwe).TrimWhiteAreaAround()); q = q.CopyMatrix(new MatrixTools(q).TrimWhiteAreaAround()); w = w.CopyMatrix(new MatrixTools(w).TrimWhiteAreaAround()); e = e.CopyMatrix(new MatrixTools(e).TrimWhiteAreaAround()); qwe = MatrixTools.Scale(qwe, 150, 50); q = MatrixTools.Scale(q); w = MatrixTools.Scale(w); e = MatrixTools.Scale(e); var result = DefenseMechanism.SplitToSingleLetters(qwe, new List <ImageMatrix> { q, w, e }); if (result.Count != 3) { LogFail("Connected letters distinguish", "Received: " + result.Count.ToString() + " Expected: 3"); } else { LogPass("Connected letters distinguish"); } }
/// <summary> /// Take letters saved as grapic files and add them to the database. One image per letter. /// </summary> /// <param name="directory">Directory with images. Should be named as the font is meant to be.</param> public void ReadLettersFromDirectory(string directory, RecognitionModel model) { var files = Directory.GetFiles(directory); var matrices = files.Select(f => { var m = new ImageMatrix(new Bitmap(Image.FromFile(f))); var fileName = f.Substring(f.LastIndexOf(Path.DirectorySeparatorChar)); if (fileName.Contains("dot")) { m.Character = '.'; } else if (fileName.Contains("coma")) { m.Character = ','; } else { m.Character = fileName.First(); } return(MatrixTools.Scale(m.CopyMatrix(new MatrixTools(m).TrimWhiteAreaAround()))); }); var placeInDB = DataCollector.GenerateFontFolder(directory, model); SaveMatricesToDirectory(placeInDB, matrices); }
public void TestScaleDescaleComparison() { int width = 100; int height = 100; bool[][] mat = new bool[width][]; var rEngine = new Random(); for (int x = 0; x < mat.Length; ++x) { mat[x] = new bool[height]; for (int y = 0; y < mat[x].Length; ++y) { mat[x][y] = rEngine.Next(2) == 1 ? true : false; } } ImageMatrix matrix = new ImageMatrix(mat); var creator = new ImageCreator(); var scaled = MatrixTools.Scale(matrix, 50, 50); var descaled = MatrixTools.Scale(scaled, 100, 100); float s = MatrixTools.EqualPixelRatio(descaled, matrix); if (s > 0.5) { Console.WriteLine("TEST_Scaling: Passed, scale equality: " + s.ToString()); } else { Console.WriteLine("TEST_Scaling: fail, scale equality: " + s.ToString()); } }
/// <summary> /// Will compare upcoming letters to those stored in given font folder + will scale letters in those folder by given ratio /// </summary> /// <param name="font"></param> /// <param name="scalingRatio"></param> public VaryingLetterRecognizer(string font, float scalingRatio) { capitals = DataRetriever.Size_Font_Type_All(DATA.varyingSizeFolderNode, font, DATA.capitalsFolderNode) .Select(m => MatrixTools.Scale(m, scalingRatio)) .ToList(); normals = DataRetriever.Size_Font_Type_All(DATA.varyingSizeFolderNode, font, DATA.normalsFolderNode) .Select(m => MatrixTools.Scale(m, scalingRatio)) .ToList(); }
public void TestVaryingSizesComparison() { testName = "VaryingSizeComparison"; Random r = new Random(); int smallW = 5, smallH = 7; bool[][] smallMatrix = new bool[smallW][]; for (int x = 0; x < smallW; ++x) { smallMatrix[x] = new bool[smallH]; for (int y = 0; y < smallH; ++y) { smallMatrix[x][y] = r.Next(2) == 1 ? true : false; } } ImageMatrix main = new ImageMatrix(smallMatrix); ImageMatrix second = MatrixTools.Scale(main, 10, 6); var r2 = MatrixTools.EqualPixelRatioVaryingSize(main, second); TEST(r2 >= 0.99 && r2 <= 1.0, $"Comparison varying sizes is below 0.99, received ratio: {r2}"); }
public void TestScaling() { testName = "Scaling"; var matrix = new ImageMatrix(new Bitmap(Image.FromFile(simplePageUrl))); { matrix = MatrixTools.Scale(matrix); TEST(matrix.Width == DATA.letterWidth, $"Actual {matrix.Width}"); TEST(matrix.Height == DATA.letterHeight, $"Actual {matrix.Height}"); } { matrix = MatrixTools.Scale(matrix, 1.5f); TEST(matrix.Width == 60, $"Actual {matrix.Width}"); TEST(matrix.Height == 75, $"Actual {matrix.Height}"); } { matrix = MatrixTools.Scale(matrix, 100, 100); TEST(matrix.Width == 100, $"Actual {matrix.Width}"); TEST(matrix.Height == 100, $"Actual {matrix.Height}"); } { matrix = MatrixTools.Scale(matrix, 60, 30); TEST(matrix.Width == 60, $"Actual {matrix.Width}"); TEST(matrix.Height == 30, $"Actual {matrix.Height}"); } matrix = new ImageMatrix(new bool[][] { new bool[] { true, true, true, true }, new bool[] { true, true, true, true }, new bool[] { true, true, true, true }, new bool[] { true, true, true, true }, }); { matrix = MatrixTools.Scale(matrix); TEST(matrix.Matrix.SelectMany(a => a).All(b => b), "Not all pixels are black"); matrix = MatrixTools.Scale(matrix, 200, 40); TEST(matrix.Matrix.SelectMany(a => a).All(b => b), "Not all pixels are black"); } }
private void TestDisplay() { var folder = Path.Combine(DATA.testFolder, "Test Defense"); var qwe = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "qwe.png")))); var q = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "q.png")))); var w = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "w.png")))); var e = new ImageMatrix(new Bitmap(Image.FromFile(Path.Combine(folder, "e.png")))); qwe = qwe.CopyMatrix(new MatrixTools(qwe).TrimWhiteAreaAround()); q = q.CopyMatrix(new MatrixTools(q).TrimWhiteAreaAround()); w = w.CopyMatrix(new MatrixTools(w).TrimWhiteAreaAround()); e = e.CopyMatrix(new MatrixTools(e).TrimWhiteAreaAround()); qwe = MatrixTools.Scale(qwe, 150, 50); q = MatrixTools.Scale(q); w = MatrixTools.Scale(w); e = MatrixTools.Scale(e); var crt = new ImageCreator(); var result = Splitters.DefenseMechanism.SplitToSingleLetters(qwe, new List <ImageMatrix> { q, w, e }); pictures.AddRange(result.Select(a => crt.CreateImageOutOfMatrix(a))); pictureBoxLine.Image = pictures.First(); }