アップロードなし, 100%ローカル, アカウントなし

記事

OCR精度を上げる:テキスト認識の前に画像を整える

OCRの精度は、入力画像の品質に直結します。傾き・低コントラスト・ノイズのあるスキャンは、エンジンの性能に関わらず文字化けしたテキストを生み出します。実際に効果のある対処法を、実施すべき順番でまとめました。すべてブラウザ内でローカルに動作します。

OCRが実際のスキャンで苦労する理由

TesseractのようなOCRエンジンは、クリーンで水平かつ高コントラストのテキストで学習しています。ページを行に、行を単語に、単語を文字形状に分割し、それぞれをトレーニングモデルと照合します。実際のスキャンはこれらの前提を崩します。ページが数度傾いていたり、照明が均一でなかったり、解像度が低かったり、スキャナーベッドの端や裏ページが暗いノイズを加えたりします。これらの問題はいずれも、行・文字のセグメンテーション処理を誤らせ、セグメンテーションの誤りは文字の誤りへと連鎖します。別のエンジンを使うことが解決策になることはほとんどありません。肝心なのは、エンジンの前提が成り立つように画像を準備することです。実際には、前処理による精度向上は、OCRエンジンの選択による差よりも大きいです。

OCR前処理パイプラインの図: スキャンが認識エンジンに到達する前に、向き補正、傾き補正、トリミング、グレースケールの各ステップを経る流れ。

まず解像度から:300 DPIを目標にする

Tesseractは通常の本文テキストで300 DPI前後が最もよく機能します。おおよそ200 DPI未満では、各グリフのストロークが隣と混ざり合い、精度が急激に低下します。スキャンを自分で行う場合は、何よりも先にスキャナーを300 DPIに設定してください。これが最も影響の大きい単一の選択肢です。低解像度の画像しか持っていない場合、拡大しても記録されなかった詳細を復元することはできませんが、適度な拡大はセグメンテーションに使えるピクセルを増やすことで、接触している文字の分離を助けることがあります。非常に小さな印刷物は400〜600 DPIが有効ですが、それ以上にすると精度向上なしにファイルサイズが増えるだけです。ソースがPDFの場合は、まず各ページを目標DPIで画像にラスタライズしてから、その画像に対してOCRを実行してください。

向きを正しく設定する

ページが90・180・270度回転している場合、エンジンは横向きや上下逆に読むため意味不明な出力になります。Tesseractには向きとスクリプト検出(OSD)の処理があり、回転を推測できますが、テキストが少ないページ、フォーム、画像が多いページでは信頼性が低いです。ページ自身を正立させることで推測の要素をなくせます。このステップは可逆で即座です。90度の倍数で回転させると既存のピクセルが新しい位置に移動するだけで、品質コストもリサンプリングもありません。傾き補正の前にこれを行ってください。傾き補正はテキストがすでにほぼ水平であることを前提としているためです。

傾き補正:小さなゆがみを直す

ページをわずかに斜めに入れたときに生じる2〜3度の傾きでも、OCRには悪影響があります。水平な行を探す処理が1行のテキストを2行に分割したり、2行を1行にまとめたりしてしまいます。傾き補正は、テキスト行の主要な角度を計測し(プロジェクションプロファイルやHough変換解析がよく使われます)、ページを水平に戻します。90度回転とは違い、傾き補正は小さな任意角度の回転なのでピクセルをリサンプリングし、わずかなぼかしが生じます。ただ、その代償はほとんどの場合に見合います。水平な行はきれいにセグメント化され、精度向上は軽いぼかしを大きく上回るからです。向きを修正した後、トリミングの前に傾き補正を行ってください。

傾き補正の前後: 左に数度傾いたテキストページと、右側で水平に補正されて行が水平になった状態の比較。

テキスト範囲にトリミングしてノイズを除去する

読み取りたいテキスト以外のすべてが、エンジンが誤読しうるノイズです。スキャナーベッドの暗い縁、裏ページの一部、ホチキス留めの角、指、パンチ穴などが該当します。テキストブロックだけにトリミングすることで、これらの誤認識の的を取り除け、精度が向上するとともに認識が速くなります。エンジンが分析する面積が減るためです。複数段組のドキュメントでは、トリミング(または1段ずつOCRを実行すること)により、エンジンが段間の余白をまたいで読み、2列を1本のぐちゃぐちゃな行として混在させるのを防ぎます。コンテンツがフレーム内にきちんと収まるよう、傾き補正の後にトリミングしてください。

コントラスト・グレースケール・二値化の実際の仕組み

OCRは最終的に二値画像で動作します。各ピクセルはインクか紙かに判定されます。Tesseractはこれを内部でOtsu法を使って行います。画像のヒストグラムから1つのグローバル閾値を選択する方法です。ページの照明が均一でコントラストが良好なときはうまく機能しますが、影や色付き背景で一角が閾値の想定より暗くなると失敗します。確実な改善策は、グレースケールに変換して色かぶりが閾値を混乱させないようにすることと、照明を均一にしてページ全体が閾値の一方の側に収まるようにすることです。コントラストを適度に上げると薄いテキストに効果的です。逆効果になりやすいのは手動での強制二値化です。カットオフ値が間違った状態で自分で白黒に変換すると、エンジン独自の処理なら保持していた薄いストロークが消えてしまいます。二値化はエンジンに任せ、均一なグレースケール画像を入力してください。SunastyはPDF用にグレースケール変換を提供しています。細かいコントラスト調整にはデスクトップエディターのほうが優れていますが、スキャン時の均一な照明は、どのスライダーよりも影響が大きいです。

適切な言語を選択して出力を確認する

Tesseractは言語とスクリプトごとに個別のトレーニングデータファイルを読み込みます。英語モデルでフランス語やギリシャ語のテキストを処理すると、特にアクセント付き文字や非ラテン文字で回避可能なエラーが発生します。そのためドキュメントに合った言語を選択してください。最後に、OCR出力は最終回答ではなく下書きとして扱ってください。エンジンは名前のスペルが正しいかどうか、0がOでないかを知る手段がありません。数字・固有名詞・法的または財務的に重要な箇所を校正してください。表や複数段組のレイアウトは手動で構造を修正することを想定してください。OCRは認識したテキストのストリームを返すのであって、再構築されたレイアウトではないからです。

この記事で紹介するツール

よくある質問

ぼやけたスキャンを拡大するとOCRが改善されますか?

それだけではあまり効果はありません。拡大しても、スキャンで捉えられなかった詳細は復元できません。ぼやけた100 DPIの画像はぼやけたままです。適度な拡大は、セグメンテーションに使えるピクセルを増やすことで接触している文字の分離を助けることがありますが、300 DPIで再スキャンする方が、いかなる拡大処理よりもずっと効果的です。

先に自分で画像を白黒に変換すべきですか?

通常は不要です。TesseractはOtsu法で内部的に二値化を行います。カットオフが間違った手動の強制二値化はエンジンが保持していた薄いストロークを消してしまいます。代わりにグレースケールに変換して照明を均一にしてから、エンジンが自分で閾値を選ぶようにしてください。

テキストが横向きです。OCRが自動的に回転してくれますか?

場合によります。Tesseractには向き検出の処理がありますが、フォーム・テキストが少ないページ・画像が多いページでは信頼性が低いです。ページを90・180・270度回転させて自分で正立させることは可逆で、推測の要素をなくせます。これがより安全な選択です。

これらの処理でドキュメントがアップロードされますか?

いいえ。回転・傾き補正・トリミング・グレースケール変換、そしてOCR自体もすべてブラウザ内で動作します。OCRはTesseractのWebAssemblyビルドを使用しており、学習済み言語データは一度ダウンロードされてキャッシュされます。ファイルがデバイスから外に出ることはありません。

出典