none
Bitmap型とはBMPのこと? RRS feed

  • 質問

  • お世話になっております。

    Tesseract-OCRという文字認識モジュールを使用しています。

    実際のコード:

    private string getOCRString(Bitmap bm)
    {
        var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn");
    
        var page = tesseract.Process(bm);
    
        return page.GetText();
    }

    このコードで、実際動作するのですが、文字認識精度が

    1.コマンドラインから使用する tesseract test.png output -l jpn

    2.上記DLLを使って使用する tesseract.Process()

    とで結果が違います。

    原因は、読込ませるファイルがBMPかPNGで大きく違い、PNGの方が精度が高い。

    そのため、引数のBitmap型にPNGを入れたいのですが、bmp.Save()で一旦
    ファイル出力する以外ないのでしょうか?

    メモリ上でPNGを読込んだ時と同じ状態に変換できないのでしょうか?


    追記:

    現在、スクリーンキャプチャより取得したBitmapデータからの変換と
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(@"C:\Users\30150026\Desktop\bbb.png");
    のようにして取得した結果とでは差異が出ています。

    2016年4月4日 6:42

回答

  • 検証を行っておらず申し訳ないのですが、下記のようなコードでどうでしょうか?

    private string getOCRString(Bitmap bm)
    {
        if (!bm.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                bm.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                bm = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream);
            }
        }
        var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn");
        var page = tesseract.Process(bm);
        return page.GetText();
    }


    2016年4月4日 7:25

すべての返信

  • 検証を行っておらず申し訳ないのですが、下記のようなコードでどうでしょうか?

    private string getOCRString(Bitmap bm)
    {
        if (!bm.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png))
        {
            using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
            {
                bm.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                bm = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream);
            }
        }
        var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn");
        var page = tesseract.Process(bm);
        return page.GetText();
    }


    2016年4月4日 7:25
  • kenjinoteさん、ご回答ありがとうございます。

    動作確認し、思い通りの動作を確認しました。
    (文字認識の精度が上がりました)

    本当に助かりました、ありがとうございました!

    2016年4月4日 8:49
  • 本筋は解決されているようですが、タイトルに対して一応コメントをつけておきます。

    Bitmap クラスはあくまで「画像」を表すものであり、概念的にはファイルフォーマットとは直接結びつきません。
    (Bitmap クラスのオブジェクトを作る際に与えたファイルパス、Stream によってある程度の性質を持ってしまうことはありますが…)

    しかし、提示されているコードで動作が変わると言うことは、「RawFormat に依存した処理がライブラリ内部にある」か、「Png を経由することによって結果的に PixelFormat が変わってうまくいく」かのいずれかがあるのかもしれませんね。

    2016年4月4日 13:26
    モデレータ
  • Azuleanさん、ご回答ありがとうございます。

    Bitmap クラスはあくまで「画像」を表すものであり、概念的にはファイルフォーマットとは直接結びつきません。

    私も調査したときは以下のように記載があったので(転載:MSDN)

    Bitmap は、ピクセル データで定義したイメージを処理する場合に使用するオブジェクトです。

    どのフォーマットであれ、同じ結果じゃないの?と思いこのような少し結びつかないタイトルと
    なってしまっていました。

    しかし、提示されているコードで動作が変わると言うことは、「RawFormat に依存した処理がライブラリ内部にある」か、「Png を経由することによって結果的に PixelFormat が変わってうまくいく」かのいずれかがあるのかもしれませんね。

    このモジュールの日本語資料が少ないため詳細な調査が出来ていませんが、そういうものなのかもしれませんね。
    もやもやしていたものが少しスッキリしました。またBitmapクラスについて勉強できました、ありがとうございました!

    動作検証:

    指定範囲をマウスキャプチャ(CopyFromScreen)をしてOCRに通した結果(BMP):精度が悪い
    前述のAndroidからスクリーンキャプチャして保存されたPNGファイルをロードしてOCRを通した結果(PNG):精度が良い

    2016年4月5日 0:28