Pythonで画像からテキストを抽出する方法(OCR)

Python

本日はPythonで画像からテキストを抽出する方法を解説します。
次の順番で解説してゆきます。

  • 光学式文字認識エンジン(Tesseract)のインストール
  • 光学式文字認識エンジン(Tesseract)で画像からテキストを抽出する方法
  • 光学式文字認識エンジン(Tesseract)をPython上で使用する方法

OSはWindowsを前提とし、開発環境はJupyterLab Desktopを使用します。

光学式文字認識エンジン(Tesseract)のインストール

まずは画像からテキストを抽出するために、Tesseractという光学式文字認識エンジンをインストールします。
TesseractはGoogleが開発したソフトウェアで、無料で使うことができます。

GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository)
Tesseract Open Source OCR Engine (main repository) - tesseract-ocr/tesseract

それではまず、Windows用のインストーラーをダウンロードします。

インストーラーのダウンロードが完了したらクリックしてインストーラーを起動します。

起動したらインストール時の表示言語を選びます。日本語はないので英語を選びます。

ここではNextをクリックします。

ライセンスに関する規約を一通り読み終えたらI Agreeをクリックします。

インストールするTesseractをPCユーザーの全員が使えるようにするか、現在ログインしているユーザーのみ使えるようにするかを選びます。
今回はPCユーザー全員使えるようにする方を選びます。

次は追加でインストールするオプションを選択します。
ここの設定を追加することで日本語版をインストールできます。

Additional script data(download)のJapanese scriptとJapanese vertical scriptをチェックします。

Additional language data(download)のJapaneseとJapanese(vertical)をチェックしてNextをクリックします。

続いてインストール先を選びます。ここはデフォルトのフォルダで問題ありません。そのままNextをクリックします。

スタートメニューのフォルダを選択します。ここもデフォルトのままInstallをクリックします。

これでTesseractのインストールが完了しました。Finishをクリックします。

光学式文字認識エンジン(Tesseract)で画像からテキストを抽出する方法

それでは先ほどインストールしたTesseractを実行してみましょう。

tesseract.exeのパス 対象の画像 stdout -l jpnで対象の画像から日本語を抽出し、標準出力できます。

 C:'\Program Files'\Tesseract-OCR\tesseract.exe .\thumbnail.png stdout -l jpn

抽出対象とする画像は本記事のサムネイルを使用します。

動画タイトルの部分はきれいに抽出できていることがわかります。

また、tesseract.exeのパス 対象の画像 出力ファイル -l jpnで対象の画像から日本語を抽出し、ファイルに出力できます。

 C:'\Program Files'\Tesseract-OCR\tesseract.exe .\thumbnail.png ocr_result_output.txt -l jpn

光学式文字認識エンジン(Tesseract)をPython上で使用する方法

続いて、TesseractをPython上で使用する方法を解説します。

まずはファイル一覧上に対象とする画像ファイルを用意します。ドラッグアンドドロップで画像をコピーできます。

続いて、pyocrをインストールします。pyocrとは、TesseractをPythonから扱うためのライブラリです。%pip install pyocrをNotebookのセルに入力して実行するとインストールできます。

続いて、Tesseractのパスを設定します。

import os
path_tesseract = "C:\\Program Files\\Tesseract-OCR"
if path_tesseract not in os.environ["PATH"].split(os.pathsep):
    os.environ["PATH"] += os.pathsep + path_tesseract

上記のコードでパスを設定しております。

...
if path_tesseract not in os.environ["PATH"].split(os.pathsep):
...

赤線で引いた部分は環境変数にTesseractのパスが設定されているかどうか判断しています。

...
    os.environ["PATH"] += os.pathsep + path_tesseract

環境変数が設定されていない場合はIF文内の文が実行され、ここで環境変数にTesseractへのパスが設定されます。

最後、OCRを実行する部分です。

from PIL import Image
import pyocr
import pyocr.builders
 
# OCRエンジンの取得
tools = pyocr.get_available_tools()
tool = tools[0]
 
# 画像の読み込み
img_org = Image.open("./thumbnail.png")
 
# OCRの実行
builder = pyocr.builders.TextBuilder()
result = tool.image_to_string(img_org, lang="jpn", builder=builder)
 
print(result)

まずは必要なライブラリをインポートします。
簡単にライブラリの概要を説明すると、PILパッケージのImageは画像を扱うためのライブラリです。
その下の二つは先ほどインストールしたpyocrライブラリです。

...
# OCRエンジンの取得
tools = pyocr.get_available_tools()
tool = tools[0]
 ...

ライブラリのインポートを終えたら次は利用可能なOCRエンジンを取得します。

...
# 画像の読み込み
img_org = Image.open("./thumbnail.png")
...

続いて、Image.openの第一引数にファイル名を入力して画像を読み込みます。

...
# OCRの実行
builder = pyocr.builders.TextBuilder()
result = tool.image_to_string(img_org, lang="jpn", builder=builder)
...

その次が、OCRの実行部分です。

ここでテキストビルダーを初期化します。この設定で、認識を文字列単位で行うか、単語単位で行うかを選べます。WordBoxBuilderで初期化すると単語単位、TextBuilderで初期化すると文字列単位になります。今回は文字列単位で抽出を行うためにTextBuilderを使っています。

image_to_stringの第一引数に画像を、langキーにjpnを、builderに先ほど初期化したテキストビルダーを設定して実行します。

タイトルとURLをコピーしました