結論:PythonのOCRは「認識エンジンを選ぶこと」より「画像を読みやすく整える前処理」で結果が決まります。 同じエンジンでも、グレースケール化・二値化・傾き補正・拡大をやったかどうかで精度はまるで変わります。そして前処理は Pillow と OpenCV で書けて、Python画像認識コースならブラウザ上の本物のPythonでそのまま実行できます(無料・環境構築なし・会社PCに何もインストールしない)。
OCRとは何をしている技術か
OCR(Optical Character Recognition/光学文字認識)は、画像に写っている文字を、編集できるテキストに変換する技術です。スキャンしたPDF、スマホで撮ったレシート、スクリーンショット、FAXで届いた注文書——これらは人間には読めますが、コンピュータにとっては「色のついた点の集まり」でしかありません。その点の並びから「これはA」「これは5」と当てるのがOCRです。
まず読み取られる側の画像がどういうものかを、OCRとは何かでPillowを使って自分で作って表示できます(ブラウザで実行できます)。「文字を描いた画像を作る → それを読み取る」という往復を自分で作ると、以降の話が一気に具体的になります。
OCRの5段階:どこで精度が決まるか
OCRは1発の魔法ではなく、次の流れで成り立っています。
- 取得 — 撮影・スキャン・スクリーンショットで画像を得る
- 前処理 — グレースケール化、二値化、ノイズ除去、傾き補正
- 領域の検出 — 「どこに文字があるか」を見つけて切り出す
- 文字認識 — 切り出した領域をOCRエンジンに渡してテキストにする
- 後処理 — 明らかな誤りをルールや正規表現で直し、必要な形に整える
多くの人は4だけがOCRだと思っていますが、実際に結果を左右するのは2と3です。この全体像は認識までのパイプラインに図でまとめてあります(読み物)。
面白いのは、2と3はOCRエンジンがなくても練習できるということです。だからこそブラウザで手を動かせます。
精度を上げる前処理:何をどの順でやるか
グレースケール化
カラー画像は赤・緑・青の3枚が重なった状態で、情報量が3倍あります。しかしOCRが知りたいのは「そこが文字か背景か」だけなので、色は基本的に邪魔です。まず明るさだけの1枚にします。
なぜ白黒にするのかという理屈はカラーをグレースケールにするで、OpenCVでの実際の書き方はグレースケール化で扱っています。どちらもブラウザで実行して結果の画像を確認できます。
二値化(しきい値処理)
グレースケールはまだ灰色の階調が残っています。これを白か黒かの2択に振り分けるのが二値化です。文字と背景の境目がはっきりし、認識精度が大きく上がります。
ここで詰まるのが「しきい値をいくつにするか」です。明るさが均一なスキャン画像なら固定値でよいのですが、写真のように影のある画像だと、片側が真っ黒に潰れます。二値化としきい値で、しきい値を変えたときに画像がどう変わるかを実際に動かして体感してください。
ノイズ除去
感熱紙のかすれ、スキャン時のゴマ塩ノイズ、圧縮によるにじみは、細かい点として残ります。これがあると文字の一部と誤認されます。ぼかしフィルタで消すのが定石で、ノイズを消すで試せます。ただしかけすぎると文字までぼやけるので、強さの調整が要ります。
リサイズ(拡大)
意外と効くのがこれです。文字が小さすぎるとエンジンが形を判別できません。単純に拡大するだけで読めるようになることがよくあります。リサイズと拡大を参照。
傾き補正・反転
スキャンした書類は数度傾いていることがよくあり、行が斜めになると認識が崩れます。また白黒が反転している画像もあります。反転と傾き補正で、回転と反転をブラウザで動かせます。
文字の太さ調整と領域切り出し
かすれた文字を太らせる、くっついた文字を細らせる、といった調整がモルフォロジーです。さらに、輪郭を見つけると文字領域を切り出すで、「ページ全体を読む」のではなく「文字のかたまりだけを渡す」ことができるようになります。これも全部ブラウザで実行できます。
前処理を一本のパイプラインにまとめる回が前処理を組み合わせるです。単発の技を覚えたら、最後は必ずこの「順番に通す」形にまとめます。
OCRが苦手な画像
前処理でどうにもならないケースもあります。無理をせず、入力側を変えるほうが早いことが多いです。
- 手書き文字 — 活字に比べて格段に難しい。専用の手書き対応エンジンが要ります
- 背景が複雑 — 写真の上に文字が重なっている、模様の上に印字されている
- 極端に低い解像度 — 元の画素に情報が残っていなければ、拡大しても復元されません
- 縦書き・レイアウトが複雑な紙面 — 読み順の推定が難しい
- 罫線が文字に接触した帳票 — 罫線を先に消す処理が要ります
そして重要な発想として、「読まずに済ませられないか」を先に考えるというものがあります。IDや在庫番号ならQRコードやバーコードにしてしまえば、OCRより速く確実です。用途別の勘所は用途別のコツ(レシート・名刺・帳票・QR)にまとまっています(読み物)。
OCRエンジンの選択肢
前処理が終わったら、いよいよ文字認識です。代表的な選択肢は次のとおりです。
| 種類 | 特徴 |
|---|---|
| Tesseract(pytesseract) | 定番のオープンソースエンジン。無料で手元で動く。日本語も追加データで扱える |
| EasyOCR などのディープラーニング系 | 傾きや崩れに比較的強い。動かすのに相応の計算資源が要る |
| クラウドOCRサービス | 精度と手軽さは高いが、外部に画像を送るので社内規程の確認が必要 |
Tesseractの使い方はTesseractとpytesseract、言語指定とページ分割モードの設定は認識の設定、「どの文字をどれくらいの自信で読んだか」を取る方法は位置と信頼度で解説しています。ディープラーニング系はEasyOCRとディープラーニング系、クラウドサービスは次の一歩を参照してください。
これらのエンジン本体はブラウザ内では動かせないため、コースでは読み物として扱っています。前処理までを手で動かして理解し、エンジンは仕組みと使い分けを読んで押さえる、という構成です。
読み取った文字を業務でどう使うか
OCRの結果は、そのままでは使えません。0 と O、1 と l の取り違え、余計な空白や改行が必ず混ざります。ここを直すのが後処理です。
正規表現で「数字だけ取り出す」「日付の形に合うものだけ拾う」といったクレンジングをかけるのが基本で、認識結果の後処理でブラウザで実行しながら練習できます。正規表現そのものが不安なら、正規表現コースの最初のレッスンがパターンとテスト文字列をその場で照合できるので、そちらで先に慣れておくと楽です。
そのあとは表として集計する流れになります。読み取った値をCSVに書き出して、Pythonデータ分析コースのread_csvやgroupbyで月次に集計する、というのが定番の出口です。
つまり業務で使う形は、だいたいこうなります。
画像フォルダ → 前処理 → OCR → 正規表現で整形 → CSV/Excel → 集計
つまずきやすいところ
- ライブラリが読み込めない —
ModuleNotFoundErrorはインストール先と実行環境がずれているときによく出ます。原因と対処はPythonのエラー逆引きのModuleNotFoundErrorを参照。プロジェクトごとに環境を分ける話は仮想環境と pipにあります - 日本語が文字化けする — 読み取り結果の保存時に文字コードを指定していないケースが多いです。前提知識は文字コードを参照
- 一部の画像だけ極端に精度が悪い — 全体の設定をいじる前に、その画像だけ前処理の途中経過を表示して、どこで潰れているかを見ます
- 完璧を目指してしまう — OCRは100%になりません。「怪しい行だけ人がチェックする」設計にすると実用になります。信頼度を取れる位置と信頼度がその判断に使えます
Pythonが初めてでも大丈夫か
OCRのコードは、変数・リスト・関数が読めれば追えます。Pythonコースはprintから始まり、リスト・for文・関数まですべてブラウザで実行できるので、インストール作業ゼロで文法だけ先に流せます。エラーが出たときに慌てないために例外処理まで見ておくと安心です。
事務作業の自動化という広い入口から考えたい場合は、事務職の業務効率化はプログラミングで何から?で、ExcelマクロとPythonのどちらから始めるかを整理しています。Web上のデータを集めたいならPythonでWebスクレイピング入門が近い話です。
次に読む
- Python画像認識コース — 全24レッスン。Pillow・OpenCVでの前処理と領域検出はブラウザで実行、Tesseract・EasyOCRなどのエンジンは読み物
- OCRとは何か — まず1本、文字を描いた画像を作って表示してみる
- 前処理を組み合わせる — 覚えた前処理を一本のパイプラインにまとめる
- Pythonコース — 文法をゼロから、環境構築なしで
- Pythonデータ分析コース — 読み取った結果を表にして集計する
- 正規表現コース — 認識結果のクレンジングに直結
- 事務職の業務効率化はプログラミングで何から? — 自動化全体の入口