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(); }
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(); }