public void 部分行列確認その2() { var mat = new MatrixLib.Matrix(3, 3); mat[0, 0] = 1; mat[0, 1] = 2; mat[0, 2] = 3; mat[1, 0] = 4; mat[1, 1] = 5; mat[1, 2] = 6; mat[2, 0] = 7; mat[2, 1] = 8; mat[2, 2] = 9; var subMat = new SubMatrix(mat, 1, 1, 2, 2); subMat[0, 0] = -1; subMat[0, 1] = -2; subMat[1, 0] = -3; subMat[1, 1] = -4; Console.WriteLine(mat.ToString()); Console.WriteLine(mat.RowCount + " x " + mat.ColCount); Console.WriteLine("==================="); Console.WriteLine(subMat.ToString()); Console.WriteLine(subMat.RowCount + " x " + subMat.ColCount); Console.WriteLine("==================="); subMat = new SubMatrix(subMat, 1, 1, 1, 1); Console.WriteLine(subMat.ToString()); Console.WriteLine(subMat.RowCount + " x " + subMat.ColCount); }
/// <summary> /// Learn new style based on a clear page with separated letters from whole alphabet. Letters as on keyboard. /// Last 2 letters are dot and comma /// </summary> /// <param name="file">Path to file with letters.</param> public void AcknowledgeNewStyle(string file, RecognitionModel model) { List <ImageMatrix> letters = null; if (model == RecognitionModel.FixedSize) { letters = new MatrixSplitter(file).Letters; } else if (model == RecognitionModel.Resizing) { ImageMatrix main = new ImageMatrix(new Bitmap(Image.FromFile(file))); SubMatrix sub = new SubMatrix(main.Matrix, new Rectangle { X = 0, Y = 0, Height = main.Height, Width = main.Width }); var letterSplitter = new LetterSplitter(sub); letters = GetLines(sub).SelectMany(line => GetLetters(line, letterSplitter)).Select(s => s.ToFullMatrix()).ToList(); } var fileName = file.Substring(file.LastIndexOf(Path.DirectorySeparatorChar) + 1); var woExtension = fileName.Substring(0, fileName.IndexOf('.')); var placeInDB = DataCollector.GenerateFontFolder(woExtension, model); int i = 0; foreach (var l in letters.Take(letters.Count - 2)) { l.Character = NextChar(i++); } SaveMatricesToDirectory(placeInDB, letters); }
private SubMatrix TrimWhiteSpaceTopBot(SubMatrix matrix) { int top = 0, bot = 0; try { for (int y = 0; y < matrix.Height; ++y) { if (GetCountOfBlackInRow(matrix, y) > 0) { top = y; break; } } for (int y = matrix.Height - 1; y > 0; --y) { if (GetCountOfBlackInRow(matrix, y) > 0) { bot = y + 1; break; } } return(matrix.GetSubMatrix(new Rectangle { X = 0, Y = top, Width = matrix.Width, Height = bot - top })); } catch (Exception) { Console.WriteLine("Error for: {0} {1}", matrix.Height, matrix.Width); return(matrix); } }
private SubMatrix(SubMatrix prev, int deletedColumnIndex = -1) { this.source = null; this.prev = prev; this.ColumnIndex = deletedColumnIndex; Size = prev.Size - 1; }
public void 部分行列の確認() { var mat = new MatrixLib.Matrix(3, 3); mat[0, 0] = 1; mat[0, 1] = 2; mat[0, 2] = 3; mat[1, 0] = 4; mat[1, 1] = 5; mat[1, 2] = 6; mat[2, 0] = 7; mat[2, 1] = 8; mat[2, 2] = 9; var subMat = new SubMatrix(mat, 1, 1, 2, 2); subMat[0, 0] = -1; subMat[0, 1] = -2; subMat[1, 0] = -3; subMat[1, 1] = -4; Console.WriteLine(mat.ToString()); }
private List <SubMatrix> GetLetters(SubMatrix line, LetterSplitter letterSplitter) { letterSplitter.SetNewMatrix(line); var letters = letterSplitter.GetLetters(); //letters.Insert(0, line); return(letters); }
public SubMatrix(int[,] source, int[] replaceColumn) { this.source = source; this.replaceColumn = replaceColumn; this.prev = null; this.ColumnIndex = -1; Size = replaceColumn.Length; }
private char PreRecognizeDotOrComma(SubMatrix matrix, int averageWidth, int averageHeight) { if (matrix.Width < averageWidth && matrix.Height < averageHeight / 2) { return(CommaOrDot(matrix)); } return('_'); }
public MatrixSplitter(FileStream stream) { var matrix = new ImageMatrix(new Bitmap(Image.FromStream(stream))); var clearer = new BlurClearer(matrix); clearer.ClearShadows(); textMatrix = matrix.GetSubMatrix(new MatrixTools(matrix).FindTextSubmatrix()); }
private void PrepareImage() { workMatrix = new ImageMatrix(new Bitmap(Image.FromFile(simplePageUrl))); BlurClearer clearer = new BlurClearer(workMatrix); clearer.ClearShadows(); MatrixTools tools = new MatrixTools(workMatrix); matrix = workMatrix.GetSubMatrix(tools.FindTextSubmatrix()); }
public MyMatrix(int column, int row, int subColumn, int subRow) { _matrix = new SubMatrix[column, row]; for (var i = 0; i < column; i++) { for (var j = 0; j < row; j++) { _matrix[i, j] = new SubMatrix(subColumn, subRow); } } }
private int GetCountOfBlackInRow(SubMatrix matrix, int y) { int count = 0; for (int x = 0; x < matrix.Width; ++x) { if (matrix.Get(x, y)) { count++; } } return(count); }
public void IterateOver(SubMatrix matrix) { long count = 0; for (int x = 0; x < matrix.Width; ++x) { for (int y = 0; y < matrix.Height; ++y) { if (matrix.Get(x, y)) { count++; } } } }
private static int[] Solve(SubMatrix matrix) { int det = matrix.Det(); if (det == 0) { throw new ArgumentException("Ответ: Определитель равен 0"); } int[] answer = new int[matrix.Size]; for (int i = 0; i < matrix.Size; i++) { matrix.ColumnIndex = i; answer[i] = matrix.Det() / det; } return(answer); }
public void SubMatTest3() { var mat = new MatrixLib.Matrix(4, 4); mat[0, 0] = 1; mat[0, 1] = 2; mat[0, 2] = 3; mat[0, 3] = 4; mat[1, 0] = 5; mat[1, 1] = 6; mat[1, 2] = 7; mat[1, 3] = 8; mat[2, 0] = 9; mat[2, 1] = 10; mat[2, 2] = 11; mat[2, 3] = 12; mat[3, 0] = 13; mat[3, 1] = 14; mat[3, 2] = 15; mat[3, 3] = 16; var subMat = new SubMatrix(mat, 1, 1, 3, 3); subMat[0, 0] = -1; subMat[0, 1] = -2; subMat[1, 0] = -3; subMat[1, 1] = -4; Console.WriteLine(mat.ToString()); Console.WriteLine(mat.RowCount + " x " + mat.ColCount); Console.WriteLine("==================="); Console.WriteLine(subMat.ToString()); Console.WriteLine(subMat.RowCount + " x " + subMat.ColCount); Console.WriteLine("==================="); subMat = new SubMatrix(subMat, 1, 1, 2, 2); Console.WriteLine(subMat.ToString()); Console.WriteLine(subMat.RowCount + " x " + subMat.ColCount); }
public List <SubMatrix> SplitToLines(SubMatrix matrix) { image = matrix; List <int> whiteLinesIndexes = GetWhiteRows(); List <KeyValuePair <int, int> > indexToHeights = GetIndexesToHeight(whiteLinesIndexes).Result; whiteLinesIndexes.Clear(); var factory = new TaskFactory <Rectangle>(); var tasks = indexToHeights.Select(pair => factory.StartNew( () => GetLetterLine(pair.Key, pair.Value))).ToArray(); // met it like this????? //List<Rectangle> rectangles = tasks.Select(task => task.Result).ToList(); //rectangles.RemoveAll(rect => rect.IsEmpty); //rectangles.Clear(); //return indexToHeights.Select(kvp => new SubMatrix(matrix, new Rectangle { X = 0, Y = kvp.Key, Height = kvp.Value, Width = matrix.Width }) // ).ToList(); // return(tasks.Select(t => matrix.GetSubMatrix(t.Result)).ToList());// new SubMatrix(matrix.Matrix, t.Result)).ToList(); }
private void FillFormWithPictures(SubMatrix matrix) { ImageCreator creator = new ImageCreator(); pictures.Add(creator.CreateImageOutOfMatrix(matrix)); var lines = new Splitters.LineSplitter().SplitToLines(matrix); pictures.AddRange(lines.Select(r => creator.CreateImageOutOfMatrix(r))); lines.RemoveAll(b => b.Empty); var lsp = new Splitters.LetterSplitter(lines.First()); foreach (var line in lines) { lsp.SetNewMatrix(line); letters.AddRange(lsp.GetLetters()); } pictures.AddRange(letters.Where(mat => !mat.Empty).Select(mat => creator.CreateImageOutOfMatrix(mat))); pictureBoxLine.Image = pictures.First(); index = 0; }
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"); } }
public int Det() { if (Size == 1) { return(this[0, 0]); } if (Size == 2) { return(this[0, 0] * this[1, 1] - this[0, 1] * this[1, 0]); } SubMatrix m = new SubMatrix(this); int det = 0; int sign = 1; for (int c = 0; c < Size; c++) { m.ColumnIndex = c; int d = m.Det(); det += this[0, c] * d * sign; sign = -sign; } return(det); }
private char CommaOrDot(SubMatrix matrix) { return(Math.Abs(matrix.BlacksInColumn(matrix.Width / 2) - matrix.BlacksInRow(matrix.Height / 2)) < 5 ? '.' : ','); }
/// <summary> /// Calcula o determinante da matriz. /// </summary> /// <param name="data">A matriz.</param> /// <returns>O determinante.</returns> protected override ElementsType ComputeDeterminant(IMatrix <ElementsType> data) { if (data.GetLength(0) == 0) { return(this.ring.AdditiveUnity); } if (data.GetLength(0) == 1) { return(data[0, 0]); } else if (data.GetLength(1) == 2) { var firstDiagonal = this.ring.Multiply( data[0, 0], data[1, 1]); var secondDiagonal = this.ring.Multiply( data[0, 1], data[1, 0]); secondDiagonal = this.ring.AdditiveInverse(secondDiagonal); var result = this.ring.Add(firstDiagonal, secondDiagonal); return(result); } else { var matrixOrder = data.GetLength(0); var itemsNumber = this.expansionNumber < matrixOrder ? this.expansionNumber : 1; var linesZeroesCount = this.GetLinesByZeroesCount(data, itemsNumber); var columnsZeroesCount = this.GetColumnsByZeroesCount(data, itemsNumber); if (linesZeroesCount == null || columnsZeroesCount == null) { return(this.ring.AdditiveUnity); } else if (this.FixLines(linesZeroesCount.Item2, columnsZeroesCount.Item2)) { var inverseValue = this.ring.AdditiveInverse(this.ring.MultiplicativeUnity); var negativeSign = (linesZeroesCount.Item1.Sum() % 2 == 1); var linesToBeFixed = linesZeroesCount.Item1; var otherLinesToBeFixed = this.GetOtherCoords(linesToBeFixed, matrixOrder); var columnsCombinator = new CombinationAffector(matrixOrder, itemsNumber); var result = this.ring.AdditiveUnity; foreach (var columnsCombination in columnsCombinator) { var otherColumns = this.GetOtherCoords(columnsCombination, matrixOrder); var subMatrix = new SubMatrix <ElementsType>(data, linesToBeFixed, columnsCombination); var firstDeterminant = this.ComputeDeterminant(subMatrix); if (!this.ring.IsAdditiveUnity(firstDeterminant)) { subMatrix = new SubMatrix <ElementsType>(data, otherLinesToBeFixed, otherColumns); var secondDeterminant = this.ComputeDeterminant(subMatrix); var multiplied = this.ring.Multiply(firstDeterminant, secondDeterminant); if (negativeSign) { multiplied = this.ring.Multiply(multiplied, inverseValue); } result = this.ring.Add(result, multiplied); } negativeSign = !negativeSign; } return(result); } else { var inverseValue = this.ring.AdditiveInverse(this.ring.MultiplicativeUnity); var negativeSign = (linesZeroesCount.Item1.Sum() % 2 == 1); var columnsToBeFixed = columnsZeroesCount.Item1; var otherColumnsToBeFixed = this.GetOtherCoords(columnsToBeFixed, matrixOrder); var columnsCombinator = new CombinationAffector(matrixOrder, itemsNumber); var result = this.ring.AdditiveUnity; foreach (var linesCombination in columnsCombinator) { var otherLines = this.GetOtherCoords(linesCombination, matrixOrder); var subMatrix = new SubMatrix <ElementsType>(data, linesCombination, columnsToBeFixed); var firstDeterminant = this.ComputeDeterminant(subMatrix); if (!this.ring.IsAdditiveUnity(firstDeterminant)) { subMatrix = new SubMatrix <ElementsType>(data, otherLines, columnsToBeFixed); var secondDeterminant = this.ComputeDeterminant(subMatrix); var multiplied = this.ring.Multiply(firstDeterminant, secondDeterminant); if (negativeSign) { multiplied = this.ring.Multiply(multiplied, inverseValue); } result = this.ring.Add(result, multiplied); } negativeSign = !negativeSign; } return(result); } } }
public LetterSplitter SetNewMatrix(SubMatrix matrix) { this.matrix = matrix; return(this); }
private List <SubMatrix> GetLines(SubMatrix textMatrix) { return(new LineSplitter().SplitToLines(textMatrix)); }
public LetterSplitter(SubMatrix matrix) { this.matrix = matrix; }