本文へスキップ
BecomeCoder
ブログ一覧Wikiコース一覧

PythonでOCR入門|画像の文字を読み取るやり方と精度を上げるコツ

#Python#OCR#画像処理#業務効率化#初心者

結論:PythonのOCRは「認識エンジンを選ぶこと」より「画像を読みやすく整える前処理」で結果が決まります。 同じエンジンでも、グレースケール化・二値化・傾き補正・拡大をやったかどうかで精度はまるで変わります。そして前処理は Pillow と OpenCV で書けて、Python画像認識コースならブラウザ上の本物のPythonでそのまま実行できます(無料・環境構築なし・会社PCに何もインストールしない)。

OCRとは何をしている技術か

OCR(Optical Character Recognition/光学文字認識)は、画像に写っている文字を、編集できるテキストに変換する技術です。スキャンしたPDF、スマホで撮ったレシート、スクリーンショット、FAXで届いた注文書——これらは人間には読めますが、コンピュータにとっては「色のついた点の集まり」でしかありません。その点の並びから「これはA」「これは5」と当てるのがOCRです。

まず読み取られる側の画像がどういうものかを、OCRとは何かでPillowを使って自分で作って表示できます(ブラウザで実行できます)。「文字を描いた画像を作る → それを読み取る」という往復を自分で作ると、以降の話が一気に具体的になります。

OCRの5段階:どこで精度が決まるか

OCRは1発の魔法ではなく、次の流れで成り立っています。

  1. 取得 — 撮影・スキャン・スクリーンショットで画像を得る
  2. 前処理 — グレースケール化、二値化、ノイズ除去、傾き補正
  3. 領域の検出 — 「どこに文字があるか」を見つけて切り出す
  4. 文字認識 — 切り出した領域をOCRエンジンに渡してテキストにする
  5. 後処理 — 明らかな誤りをルールや正規表現で直し、必要な形に整える

多くの人は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 → 集計

つまずきやすいところ

Pythonが初めてでも大丈夫か

OCRのコードは、変数・リスト・関数が読めれば追えます。Pythonコースはprintから始まり、リスト・for文・関数まですべてブラウザで実行できるので、インストール作業ゼロで文法だけ先に流せます。エラーが出たときに慌てないために例外処理まで見ておくと安心です。

事務作業の自動化という広い入口から考えたい場合は、事務職の業務効率化はプログラミングで何から?で、ExcelマクロとPythonのどちらから始めるかを整理しています。Web上のデータを集めたいならPythonでWebスクレイピング入門が近い話です。

次に読む

← ブログ一覧に戻る