Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        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); }
        }
Example #4
0
 private SubMatrix(SubMatrix prev, int deletedColumnIndex = -1)
 {
     this.source      = null;
     this.prev        = prev;
     this.ColumnIndex = deletedColumnIndex;
     Size             = prev.Size - 1;
 }
Example #5
0
        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());
        }
Example #6
0
        private List <SubMatrix> GetLetters(SubMatrix line, LetterSplitter letterSplitter)
        {
            letterSplitter.SetNewMatrix(line);
            var letters = letterSplitter.GetLetters();

            //letters.Insert(0, line);
            return(letters);
        }
Example #7
0
 public SubMatrix(int[,] source, int[] replaceColumn)
 {
     this.source        = source;
     this.replaceColumn = replaceColumn;
     this.prev          = null;
     this.ColumnIndex   = -1;
     Size = replaceColumn.Length;
 }
Example #8
0
 private char PreRecognizeDotOrComma(SubMatrix matrix, int averageWidth, int averageHeight)
 {
     if (matrix.Width < averageWidth && matrix.Height < averageHeight / 2)
     {
         return(CommaOrDot(matrix));
     }
     return('_');
 }
Example #9
0
        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());
        }
Example #10
0
        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());
        }
Example #11
0
 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);
         }
     }
 }
Example #12
0
        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);
        }
Example #13
0
        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++;
                    }
                }
            }
        }
Example #14
0
    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);
    }
Example #15
0
        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);
        }
Example #16
0
        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();
        }
Example #17
0
        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;
        }
Example #18
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");
            }
        }
Example #19
0
        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);
        }
Example #20
0
 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);
                }
            }
        }
Example #22
0
 public LetterSplitter SetNewMatrix(SubMatrix matrix)
 {
     this.matrix = matrix;
     return(this);
 }
Example #23
0
 private List <SubMatrix> GetLines(SubMatrix textMatrix)
 {
     return(new LineSplitter().SplitToLines(textMatrix));
 }
Example #24
0
 public LetterSplitter(SubMatrix matrix)
 {
     this.matrix = matrix;
 }