本日はPythonで画像からテキストを抽出する方法を解説します。
次の順番で解説してゆきます。
- 光学式文字認識エンジン(Tesseract)のインストール
- 光学式文字認識エンジン(Tesseract)で画像からテキストを抽出する方法
- 光学式文字認識エンジン(Tesseract)をPython上で使用する方法
OSはWindowsを前提とし、開発環境はJupyterLab Desktopを使用します。
光学式文字認識エンジン(Tesseract)のインストール
まずは画像からテキストを抽出するために、Tesseractという光学式文字認識エンジンをインストールします。
TesseractはGoogleが開発したソフトウェアで、無料で使うことができます。

それではまず、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に先ほど初期化したテキストビルダーを設定して実行します。