メインコンテンツへスキップ
開発者ガイド

Tesseract OCR を Python で
pytesseract を使って。

pytesseract の完全で検証済みのガイドです。インストール、主要 API、画像前処理、PDF、信頼度スコア、PSM/OEM 設定、パフォーマンス、よくあるエラーの解決を網羅します。

クイックスタート(3 行)

先にエンジンをインストールしてから実行します。完全なセットアップは以下で説明します。

ocr.py
import pytesseract
from PIL import Image

text = pytesseract.image_to_string(Image.open("image.png"))
print(text)

pytesseract をインストール

pytesseract はラッパーにすぎません。tesseract バイナリを呼び出すため、先にエンジンが必要です。

bash
pip install pytesseract pillow
# 任意、前処理用:
pip install opencv-python numpy
# 任意、PDF 入力用:
pip install pdf2image

エンジンが PATH にない場合(Windows でよくある)、明示的に指定します。

python
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_xmlALTO XMLアーカイブ・図書館パイプライン

設定:PSM、OEM、言語、文字ホワイトリスト

オプションはスペース区切りの文字列として config= に渡します。

config.py
# 単一のテキストブロック、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(自動)。詳細はドキュメントをご覧ください。

画像前処理

きれいな入力が精度を左右する最大の要因です。特に重要な手順を以下に示します。

前処理.py
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))

座標と信頼度スコア

image_to_data で単語ごとの矩形と 0〜100 の信頼度を取得し、ノイズを除去します。

信頼度.py
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 のページをラスタライズします。

pdf.py
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_8UC13 チャンネル画像へのしきい値処理先に cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) で変換します。
Error opening data file ...fra.traineddata言語パックの欠落言語をインストールするか TESSDATA_PREFIX を設定します。
出力が空低 DPI、誤った PSM、テキストなし拡大し、--psm 6/7/11 を試し、前処理します。
ループで非常に遅い呼び出しごとにプロセス起動まとめる、multiprocessing、または tesserocr を使います。

精度を測定する

出力を目視で判断するのではなく、文字誤り率と単語誤り率を測定します。

eval.py
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 に切り替えてください。

エンジンとエコシステムを深く学びましょう。