【Python入門】画像処理で文字認識をしてみる【VSCode/PyOCR/Tesseract】

この記事では、Pythonで画像を加工するためのライブラリ「PyOCR」とOCRエンジン「Tesseract」を使用して、画像ファイルから文字を認識させる処理を作る方法を解説します。

目次

使用するライブラリ等

  • PyOCR
  • Pillow
  • Tesseract

PyOCR(パイオーシーアール)

PythonでOCR(画像から文字を読み取ってPCが読み取れる文字コードに変換する)を行うためのライブラリ。
PyOCRをインストールすることで、この後説明する「Pillow」もインストールされます。
(内部でPillowを使っているってこと…?)

Pillow(ピロウ)

Pythonで画像を加工するためのライブラリ。画像の切り抜きなどの加工ができる。

Tesseract(テッセラクト)

GoogleとHPが共同開発したOCRエンジン
これはPython用のライブラリではないため直接制御できない。
そのため、PyOCRでTesseractのエンジンを使うように橋渡しする必要がある。

PyOCRをインストールする

VSCodeでライブラリをインストールしてみましょう。
(管理人も書きながら初挑戦です)

ライブラリのインストールはターミナルで「pip」というコマンドを使います。

PyOCRをインストールするコマンドは以下の通りです。
ちなみに、最後の”pyocr”を他のライブラリ名に変更すれば他のライブラリもインストールできるみたいですね。

py -m pip install pyocr


インストール完了!
PyOCRと一緒にPillowもインストールされていますね。

Tesseractをインストールする

インストーラを入手する

TesseractはPyOCRのようなライブラリではなく外部ツールなので、インストーラを入手してインストールします。

インストールは以下からダウンロードできます。

インストールする

ダウンロードが完了したらダブルクリックして実行します。

警告が出ますが実行します。
(念のためウイルススキャンしました)

日本語に対応させる

進んでいくとインストール内容を選択する画面が表示されます。
ここで日本語用のスクリプトと言語データを追加します。

インストール完了

あとは指示通りに進めていくだけで完了です。

ドキュメントを作成する

ここまでで環境の準備が整いました。
今回の「文字認識をする」プロジェクトのフォルダをVSCodeから作成しましょう。
(VSCodeの基本操作の理解をするパートです)

フォルダを作成、選択する

今回のプロジェクトをまとめるフォルダを作りましょう。

普段のようにエクスプローラーから作ってもいいですが、後々そのフォルダをVSCodeで開く必要があるので、一緒にやっちゃいます。

VSCodeのようこそ画面、もしくはツールバーの「ファイル」から「フォルダーを開く…」を選択します。

あとはそのまま通常通りにフォルダを作って選択し、「フォルダの選択」ボタンを押します。

管理人は今回適当な場所に「Python」フォルダを作り、その中に「OCR」というフォルダを作りました。
ここを以降の作業場所とします。

VSCodeのエクスプローラーにOCRフォルダが指定されました。
ここにソースファイルだったりを入れていきます。

ソースファイルを作成する

実際にPythonのコードを入力するソースファイルを作成します。

OCRフォルダの横にあるボタンからファイルを作成します。
(右クリック→新しいファイル でもできます)
ファイル名は「OCR.py」としておきましょう。

「OCR.py」というファイルが作成されて、編集状態になります。

Pythonの拡張子
Pythonの拡張子は“.py”です。
コードを記入したテキストファイルの拡張子を”.py”に変更すればPythonのソースファイルになります。

コードを書く

早速コードを書いていきましょう。
大まかな構成は以下の通りです。

  • システムの利用を宣言する
  • PyOCRを読み込む
  • Tesseractのインストール場所をOSに教える
  • OCRエンジンを取得する
  • 画像を取得する
  • 文字を取得する
  • 取得した文字を出力する

完成品はコチラです。

一つずつ見ていきましょう。

システムの利用を宣言する

環境変数を使用するため「OSおよびSYSを使います」という宣言をします。

#システムの利用を宣言する
import os
import sys

import os
「OSの機能を使うよ」の宣言

import sys
「システムの機能を使うよ」の宣言
※エラーが発生した際にプログラムを修正する処理に使用します。

環境変数とは?
OSが持っている変数のこと。
色んなプログラムで共有できる。
今回は os.environ[“PATH”] で色んなプログラムのインストール先を持っているリストを使用する。


PyOCRを読み込む

「PyOCRを使います!」という宣言をします。

#PyOCRを読み込む
from PIL import Image
import pyocr

from PIL import Image
「Pillow(PIL)のImageという関数を使うよ」の宣言

import pyocr
「PyOCRを使うよ」の宣言

Tesseractのインストール場所をOSに教える

次にPyOCR経由でTesseractのOCRエンジンを使用するため、Tesseractのインストール先をOSに教えてあげます。

管理人の場合は特にインストール先など変更しなかったため、以下に使用するファイルが格納されていました。
C:\Program Files\Tesseract-OCR

#Tesseractのインストール場所をOSに教える
tesseract_path = "C:\Program Files\Tesseract-OCR"
if tesseract_path not in os.environ["PATH"].split(os.pathsep):
    os.environ["PATH"] += os.pathsep + tesseract_path

やっていることは「環境変数のパスの一覧にTesseractが入っていなかったら追記する」という処理です。

OCRエンジンを取得する

PyOCRのOCRエンジンを取得し、Toolとして登録します。
IF文でOCRエンジンが見つからなかったらプログラムを終了します。

#OCRエンジンを取得する
tools = pyocr.get_available_tools() 
if len(tools) == 0:
    print("OCRエンジンが指定されていません")
    sys.exit(1)
else:
    tool = tools[0]

画像を取得する

画像ファイルのパスを指定して読み込みます。
今回は以下に保存している「hiragana.png」を読み込んでみます。

#画像の読み込み
img = Image.open("image/hiragana.png")

正しく読み込めているかを確認するため、表示させる分も入れましょう。

#画像の読み込み
img = Image.open("image/hiragana.png")
img.show()

コードを入力して、画面右上の実行ボタン(もしくはF5キー)を押します。

ウィンドウが起動し、画像が表示されました。
ここまでの処理は問題なさそうです。

文字を取得する

画像が読み込めたので文字を読み取ります。

#文字を読み取る
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
result = tool.image_to_string(img,lang="jpn",builder=builder)

やっていることは…

  1. ビルダー(PyOCRを実行してくれるもの?)と、その中で使用するTesseractのオプション(tesseract_layout)指定する
  2. 画像ファイル、読み取る言語、ビルダーを指定して、image_to_string関数で画像から文字を取得する

ビルダーの種類やTesseract_Layoutにもいろいろ種類があります。
読み取るもの(数字、文字など)によって変わるので、うまく読み取れないときは変えてみましょう。

詳細は以下の参考にさせていただいたサイト様をご参照ください。
(他力本願)

取得した文字を出力する

文字を取得したら出力しましょう。

#結果を出力する
print(result)

ここは分かりやすいですね。
取得したresultをprintで出力するだけです。

結果を確認する

コードの入力が完了したので、実行して結果を確認しましょう。

画面下部のターミナルに結果が出力されます。
ターミナルが表示されていない場合は Ctrl+@ でターミナルが表示されます。

ばいそん…

精度はまだまだ改善の余地がありそうですね…

おわりに

お疲れさまでした!
精度は要改善ですが、ひとまずOCRはできましたね!
ここから精度を上げるも良し、複数行の画像やイラストなどが入った画像に挑戦するも良し、皆さんのやりたいことを広げていきましょう!