【windows】pythonで画像内の文字を読み取る方法

【windows】pythonで画像内の文字を読み取る方法

windows10+pythonで画像に記載された文字を読取る方法を調べ、いくつか躓いた点があったのでやり方を書き留めます。

anacondaは使用しておりません。

動作環境

OS:windows 10
Pythonのバージョン:3.6.5
使用する外部ライブラリ:pyocr(バージョン0.5.3)
使用するOCRの技術:tesseract(バージョン4.0.0-beta.4.20180912)

Advertisement

pyocrのインストール

まず最初に、コマンドプロンプトでpyocrをインストールします。

pip install pyocr

公式ドキュメントWorld / OpenPaperwork / pyocr · GitLab

tesseractのインストール

次にOCRを行う「tesseract」のインストール。

Link:Home · tesseract-ocr/tesseract Wiki · GitHub
上記リンクのwindowsの箇所にある「Tesseract at UB Mannheim」のリンクから、自分の環境にあったインストーラーの実行ファイルをダウンロードします。

※私がダウンロードしたのは「tesseract-ocr-w64-setup-v4.0.0-beta.4.20180912.exe」

インストーラーの実行ファイルはすべてデフォルトの設定で行うと、CドライブのProgram Files (x86)の下に「Tesseract-OCR」がインストールされるようです。

しかし、私の場合は「C:\Users\ユーザー名\AppData\Local\Tesseract-OCR」にダウンロードしてあったので、もしProgram Files (x86)になければそちらを参照してみてください。

tesseractをpyocrで読み取る

次は「Tesseract-OCR」のフォルダ場所が分かったら、環境変数のPathに該当フォルダを追加します。

下記ソースコードがpyocrを用いてOCRツールが読み取れるかのサンプルコードになるので試してみてください。

from PIL import Image
import sys

import pyocr

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]
print("Will use tool '%s'" % (tool.get_name()))

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

「No OCR tool found」が出たら、Tesseract-OCRの読み取りに失敗しています。

私の場合、環境変数にpathを追加したのですがうまく行かなかったため、コマンドプロンプト上で最初に下記コマンドを用いて一時的にpathを追加してからソースコードを実行することで、Tesseract-OCRの読み取りに成功しました。

set path=%path%;C:\Users\ユーザ名\AppData\Local\Tesseract-OCR

ソースコードを実行し、下記のように表示されたら成功です。

Will use tool 'Tesseract (sh)'
Available languages: eng, osd
Will use lang 'eng'

デフォルトだと英語を読み取ることが可能です。日本語を対象にしたい方は別途調べてみてください。

画像から文字を読み取るソースコード

先程記載したソースコードに、画像から文字を読み取る下記ソースコードを追加してみてください。

txt = tool.image_to_string(
    Image.open('画像ファイル名'),
    lang=lang,
    builder=pyocr.builders.TextBuilder()
)
print( txt )

Image.openで「画像のファイル名.画像形式」を指定し、langで言語を指定。(この場合は”eng”)
builderで画像情報をテキストに変換です。

公式の情報をもとに上記コードを実行したのですが、私の場合はまたもやエラーコードが生じ、躓きました。

raise TesseractError(status, errors)
pyocr.error.TesseractError: (1, b"Error, unknown command line argument '-psm'\r\n")

調べたところ、ライブラリのpyocrがインストールされている箇所「~\Python\Python36\Lib\site-packages\pyocr」の「tesseract.py」が原因でした。

「–psm」と書くべきところを、「-psm」と書いている箇所があったようです。

変更前

def psm_parameter():
    """Return the psm option string depending on the Tesseract version."""
    version = get_version()
    return "--psm" if version[0] > 3 else "-psm"

変更後

def psm_parameter():
    """Return the psm option string depending on the Tesseract version."""
    version = get_version()
    return "--psm" if version[0] > 3 else "--psm"

私の場合はこれで無事画像ファイルないの文字を読み取り、テキストを出力することに成功しました。

調べてみると、「builders.py」でも同じように-psmと書かれている箇所を修正する必要がある方もいたようです。