出力品質の向上
Tesseract から高品質な出力を得られない理由は様々です。非常に珍しいフォントや新しい言語を使用しているのでない限り、Tesseract を再トレーニングしても効果は薄いということを覚えておくことが重要です。
画像処理
Tesseract は、実際の OCR を実行する前に (Leptonica ライブラリを使用して) さまざまな画像処理操作を内部的に実行します。一般的に、これは非常にうまく機能しますが、どうしても不十分な場合があり、その結果、精度が大幅に低下することがあります。
Tesseract の実行時に設定変数 tessedit_write_images
を true
に設定する (または設定ファイル get.images
を使用する) ことで、Tesseract が画像をどのように処理したかを確認できます。結果の tessinput.tif
ファイルに問題があるように見える場合は、画像を Tesseract に渡す前に、これらの画像処理操作を試してください。
画像の反転
Tesseract バージョン 3.05 (およびそれ以前) では、反転画像 (暗い背景と明るいテキスト) を問題なく処理できますが、4.x バージョンでは、明るい背景に暗いテキストを使用してください。
リサイズ
Tesseract は、少なくとも 300 dpi の DPI の画像で最適に動作するため、画像のリサイズが有益な場合があります。詳細については、FAQ を参照してください。
「Willus Dotkom」は、最適な画像解像度 に関する興味深いテストを実施し、大文字の高さ (ピクセル単位) の最適値の提案を行っています。
二値化
これは画像を白黒に変換するものです。Tesseract は (Otsu アルゴリズムを使用して) 内部的にこれを行いますが、特にページの背景の暗さが均一でない場合は、結果が最適とは言えないことがあります。
Tesseract 5.0.0 では、Adaptive Otsu と Sauvola の 2 つの新しい Leptonica ベースの二値化手法が追加されました。tesseract --print-parameters | grep thresholding_
を使用して、関連する設定可能なパラメータを確認してください。
より良い入力画像を提供することでこれを修正できない場合は、別のアルゴリズムを試すことができます。ImageJ Auto Threshold (java) または OpenCV Image Thresholding (python) または scikit-image Thresholding ドキュメント (python) を参照してください。
ノイズ除去
ノイズとは、画像の明るさや色のランダムな変化であり、画像のテキストを読みにくくする可能性があります。特定のタイプのノイズは、二値化ステップで Tesseract によって除去できないため、精度が低下する可能性があります。
膨張と収縮
太字の文字や細い文字 (特に セリフ のある文字) は、詳細の認識に影響を与え、認識精度を低下させる可能性があります。多くの画像処理プログラムでは、共通の背景に対して文字のエッジを 膨張および収縮させて、サイズを大きくする (膨張) または縮小する (収縮) ことができます。
歴史的文書からのインクのにじみがひどい場合は、収縮技術を使用することで補正できます。収縮は、文字を通常のグリフ構造に戻すために使用できます。
たとえば、GIMP の値伝播フィルターでは、下限しきい値を下げることで、余分に太字の歴史的なフォントの収縮を作成できます。
オリジナル
収縮適用後
回転/傾き補正
歪んだ画像とは、ページがまっすぐでない状態でスキャンされた場合のことです。ページが歪みすぎていると、Tesseract の行セグメンテーションの品質が大幅に低下し、OCR の品質に深刻な影響を与えます。これに対処するには、テキスト行が水平になるようにページ画像を回転させます。
境界線
境界線の欠落
境界線なしでテキスト領域のみを OCR すると、Tesseract で問題が発生する可能性があります。詳細については、Tesseract ユーザーフォーラム#427 を参照してください。ImageMagick® を使用して、小さな境界線 (例: 10 ピクセル) を簡単に追加できます。
convert 427-1.jpg -bordercolor White -border 10x10 427-1b.jpg
大きすぎる境界線
大きな境界線 (特に、大きな背景に 1 つの文字/数字または 1 つの単語を処理する場合) は、問題 ("空のページ") を引き起こす可能性があります。入力画像を、適切な境界線 (例: 10 ピクセル) を持つテキスト領域にトリミングしてみてください。
スキャン境界線の削除
スキャンしたページには、周囲に暗い境界線があることがよくあります。これらは、特に形状やグラデーションが異なる場合、追加の文字として誤って認識される可能性があります。
透明度/アルファチャンネル
一部の画像形式 (例: png) には、透明度機能を提供するアルファチャンネルを含めることができます。
Tesseract 3.0x では、Tesseract で画像を使用する前に、ユーザーが画像からアルファチャンネルを削除することを想定しています。これは、たとえば ImageMagick コマンドで実行できます。
convert input.png -alpha off output.png
Tesseract 4.00 では、leptonica 関数 pixRemoveAlpha() を使用してアルファチャンネルを削除します。アルファコンポーネントを白い背景とブレンドして削除します。場合によっては (映画の字幕の OCR など)、これにより問題が発生する可能性があるため、ユーザーは自分でアルファチャンネルを削除する (または画像の色を反転することで画像を前処理する) 必要があります。
ツール/ライブラリ
- Leptonica
- OpenCV
- ScanTailor Advanced
- ImageMagick
- unpaper
- ImageJ
- Gimp
- PRLib - OCR 品質を向上させるためのアルゴリズムを含む事前認識ライブラリ
例
プログラムで画質を向上させる方法の例が必要な場合は、次の例を参照してください。
- OpenCV - 回転 (傾き補正) - c++ の例
- Fred’s ImageMagick TEXTCLEANER - テキストの背景をクリーンにするためにスキャンしたテキスト文書を処理する bash スクリプト。
- rotation_spacing.py - テキスト画像の回転と行間隔を自動検出するための python スクリプト
- crop_morphology.py - Python、OpenCV、および numpy を使用して画像内のテキストブロックを検出
- OpenCV と Python を使用したクレジットカード OCR
- noteshrink - スキャンをクリーンアップする方法の python の例。詳細については、ブログ 手書きメモの圧縮と強化 を参照してください。
- uproject text - 画像の遠近感を回復する方法の python の例。詳細については、ブログ 楕円を使用してテキストを再投影する を参照してください。
- page_dewarp - 「立方体シート」モデルを使用したテキストページの歪み補正の python の例。詳細については、ブログ ページの歪み補正 を参照してください。
- OpenCV を使用してスキャンした画像から影を削除する方法
ページセグメンテーション手法
デフォルトでは、Tesseract は画像をセグメント化するときに、テキストのページを想定します。小さな領域の OCR を求めているだけの場合は、--psm
引数を使用して、別のセグメンテーションモードを試してください。トリミングされすぎているテキストに白い境界線を追加すると役立つ場合もあります。 issue 398 を参照してください。
サポートされているページセグメンテーションモードの完全なリストを表示するには、tesseract -h
を使用します。以下は 3.21 時点でのリストです。
0 Orientation and script detection (OSD) only.
1 Automatic page segmentation with OSD.
2 Automatic page segmentation, but no OSD, or OCR.
3 Fully automatic page segmentation, but no OSD. (Default)
4 Assume a single column of text of variable sizes.
5 Assume a single uniform block of vertically aligned text.
6 Assume a single uniform block of text.
7 Treat the image as a single text line.
8 Treat the image as a single word.
9 Treat the image as a single word in a circle.
10 Treat the image as a single character.
11 Sparse text. Find as much text as possible in no particular order.
12 Sparse text with OSD.
13 Raw line. Treat the image as a single text line,
bypassing hacks that are Tesseract-specific.
辞書、単語リスト、パターン
デフォルトでは、Tesseract は単語の文を認識するように最適化されています。レシート、価格表、コードなど、他のものを認識しようとしている場合は、結果の精度を向上させるためにできることがいくつかあります。また、適切なセグメンテーション方法が選択されていることを再確認してください。
テキストのほとんどが辞書にない単語である場合は、Tesseract が使用する辞書を無効にすると、認識が向上します。これらは、設定変数 load_system_dawg
と load_freq_dawg
の両方を false
に設定することで無効にできます。
認識を支援するために Tesseract が使用する単語リストに単語を追加したり、一般的な文字パターンを追加したりすることもできます。これにより、予想される入力の種類を把握している場合は、さらに精度を向上させることができます。詳細については、Tesseract マニュアルで説明されています。
言語で使用できる文字のサブセット (数字のみなど) しか使用しないことがわかっている場合は、設定変数 tessedit_char_whitelist
を使用できます。例については FAQ を参照してください。
テーブル認識
カスタムセグメンテーション/レイアウト分析なしで、テーブルからテキスト/データを認識するのに tesseract に問題があることがわかっています (issue トラッカーを参照)。Sintun の提案を試用/テストするか、PyTesseract と OpenCV を使用したテーブル画像からのテキスト抽出/Text-Extraction-Table-Image 用のコード からいくつかのアイデアを得ることができます。
まだ問題がありますか?
上記すべてを試しても、精度が低い結果が得られる場合は、理想的にはサンプル画像を投稿して、フォーラムで質問してください。