Tesseract: テキストはpngから認識されません

作成日 2015年06月19日  ·  21コメント  ·  ソース: charlesw/tesseract

私はこの想像を持っていますが、正八胞体は想像からのテキストを認識しません

banner2

テッセラクトを実行した後の出力は次のとおりです。

Ammmz e um

Bzndmary Pbffiularamr
ugsmmm gmmm
Rzfiaume P3 yMuiR:6aua
Stams Pay hefare 20'arnsrzz

question

全てのコメント21件

すでに前処理を行っているかどうかはわかりませんが、これが役立つ場合があります。 第115号では、役立つ可能性のあるいくつかの手法について説明しています。 tessedit_write_imagesオプション(問題#160で修正)を有効にして、どの画像がtesseractに供給されているかを正確に確認することもできます(tesseractはそれ自体で前処理を行います)。 最後に、あなたの例に固有のスターターとして、少なくとも次のことを行います。

  1. 画像のサイズを300dpiに変更します
  2. 関心領域をfieldscomponent \ panelのみに設定します(レイアウトが固定されていることを前提としています)
  3. 可能なフォームフィールド値をサポートするために単語とパターンの辞書を更新することを検討してください(https://code.google.com/p/tesseract-ocr/wiki/ImproveQuality#Dictionaries,_word_lists,_and_patternsを参照)。

私はあなたの手順に従おうとしました:
画像のサイズを変更し、画像(画像のごく一部)をトリミングし、グレースケールを適用して変数を設定しました( 'tessedit_write_images'をtrueに設定できません)。メソッドはtessedit_write_imagesの値を取得できませんでした。 だから私はコードを投稿します、多分コードに何か問題があります。

トリミングされた画像:
spscale
その後、これは結果です:、しかし十分ではありません

メリット
Dzscnmmn
リフィエレノス
詐欺

これは私のコードです:
public void CropImage()
{{
ビットマップ画像=新しいビットマップ(localPath);
// var rect = new Rectangle(130,10,125,70);
var rect = new Rectangle(60,10,70,70);
ビットマップimageCrop = image.Clone(rect、image.PixelFormat);
imageCrop.SetResolution(300、300);
グラフィックスg = Graphics.FromImage(imageCrop);
g.DrawImage(imageCrop、0、0);
g.Dispose();
imageCrop.Save(localPathCrop);
}

    public void GrayScaleImage()
    {
        Bitmap c = new Bitmap(localPathCrop);
        Bitmap d;
        int rgb;

        for (int y = 0; y < c.Height; y++)
            for (int x = 0; x < c.Width; x++)
            {
                Color pixelColor = c.GetPixel(x, y);
                rgb = (int)((pixelColor.R + pixelColor.G + pixelColor.B)/3);
                c.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
            }
        d = c;
        d.Save(localPathGrayScale);
    }

public void readOCR()
{{
var pathToLangFolder = @ "D:\ Automation Tests \ OCRTest \ Tesseract-OCR";

        using (var engine = new TesseractEngine(pathToLangFolder, "eng", EngineMode.Default))
        {
            engine.SetVariable("load_system_dawg", false);
            engine.SetVariable("load_freq_dawg", false);
            engine.SetVariable("tessedit_write_imag", true);
            bool result ;

            if (engine.TryGetBoolVariable("tessedit_write_imag", out result))
            {
                Assert.AreEqual(false, result, "The values are not equal");
            }
            else
            {
                Assert.Fail("Failed to retrieve value for '{0}'.", "tessedit_write_imag");
            }

            using (Bitmap image = new Bitmap(localPathGrayScale))
            {
                using (var pix = PixConverter.ToPix(image))
                {
                    using (var page = engine.Process(pix))
                    {
                        Console.WriteLine(page.GetMeanConfidence() + " : " + page.GetText());
                    }
                }
            }
        }
    }

画像をグレースケールに変換することに関して、実際の式は0.2126 * R + 0.7152 * G + 0.0722 * B (https://en.wikipedia.org/wiki/Grayscale)ですが、Pixはこの機能をPix.ConvertRGBToGray(すべてのパラメーターを0に設定してleptonicaによって定義されたデフォルト値を使用します)。 ただし、グレースケール画像を必要とする追加の処理(カスタムのthresholder \ binerizationアルゴリズムを実行するなど)を行わない限り、これを気にすることはありません。 Tesseractはすでにこれを行っており、ほとんどの場合、一般的に十分であると考えられていることに注意してください。

また、トリミング機能で画像のサイズを300dpiに正しく変更していないことも確信しています。 出力を確認すると、実際には同じサイズであることがわかると思います。 あなたがする必要があるのは、私たちにソースの解像度とそこからスケーリング係数を計算することです。 したがって、ソースが70 dpi(通常の画面解像度)であると仮定すると、次のようなものが機能するはずです。

public static Bitmap ResizeImage(Bitmap src, Single targetResolution)
{
        if(targetResolution <= 0.0f) throw new ArgumentOutOfRangeException ("targetResolution", "The target resolution must be greater than zero.");

        if(src.HorizontalResolution <= 0.0f) throw new ArgumentOutOfRangeException ("src", "The src image doesn't specify a horizontal resolution.");

        if(src.VerticalResolution<= 0.0f) throw new ArgumentOutOfRangleException("src", "The src image doesn't specify a vertical resolution.");

        Single horizontalScale = targetResolution / src.HorizontalResolution;
        Single verticalScale = targetResolution / src.VerticalResolution;

        Bitmap result = new Bitmap(src.Width * horizontalScale , src.Height * verticalScale);
        b.SetResolution(targetResolution, targetResolution )
        using (Graphics g = Graphics.FromImage((Image)b))
        {
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(src, 0, 0, result .Width  , result.Height);
        }
        return b;
}

最後に、 tessedit_write_imagesをtrueに設定しただけなので、次のコードは常に失敗します( tessedit_write_imagesではなくtessedit_write_imag tessedit_write_imagesことに注意してください:

engine.SetVariable("tessedit_write_images", true);
if (engine.TryGetBoolVariable("tessedit_write_images", out result))
{
    Assert.AreEqual(false, result, "The values are not equal");
}

おそらく必要なのは次のようなものです。

engine.SetVariable("tessedit_write_images", true);
if (engine.TryGetBoolVariable("tessedit_write_images", out result))
{
    Assert.AreEqual(true, result, "The variable 'tessedit_write_images' should be enabled.");
}

おそらく一般的な操作として、Pixのサイズ変更/スケーリングをサポートするための問題#183を作成したことに注意してください。 すぐに実装されるという約束はありません。

ResizeImageメソッドに関連して、b.SetResolution(targetResolution、targetResolution)の代わりに考えます
src.SetResolution(targetResolution、targetResolution)が必要ですか? また、ビットマップの結果でエラーが発生しました= new Bitmap(src.Width * Horizo​​ntalScale、src.Height * verticalScale);
引数1と2はfloatからstringに変換できません

申し訳ありませんが、 result.SetResolution(targetResolution, targetResolution) 、ビットマップの結果= new Bitmap((int)(src.Width * horizo​​ntalScale)、(int)(src.Height * verticalScale))

私があなたの変更を加えた後、これは結果ですが、それでも私が期待したものではありません

有益
Descnvhun
レクレノ:
状態

そして、これは変更後のCropImageメソッドです
public void CropImage()
{{
ビットマップ画像=新しいビットマップ(localPath);
var rect = new Rectangle(60,10,70,70);
ビットマップimageCrop = image.Clone(rect、image.PixelFormat);
ResizeImage(imageCrop、300);
imageCrop.Save(localPathCrop);

    }

申し訳ありませんが、アイデアが足りないので、十分な品質の画像ではない可能性があります。
まだ行っていない場合は、stackoverflowを試してみてください。

問題を修正する前に、これを乗り越えるアイデアはありますか?

Javaで同じtesseractライブラリを使用すると、何がおかしいのかご存知でしょう。問題なく動作します。 画像を切り抜く必要はありません。拡大縮小するだけです。

tesseractコマンドラインツールを使用するとどうなりますか?
2015年6月25日21:21、「FlorinMax」 [email protected]は次のように書いています。

Javaで同じtesseractライブラリを使用して、面白いことになりました。
正常に動作します。 画像を切り抜く必要はありません。拡大縮小するだけです。


このメールに直接返信するか、GitHubで表示してください
https://github.com/charlesw/tesseract/issues/182#issuecomment-115214245

いくつかのアップデートがあります。 問題を見つけようとした後、私は何が問題であったかを見つけました。 画像のサイズを変更する方法は、期待どおりに機能していません。 基本的に、このメソッドは画像のサイズを変更せず、同じ解像度で描画します。
だから、代わりに:
/ Bitmap result = new Bitmap((int)(src.Width * horizo​​ntalScale)、(int)(src.Height * verticalScale));
//result.SetResolution(targetResolution、targetResolution);

追加した :
int width =(int)(src.Width * Horizo​​ntalScale);
int height =(int)(src.Height * verticalScale);
ビットマップの結果=新しいビットマップ(src、幅、高さ);

この後、画像の解像度が高くなります。
寸法1334x 375
幅1334ピクセル
高さ375ピクセル
ビット深度32
画像からすべてのテキストを取得します。

以前のコメントで述べたように、Javaでは、AffineTransformを使用して、より良い解像度の画像を取得します。
寸法640x 180
幅640
高さ180ピクセル
ビット深度24

VSと同じように取得しようとすると、テキストが完全に認識されないため、最大のtargetresolutionを指定する必要があります。

結論として、Tesseractが問題ではなく、サイズ変更方法が問題であり、完全に最適化されていないと思います。

さて、今週末にサイズ変更を公開する時間を見つけることができるかどうかを確認します
レプトニカによるfrredの機能。 これらの種類の問題を解決する必要があります。
2015年6月26日23:54、「FlorinMax」 [email protected]は次のように書いています。

いくつかのアップデートがあります。 問題を見つけようとした後、私は何を見つけました
問題でした。 画像のサイズを変更する方法は、私たちが行っていることではありません
期待します。 基本的に、このメソッドは画像のサイズを変更せず、
同じ解像度。
だから、代わりに:
/ビットマップの結果=新しいビットマップ((int)(src.Width * horizo​​ntalScale)、
(int)(src.Height * verticalScale));
//result.SetResolution(targetResolution、targetResolution);

追加した :
int width =(int)(src.Width * Horizo​​ntalScale);
int height =(int)(src.Height * verticalScale);
ビットマップの結果=新しいビットマップ(src、幅、高さ);

この後、画像の解像度が高くなります。
寸法1334x 375
幅1334ピクセル
高さ375ピクセル
ビット深度32
画像からすべてのテキストを取得します。

以前のコメントで述べたように、Javaでは、AffineTransformを使用して、
より良い解像度の画像を取得します。
寸法640x 180
幅640
高さ180ピクセル
ビット深度24

VSと同じものを取得しようとすると、テキストが認識されません
完全に、私は最大のtargetresolutionを与えなければなりません。

結論として、Tesseractが問題ではなく、サイズ変更方法が問題でした
問題、そして私は完全に最適化されていないと思います。


このメールに直接返信するか、GitHubで表示してください
https://github.com/charlesw/tesseract/issues/182#issuecomment-115698001

Pixに新しいScaleメソッドを追加しました。これは、ユースケースでより適切に機能するはずです。 最新のソースコードを入手して試してみることができますか? build.batファイルをダブルクリックすると、NuGetパッケージをビルドできます。

build.batファイルはどこにありますか? NuGetPacagesからtesseractorcをアンインストールして、再インストールする必要がありますか?

とにかく...ライブラリの動作は非常に奇妙です。 すべての文字と数字を認識する場合もあれば、認識しない場合もあります。 数字を認識するのが難しい。 このために、画像からテキストを取得するために、targetresolutionで再生(増加/減少)する必要があります。 画像から日付を認識するのが最も難しいことがわかりました。

いいえ、ソースをチェックアウトし、ブランチを開発して、〜\ build.batを実行するだけです。
ローカルのnugetに追加して使用できるnugetパッケージを生成します
レポ。

申し訳ありませんが、私はこれにあまり精通していません。 たぶんあなたは私にもっと詳細を与えることができます...

Tesseract -masterで、build.batファイルを見つけました...これは1つですか?

はい。ただし、開発するにはブランチを変更する必要があります。 マスターのみ
リリースされたコードが含まれています。
2015年6月30日午後9時29分、「FlorinMax」 [email protected]は次のように書いています。

Tesseract -masterで、build.batファイルを見つけました...これは1つですか?


このメールに直接返信するか、GitHubで表示してください
https://github.com/charlesw/tesseract/issues/182#issuecomment-117134882

このページは役に立ちましたか?
0 / 5 - 0 評価