Tesseract OCR を Python で
pytesseract を使って。
pytesseract の完全で検証済みのガイドです。インストール、主要 API、画像前処理、PDF、信頼度スコア、PSM/OEM 設定、パフォーマンス、よくあるエラーの解決を網羅します。
クイックスタート(3 行)
先にエンジンをインストールしてから実行します。完全なセットアップは以下で説明します。
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open("image.png"))
print(text)pytesseract をインストール
pytesseract はラッパーにすぎません。tesseract バイナリを呼び出すため、先にエンジンが必要です。
pip install pytesseract pillow
# 任意、前処理用:
pip install opencv-python numpy
# 任意、PDF 入力用:
pip install pdf2imageエンジンが PATH にない場合(Windows でよくある)、明示的に指定します。
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"エンジンが初めての場合は、Windows・macOS・Linux・Docker・WSL 向けのインストールガイドをご覧ください。
主要 API
pytesseract は出力タイプごとに関数を提供します。必要なものに合わせて選びます。
| 関数 | 返すもの | 使う場面 |
|---|---|---|
image_to_string | プレーンテキスト | 認識したテキストだけが必要なとき |
image_to_data | 単語ごとの矩形 + 信頼度 | テキストのハイライト、低信頼度の除去 |
image_to_boxes | 文字ごとの矩形 | 文字単位の座標が必要なとき |
image_to_pdf_or_hocr | 検索可能 PDF または hOCR | 検索可能 PDF や Web オーバーレイの作成 |
image_to_osd | 向き・文字体系の検出 | OCR 前に回転や文字体系を検出 |
image_to_alto_xml | ALTO XML | アーカイブ・図書館パイプライン |
設定:PSM、OEM、言語、文字ホワイトリスト
オプションはスペース区切りの文字列として config= に渡します。
# 単一のテキストブロック、LSTM エンジン、日本語
text = pytesseract.image_to_string(img, lang="jpn", config="--oem 3 --psm 6")
# 数字のみ(レシートの合計、メーターの値)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")
# 複数言語の組み合わせ
text = pytesseract.image_to_string(img, lang="eng+jpn")| PSM | モード | 最適な用途 |
|---|---|---|
| 3 | 完全自動(既定) | 標準的な文書 |
| 4 | 可変サイズの単一列 | 記事、1 段組ページ |
| 6 | 均一なテキストブロック | 段落、ラベル |
| 7 | 単一のテキスト行 | 1 行のキャプション、単一フィールド |
| 8 | 単一の単語 | 個々の単語 |
| 11 | スパーステキスト | レシート、散在する UI テキスト |
| 13 | 生の行 | Tesseract 固有の処理なしの 1 行 |
OEM モード:--oem 1(LSTM のみ、v5 の既定)、--oem 0(レガシー)、--oem 3(自動)。詳細はドキュメントをご覧ください。
画像前処理
きれいな入力が精度を左右する最大の要因です。特に重要な手順を以下に示します。
import cv2, numpy as np, pytesseract
from PIL import Image
image = cv2.imread("receipt.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 小さい文字を約 300 DPI 相当に拡大
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# ノイズを除去し、Otsu で白黒 2 値化
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
text = pytesseract.image_to_string(Image.fromarray(binary))- グレースケール — しきい値処理の前に色チャンネルを除去します。
- 拡大 — 約 20 px 未満の文字は認識が悪いため拡大します。
- しきい値 — 均一な照明には Otsu、不均一な照明には適応的しきい値。
- ノイズ除去 — 軽いぼかしで句読点として読まれる斑点を除去します。
- 傾き補正 — OCR 前に
cv2.minAreaRectで回転を補正します。 - 余白の除去 — レイアウト解析を乱す暗いスキャン端を切り取ります。
座標と信頼度スコア
image_to_data で単語ごとの矩形と 0〜100 の信頼度を取得し、ノイズを除去します。
from pytesseract import Output
data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
if text.strip() and float(conf) > 60: # 低信頼度のノイズを除外
print(round(float(conf)), text)Python で PDF を OCR
Tesseract は画像を扱うため、まず pdf2image(poppler が必要)で PDF のページをラスタライズします。
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("scan.pdf", dpi=300) # poppler が必要
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("scan_searchable.pdf", "wb") as f:
writer.write(f)Windows では poppler の bin フォルダを poppler_path= で渡します。より高度なワークフローは出力形式のドキュメントをご覧ください。
パフォーマンス
pytesseract は呼び出しごとに CLI を実行するため、スループットは構成次第です。
| 手法 | 使う場面 | トレードオフ |
|---|---|---|
呼び出しごとの pytesseract | スクリプトや単発処理 | 呼び出しごとにプロセス起動 — ループで遅い |
| 複数ページ TIFF にまとめる | 同じ設定の多数ページ | 1 プロセスで多数ページを処理 |
multiprocessing | 独立した多数の画像 | 全コアを使用、メモリ増加 |
tesserocr | 大量処理、インプロセス | ネイティブバインディング、セットアップが増える |
エラーカタログ
以下のエラーで pytesseract の問題のほとんどをカバーできます。
| エラー | 原因 | 解決策 |
|---|---|---|
TesseractNotFoundError | バイナリ未インストールまたは PATH 外 | エンジンをインストールするか pytesseract.pytesseract.tesseract_cmd を設定します。 |
(-215:Assertion failed) src.type() == CV_8UC1 | 3 チャンネル画像へのしきい値処理 | 先に cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) で変換します。 |
Error opening data file ...fra.traineddata | 言語パックの欠落 | 言語をインストールするか TESSDATA_PREFIX を設定します。 |
| 出力が空 | 低 DPI、誤った PSM、テキストなし | 拡大し、--psm 6/7/11 を試し、前処理します。 |
| ループで非常に遅い | 呼び出しごとにプロセス起動 | まとめる、multiprocessing、または tesserocr を使います。 |
精度を測定する
出力を目視で判断するのではなく、文字誤り率と単語誤り率を測定します。
import pytesseract, jiwer
from PIL import Image
hypothesis = pytesseract.image_to_string(Image.open("sample.png"))
reference = open("sample.gt.txt").read()
print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))代表的な画像と正解テキストを少数の回帰テストとして保持し、前処理や設定を変更したときに再実行します。
Python のよくある質問
Python で Tesseract OCR を使うには?
先にエンジンをインストールし、pip install pytesseract pillow を実行します。Pillow で画像を開き pytesseract.image_to_string(img) を呼び出します。
TesseractNotFoundError になるのはなぜ?
pytesseract がバイナリを見つけられません。エンジンをインストールして PATH に入れるか、pytesseract.pytesseract.tesseract_cmd にフルパスを設定します。
精度を上げるには?
約 300 DPI に拡大、グレースケール、しきい値、ノイズ除去、傾き補正、適切な --psm。適切な lang= と、固定フィールドには文字ホワイトリストを使います。
PDF を OCR するには?
pdf2image(poppler 使用)でページを画像に変換し、各ページに pytesseract を実行し、image_to_pdf_or_hocr(..., extension="pdf") で結合します。
信頼度スコアを取得するには?
image_to_data(..., output_type=Output.DICT) を使い、conf リストでフィルタします。
pytesseract は遅い?
呼び出しごとにプロセスを起動します。まとめる、multiprocessing を使う、またはインプロセスの tesserocr に切り替えてください。
次のステップ
エンジンとエコシステムを深く学びましょう。