Esempio n. 1
0
        private void buttonHistogram_Click(object sender, EventArgs e)
        {
            var highlighter = new TextDistinguish.HorizontalLineHighlighter(_sourceImage);
            var boundsLines = highlighter.CalculateHighlightingBoundsByExtremums();
            boundsLines = YLineBounds.FilterLittleLines(boundsLines, 4);

            var graphics = this._pictureBox.CreateGraphics();

            DrawLines(boundsLines, graphics, Color.Blue);

            var lineBitmaps = CutLines(_sourceImage, highlighter);

            var xHistGraphics = xHistPictureBox.CreateGraphics();
            var letterPen = new Pen(Color.Red);
            var recognitionText = new StringBuilder();
            var pers = Perseptron.FromFile(_perName);
            int ii = 0;
            for (int j = 0; j < boundsLines.Count(); j++)
            {
                var b = boundsLines.ElementAt(j);
                var line = lineBitmaps.ElementAt(j);
                var letterHighlighter = new LetteresHighlighter(line);

                var lettersBounds = letterHighlighter.CalculateHighlightingBoundsByExtremums();

                if (!lettersBounds.Any())
                {
                    System.Diagnostics.Debug.WriteLine("letters size = 0");
                    continue;
                }

                var resizedImgs = new List<int[]>();
                double avgLetterDistance = CalcAverageLetterDistance(lettersBounds);
                for(int li = 0; li < lettersBounds.Count(); li++)
                {
                    var letter = lettersBounds.ElementAt(li);
                    graphics.DrawLine(letterPen, new Point(letter.Start, b.Start), new Point(letter.Start, b.End));
                    graphics.DrawLine(letterPen, new Point(letter.End, b.Start), new Point(letter.End, b.End));
                    var letterBitmap = TextDistinguish.BitmapEditor.Cut(_sourceImage, new Point(letter.Start, b.Start),
                        new Point(letter.End, b.End));

                    var cuttedLetter = CutLines(letterBitmap);
                    if (cuttedLetter.Any() && cuttedLetter.Count == 1)
                    {
                        letterBitmap = cuttedLetter[0];
                    }
                    else
                    {
                        cuttedLetter = CutLines(AddTopAndBottomLines(letterBitmap));
                        if (cuttedLetter.Any() && cuttedLetter.Count == 1)
                        {
                            letterBitmap = cuttedLetter[0];
                            //letterBitmap.Save(String.Format("d:\\letters\\bad-{0}.jpg", ii));
                        }
                        else
                        {
                            //letterBitmap.Save(String.Format("d:\\letters\\pzds-bad-{0}.jpg", ii));
                        }
                    }

                    var resizedImg = ResizeImage(letterBitmap, new Size(30, 40));
                    //resizedImg.Save(String.Format("d:\\letters\\l{0}.jpg", ii++));

                    var letterAsInts = BitmapEditor.ImgToInts(resizedImg);
                    var classRes = pers.Classify(letterAsInts);

                    if (li > 0)
                    {
                        int distanceCurToPrev = lettersBounds.ElementAt(li).Start - lettersBounds.ElementAt(li - 1).End;
                        if (distanceCurToPrev > avgLetterDistance * 2)
                        {
                            recognitionText.Append(" ");
                        }
                    }

                    try
                    {
                        recognitionText.Append(determineSymbol(classRes));
                    }
                    catch
                    {
                        recognitionText.Append("-");
                    }
                };

                recognitionText.Append("\r\n");
            }
            System.Diagnostics.Debug.WriteLine(recognitionText);
            MessageBox.Show(recognitionText.ToString());

            DrawHistogramm();
        }
Esempio n. 2
0
        private List<Bitmap> CutLines(Bitmap bitmap, HorizontalLineHighlighter highlighter = null)
        {
            var lineHighlighter = highlighter ?? new HorizontalLineHighlighter(bitmap);
            var boundsLines = lineHighlighter.CalculateHighlightingBoundsByExtremums();

            var linesBitmaps = boundsLines.ToList().Select(b =>
            {
                return TextDistinguish.BitmapEditor.Cut(bitmap, new Point(0, b.Start), new Point(bitmap.Width, b.End));
            });

            return linesBitmaps.ToList();
        }