AI-OCRを導入したのに読み取りが安定しない、というご相談の多くは、OCRエンジンではなく入力画像に原因があります。傾いた撮影、影や反射、低い解像度、裏写り。こうした画像をOCRの前に整える工程が「画像補正(前処理)」です。この記事では、前処理が何をするか、症状ごとの処理、効果をどう測るかを、発注側が判断できる粒度で説明します。
前処理はOCRエンジンを変えずに効かせる
前処理は、既存のAI-OCRの「前段」に置く工程です。OCRエンジンや契約を変える必要はなく、渡す画像の品質を揃えることで読み取りを安定させます。逆に言えば、前処理で直せるのは画像側の問題だけで、帳票の項目定義や辞書の問題は別の対策になります。
処理の流れは次のとおりです。
- 画像を受け取り、サイズ・向き・明るさなどの基本情報を取る。
- 補正できる状態かを判定する(極端に暗い、指で隠れているなど、補正不能なものは止める)。
- 症状に応じた補正をかける。
- 既存のOCRに渡し、信頼度が低い項目は人の確認に回す。
誤読の原因を4つに分ける
最初に行うのは、読めない画像を集めて原因を分類することです。当社は次の4分類から始めます。
| 分類 | よくある症状 | 主な原因 |
|---|---|---|
| 幾何(形) | 文字行が傾く、台形に歪む | 手持ち撮影、スキャナの斜め置き |
| 照明 | 片側が暗い、影が乗る、白飛び | 室内光、フラッシュ、光沢紙 |
| ノイズ・解像度 | 文字がつぶれる、点状の汚れ | 低解像度、JPEG圧縮、FAX |
| コントラスト | 文字が薄い、裏写りする | 薄い印字、薄い紙、複写 |
分類が済むと、どの補正に投資するかが決まります。全部を一度にやる必要はなく、件数の多い分類から順に取り組みます。
症状別の補正処理
代表的な処理と、OpenCVでの実装の目安です。関数名は実装者向けの参考で、案件ではこの中から必要なものだけを組み合わせます。
| 症状 | 処理 | 実装の目安 |
|---|---|---|
| 傾き | 文字行の角度を推定して回転(デスキュー) | minAreaRect や Hough変換で角度を求め warpAffine |
| 台形歪み | 用紙の四隅を検出して射影変換 | findContours → getPerspectiveTransform → warpPerspective |
| 影・照明ムラ | 背景の明るさを推定して割り戻す | モルフォロジー処理で背景を作り、元画像と除算 |
| 白黒化 | 明るさのしきい値で文字と背景を分ける | threshold(大津の方法)または adaptiveThreshold |
| ノイズ | 点状の汚れを平滑化 | medianBlur、fastNlMeansDenoising |
| 低コントラスト | 局所的にコントラストを伸ばす | CLAHE(createCLAHE) |
| 低解像度 | 拡大して文字の高さを確保 | resize。Tesseractの公式ドキュメントは300dpi前後を目安にしている |
import cv2
image = cv2.imread("invoice.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 局所コントラストを整えてから、大津の方法で二値化する
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
normalized = clahe.apply(gray)
_, binary = cv2.threshold(normalized, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)補正が逆効果になる場合
前処理は足せば足すほど良くなるものではありません。典型的な失敗は次の3つです。
- 二値化が強すぎて細い文字が消える。 大津の方法は画像全体で1つのしきい値を決めるので、照明ムラがある画像では一部が黒くつぶれます。ムラがある場合は局所的なしきい値(adaptive)に切り替えます。
- シャープ化でノイズまで強調する。 ぼやけを直そうとして、点状の汚れを文字の一部に見せてしまいます。
- 色を捨てて情報を失う。 赤字の訂正や押印を白黒化で消してしまうと、後工程で確認できません。
だからこそ、補正の採用は「元画像と比べて誤読が減ったか」で決めます。見た目が綺麗になったかでは判断しません。
効果の測り方
評価の設計が、前処理開発の半分を占めます。当社が案件で確認するのは次の4点です。
- 評価データに現場で困る画像を含める。 綺麗な見本だけで評価すると、本番で再現しません。分類ごとに、読めなかった実物の画像を集めます。
- 誤読と未読を分けて数える。 誤読(違う値を返す)は業務上の被害が大きく、未読(返さない)は人の作業に戻せます。両方を同じ「精度」で丸めません。
- 人の作業時間と一緒に見る。 誤読が減っても確認作業が増えれば、現場は楽になりません。合格ラインは「誤読率」と「人が確認する件数」の両方で置きます。
- 評価データと調整データを分ける。 補正の設定を合わせ込んだ画像で評価すると、良く見えすぎます。
既存システムへの組み込み
前処理はAPIとして切り出し、既存のAI-OCRの前段に置くのが一般的です。撮影アプリから受け取った画像を補正し、OCRへ渡し、信頼度の低い項目だけを人に回す。この流れなら、OCR側の契約や画面を変えずに導入できます。運用後は、帳票のレイアウトや撮影機器が変わったときに再評価する手順を決めておきます。
当社は、AI-OCR向けの画像自動補正モジュールをPoC・組み込み70万円、チューニング50万円、合計120万円(税別)・6週間の2フェーズで提案するモデルを持っています。これは現在提案中の構成であり、完了した実績ではありません。評価設計の詳細と、PoCで決めることはAI-OCRの画像補正・前処理開発と評価設計にまとめています。手元に「読めなかった画像」があれば、その傾向をお知らせいただくところから相談を始められます。相談フォームからお問い合わせください。
参照した公開情報
- OpenCV「Basic Thresholding Operations」: https://docs.opencv.org/4.x/db/d8e/tutorial_threshold.html
- OpenCV「Histograms - 2: Histogram Equalization(CLAHE)」: https://docs.opencv.org/4.x/d5/daf/tutorial_py_histogram_equalization.html
- Tesseract OCR「Improving the quality of the output」: https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html