Тессеракт не может распознавать белые символы с узорами на его фоне - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу извлечь символы цифры, например "123", из изображения, которое имеет белые символы с фоновым рисунком позади.

Изображение:

https://i.stack.imgur.com/aeWPl.png

Моя среда разработки:

  • Microsoft Windows 10 Pro (версия 1903)
  • Сообщество Microsoft Visual Studio 2019
  • Microsoft. NET Framework 4.7.2
  • Windows приложение
  • OpenCvSharp4. Windows 4.2.0.20200108
  • Tesseract 4.1.0 -beta1

То, что я пробовал:

Я обработал изображение следующим образом:

  • Получение белой части изображение.
  • Реверс изображения.
  • Увеличение изображения.

Делая выше, я думал, что смогу извлечь символы. Но я не мог. Тессеракт вернул пустую строку.

Исходный код:

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using Tesseract;
using Size = OpenCvSharp.Size;

namespace TesseractSample {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {

            Assembly assm = Assembly.GetExecutingAssembly();
            string executing_directory_name = Path.GetDirectoryName(assm.Location);
            string tessdataPath = Path.Combine(executing_directory_name, "tessdata");

            using (Mat mat2 = new Mat(@"D:\Work\temp.bmp")) {

                using (var mat_hsv = mat2.CvtColor(ColorConversionCodes.BGR2HSV_FULL)) {

                    mat_hsv.ImWrite(@"D:\Work\mat_hsv.bmp");
                    InputArray lower_white = InputArray.Create(new int[3] { 0, 0, 100 });
                    InputArray upper_white = InputArray.Create(new int[3] { 180, 45, 255 });

                    using (Mat mat_mask_white = mat_hsv.InRange(lower_white, upper_white)) {

                        mat_mask_white.ImWrite(@"D:\Work\mat_mask_white.bmp");

                        using (Mat mat_reversed = Reverse(mat_mask_white)) {

                            mat_reversed.ImWrite(@"D:\Work\mat_reversed.bmp");

                            using (Mat mat_resized = new Mat()) {

                                Cv2.Resize(mat_reversed, mat_resized, new Size(mat_reversed.Width * 3, mat_reversed.Height * 3));
                                mat_resized.ImWrite(@"D:\Work\mat_resized.bmp");

                                using (var tesseract = new TesseractEngine(tessdataPath, "eng", EngineMode.LstmOnly)) {
                                    tesseract.SetVariable("tessedit_char_whitelist", "1234567890");
                                    var page = tesseract.Process(mat_reversed.ToBitmap());
                                    string text = page.GetText();
                                    MessageBox.Show(text: $"--->{text}<---");

                                }


                            }

                        }
                    }
                }
            }


        }

        public static Mat Reverse(Mat src) {

            Mat mat = src.Clone();

            for (var y = 0; y < mat.Height; y++) {
                for (var x = 0; x < mat.Width; x++) {
                    var px = mat.Get<Vec3b>(y, x);
                    px[0] = (byte)(255 - px[0]);
                    px[1] = (byte)(255 - px[1]);
                    px[2] = (byte)(255 - px[2]);
                    mat.Set(y, x, px);
                }
            }

            Cv2.ImShow("image", src);
            Cv2.WaitKey();

            return mat;

        }

    }
}

С уважением.

...