Posted at

Pythonで画像からテキストを抽出する

More than 3 years have passed since last update.


概要

Pythonで画像データを読み込み、OCRでテキストデータに変換します。


環境


Python

この記事ではPython 2.7を使いました。


Tesseract-ocr

OCRエンジンです。Tesseract-ocr3.0.4を使いました。MacOS Xでインストールする場合はtesseract-ocrのtraining toolsをMacOS Xにインストールするもご覧ください。


pyocr

PythonからOCRエンジンを使うためのラッパーです。探すと同じようなラッパーがたくさんあるのですが、いくつか試してみて、コードを書きやすそうなものを選びました。リポジトリはこちら



$ pip install pyocr


PIL

Pythonで画像を扱うためのライブラリです。Pillowをインストールして使いました。



$ pip install pillow


コード例

サンプルのコードを元にした、画像からテキストを読み取って出力するコードはこんなかんじです。


pyocr_sample.py

from PIL import Image

import sys
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
print("No OCR tool found")
sys.exit(1)
# The tools are returned in the recommended order of usage
tool = tools[0]

txt = tool.image_to_string(
Image.open('sample.png'),
lang="jpn+eng",
builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print txt


tesseract_layout=6の部分はドキュメントには書いてありませんが、tesseractのコマンドのオプション-psm 6と同じです。どのようなレイアウトを想定して解析するかというオプションです。適切なものを選択するとだいぶbox抽出の精度がよくなります。デフォルトは-psm 3で自動判別ですが、できれば指定したほうが良いです。

なおtesseract-ocrで配布されている言語データをそのまま使うと、ちゃんと読み取れているのか不安になるレベルにひどい結果でした。ですが、きちんと調教した言語データを使えばそれなりに精度が向上します。