導入
OCR は対象によって「効く前処理」と「注意点」が違います。代表的な用途ごとの勘所を押さえておくと、現場で迷いません。
説明
- レシート・領収書: 感熱紙は薄く・かすれやすい。二値化(Otsu)+拡大が効きます。項目は行単位なので
--psm 6。合計金額は「合計/計/totalの近くの数字」を正規表現で拾うと安定します。 - 名刺: レイアウトが自由で、ロゴや装飾が邪魔をします。文字領域の検出(第4章)で本文だけ切り出すと精度が上がります。会社名・氏名・電話・メールは、
@や-などの記号パターンで振り分けます。 - 帳票・申込書: 位置がほぼ固定なら、**「この座標の欄だけ読む」**のが最強です。
image_to_dataの位置情報(第5章)や、決まった矩形の切り出しを使います。罫線はモルフォロジーで消すと文字が読みやすくなります。 - ナンバープレート・看板: 傾き・反射・影が大きい。傾き補正と、明るさムラに強い適応的二値化(
cv2.adaptiveThreshold)が候補です。 - QR・バーコード: これは OCR ではなく専用デコーダの仕事です。OpenCV の
cv2.QRCodeDetectorやpyzbarを使います。「文字を読む」より確実で速いので、IDや在庫管理はコード化してしまうのが実務の定石です。
# 帳票で「決まった欄」だけを切り出して読む発想(イメージ)
import cv2, pytesseract
img = cv2.imread("form.png", cv2.IMREAD_GRAYSCALE)
name_area = img[100:140, 200:500] # 氏名欄の座標(あらかじめ決めておく)
name = pytesseract.image_to_string(name_area, lang="jpn", config="--psm 7")
print("氏名:", name.strip())
「全部を賢く読む」より「読む範囲を絞る・読まずに済ませる」ほうが、現場では効くことが多いと覚えておきましょう。
演習
このレッスンは読み物です。手元に「読み取りたい書類」を1つ思い浮かべ、①どんな前処理が効きそうか、②位置が固定なら欄を切り出せないか、③そもそもQR等でコード化できないか——の3点で考える癖をつけましょう。