質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

Tesseractを使って、暗いムラのある模様の上に白い文字があるような画像から文字を抽出したい。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 111

firstlast

score 88

前提・実現したいこと

掲題の通りです。
下に掲載しているソースコードでは、文字を抽出することが出来ませんでした。
文字の白い部分を抜き出すような画像処理を施しています。

Tesseractのバージョンは
Tesseract 4.1.0-beta1
です。nugetから取得したものを使用しました。C#用のライブラリです。
また、画像処理には、OpenCvSharpを、これもnugetから取得したものを使用しています。
Tesseract, OpenCvSharpの使用は必須ではありませんが、これらを使用してプログラムを作成しているので、できればこれに沿った方法が希望です。

学習データについては、
https://www.nuget.org/packages/Tesseract/4.1
からTesseract4.0の本体と一緒にダウンロードインストールしたものを使用しました。英語の学習データだけです。
[tessdata]
├─eng.traineddata
├─eng.user-patterns
└─eng.user-words
実行ファイルと同じフォルダにこの学習データが格納されたフォルダを配置しています。

使用した画像は
イメージ説明
です。

ソースコードを下に掲載します。
Windows Formです。

よろしくお願い致します。

該当のソースコード

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;

        }

    }
}

環境

Microsoft Windows 10 Pro (Version 1903)
Microsoft Visual Studio Community 2019
Microsoft .NET Framework 4.7.2
Windows アプリケーション
OpenCvSharp4.Windows 4.2.0.20200108
Tesseract 4.1.0-beta1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • Tesseractを使って、暗いムラのある模様の上に白い文字があるような画像から文字を抽出したい。