Python OCR - 画像からテキストを取り出す

スキャンした画像やカメラ画像などから、テキストを抽出できると大変便利です。

テキストを抽出するにはOCR処理を行う必要があります。

今回はGoogle社が提供する「tesseract-ocr」を使って画像からテキストを抽出してみます。

インストール

まず下記サイトから「tesseract-ocr-w64-setup-v5.0.0-alpha.20200223.exe」をダウンロードしてインストールします。

tesseract-ocr - https://github.com/UB-Mannheim/tesseract/wiki

インストール中にコンポーネントを選択する画面が表示されますので
[Additional language data(download)] から、[Japanese] と [Japanese(vertical)] の2つを選択しておきます。

コンポーネント選択


次に「tesseract-ocr」をインストールしたフォルダ・パスを、環境変数 path に追加します。

私は「C:\Util」配下へインストールしましたが、みなさんの環境に合わせて設定して下さい。

環境変数(例)


最後に、pyocrをコンソールからインストールします。

「pyocr」は「tesseract-ocr」を使うためのライブラリで、pipコマンドで次のようにインストールします。

1
pip install pyocr

コーディング

Pythonで下記のようにコーディングし、実行します。
1
2
3
4
5
6
7
8
from PIL import Image
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
img = Image.open('c.png')
txt = tools[0].image_to_string(img, lang='jpn', builder=pyocr.builders.TextBuilder())
print(txt)
6行目には読み込ませる画像を設定します。 7行目のlangパラメータは 'jpn' が日本語、'eng' だと英語での認識となります。

検証1

最初に簡単だと思われる平仮名だけの画像で試してみました。

平仮名の画像

結果は「うとん」。
おしい・・・濁点が読み取れなかったようです。

検証2

次にアルファベットの画像を試してみました。

アルファベットの画像


結果は「SearchPrevlew」・・・・一瞬正解のように思えましたが 'i' のところを 'l' と誤って認識しています。

これは言語のパラメータを’jpn’から’eng’に変えて再度試したところ「SearchPreview」と正しく認識されました。
言語パラメータを合わせるのも大事なようです。

検証3

最後に漢字が含まれる2行の画像で試してみました。

漢字が含まれる2行の画像


結果は・・・

「ここにファイルをドラッグ&ドロップしてください。
 お使いのブラウザが対応していれば」

完璧です。

ただほかにも難しめの漢字などを試してみましたが結果はよくありませんでした。

最初に大まかにOCRでテキスト化して、最後に人が確認するというように分担すれば作業効率化を図ることは可能かと思います。参考になれば幸いです。