【Python】Tesseract OCRを使って画像から文字を読み取るサンプルコードを解説
PythonとTesseract OCRを使って画像から文字を読み取る光学文字認識(OCR)の基礎を解説します。Tesseractのインストール、環境設定、日本語学習データの導入に加え、PyOCRやOpenCVを活用して画像からテキストと位置情報を抽出し、認識された文字に赤枠を描画するPythonコードの実装方法を、システムエンジニア初心者にも分かりやすくご紹介します。
開発環境
- Python version: python 3.10.11
PythonのOCRとは
OCR(Optical Character Recognition:光学文字認識)とは、画像などから文字を読み取る技術のことです。具体的には、紙の書類をスキャンした画像や写真に写っている文字を、コンピューターが認識できるデジタルデータ(テキストデータ)に変換する技術のことです。これにより、画像の中にある文字を編集したり、検索したりできるようになります。
Pythonというプログラミング言語を使ってOCRを行う場合、一般的には「Tesseract(テッセラクト)」という有名なOCRエンジンと、「PyOCR」というPythonライブラリを組み合わせて使用します。 Tesseractは、実際に画像の中から文字を読み取る処理を行う中心的なソフトウェアです。 一方、PyOCRは、PythonのプログラムからTesseractのような様々なOCRエンジンを簡単に使えるようにするためのライブラリです。PyOCRがあることで、複雑な設定なしにPythonコードからTesseractを呼び出し、OCR処理を実行できるようになります。
なお、OCRの機能は、Google Cloud Visionなどのクラウドサービスが提供するAPI(Application Programming Interface)を利用する方法もあります。APIとは、異なるソフトウェアやサービス間で連携するための窓口のようなものです。しかし今回は、オープンソース(無料で自由に利用・改変できるソフトウェア)であるTesseractを使用します。
Tesseract:https://github.com/tesseract-ocr/tesseract
PythonのOCRの使い方
Pythonを使って画像やPDFファイルから文字を読み取る「OCR(Optical Character Recognition:光学文字認識)」の基本的な使い方を解説していきます。今回は、Windows環境でOCRを実行するために必要な準備と、その手順について詳しく説明します。
Tesseractをインストール
PythonでOCRを実現するには、文字を認識するエンジンとなるソフトウェアが必要です。その代表的なものが「Tesseract」です。まずはこのTesseractをWindowsにインストールします。
TesseractのインストーラーはGitHubで公開されています。以下のダウンロードページにアクセスしてください。
Tesseractのダウンロードページ:https://github.com/UB-Mannheim/tesseract/wiki
このページにある「Windows Installer」のリンクから、最新版のインストーラー(例:tesseract-ocr-w64-setup-5.3.3.20231006.exeのような.exeファイル)をダウンロードします。
ダウンロードしたインストーラー(.exeファイル)を実行してインストールを開始します。インストール画面で言語を選択する場面がありますが、日本語の選択肢はありませんので、「English」のまま「OK」をクリックして次に進めてください。以降は画面の指示に従い、特に設定を変更せずにデフォルトのままでインストールを完了させて問題ありません。
Tesseractの環境変数を設定する
Tesseractのインストールが完了したら、そのプログラムがどこにあるかをパソコンに教えてあげる必要があります。この設定を「環境変数」の追加で行います。環境変数を設定することで、Pythonなどの他のプログラムがTesseractを簡単に利用できるようになります。
以下の手順で環境変数を設定します。
- デスクトップの「PC」アイコンを右クリックし、「プロパティ」を選択します。または、Windowsの検索バーで「システムの詳細設定」と検索し、「システムの詳細設定の表示」をクリックします。
- 表示された「システムのプロパティ」ウィンドウで、「詳細設定」タブを選択し、下部にある「環境変数」ボタンをクリックします。
- 「環境変数」ウィンドウが表示されます。「システム環境変数」の項目から「Path」を選択し、「編集」ボタンをクリックします。
- 「環境変数名の編集」または「新しい環境変数」ウィンドウが開きます。「新規」をクリックし、Tesseractをインストールしたディレクトリのパス(通常は
C:\Program Files\Tesseract-OCR)を入力して「OK」をクリックします。 - 開いているすべての「環境変数」および「システムのプロパティ」ウィンドウを「OK」をクリックして閉じます。
日本語の学習データをインストール
Tesseractが日本語の文字を正確に読み取るためには、日本語に特化した「学習データ」が必要です。これはTesseractが日本語の形や特徴を認識するための知識のようなものです。
日本語の学習データを以下のダウンロードページからダウンロードします。
学習データのダウンロードページ:https://github.com/tesseract-ocr/tessdata
このページの中から、「jpn.traineddata」というファイルをダウンロードしてください。
ダウンロードしたjpn.traineddataファイルを、Tesseractがインストールされているディレクトリ内のtessdataフォルダの中に配置します。具体的には、通常C:\Program Files\Tesseract-OCR\tessdataの中にこのファイルをコピーしてください。
PyOCRとPillowをインストール
PythonからTesseractの機能を利用するために、「PyOCR」というライブラリをインストールします。また、Pythonで画像を扱うために「Pillow」というライブラリも必要です。
これらのライブラリは、pipコマンドを使ってインストールできます。コマンドプロンプトやターミナルを開き、以下のコマンドを実行してください。
1pip install pyocr Pillow
さらに、今回は読み取った文字の位置に赤枠を描画する機能も実装するために、「OpenCV」という画像処理ライブラリも使用します。こちらもpipコマンドでインストールします。
1pip install opencv-python
これで、PythonでOCRを行うための準備はすべて完了です。
PythonのOCRで画像から文字を読み取る
OCRは、紙の書類や画像データに書かれた文字をコンピューターが認識できるデジタルデータに変換する技術で、データ入力の自動化など、様々な場面で活用されています。
このセクションでは、PythonのOCRライブラリを使って、画像から文字を読み取り、さらに読み取った文字の位置に赤い枠を描画して保存するサンプルコードを解説していきます。
OCRのサンプルコード
下記はTesseractとPyOCRを使用してsample.jpgという画像から文字を読み取り、読み取った文字の位置に赤枠を描画した画像をresult.jpgとして保存するサンプルコードです。
1# 必要なライブラリをインポート 2import cv2 3from PIL import Image 4import pyocr 5import pyocr.builders 6 7# Tesseractの実行ファイルへのパスを指定 8pyocr.tesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 9 10# OCRエンジンの選択 11tools = pyocr.get_available_tools() 12tool = tools[0] 13 14# 画像のファイルを指定する 15img_path = './sample.jpg' 16img = Image.open(img_path) 17 18# 画像からテキストを抽出 19builder = pyocr.builders.TextBuilder(tesseract_layout=6) 20txt = tool.image_to_string(img, lang='eng+jpn', builder=builder) 21 22# 画像から始点と終点を抽出 23builder = pyocr.builders.WordBoxBuilder(tesseract_layout=6) 24boxs = tool.image_to_string(img, lang='eng+jpn', builder=builder) 25 26# 画像をNumPy配列に変換 27image_up = cv2.imread(img_path) 28 29# 赤い枠を指定 30color = (0,0,255) 31thickness = 2 32 33for box in boxs: 34 cv2.rectangle(image_up, box.position[0], box.position[1], color, thickness) 35 36# 画像を保存 37cv2.imwrite('result.jpg', image_up)
作成したファイルは、以下のコマンドで実行できます。
1python ocr.py
ライブラリをインポートする
まずは、このプログラムで必要となるライブラリをインポートします。ライブラリとは、特定の機能をまとめたプログラムの集まりのことです。
1import cv2 2from PIL import Image 3import pyocr 4import pyocr.builders
それぞれのライブラリについて説明します。
cv2:これは「OpenCV(オープンシーブイ)」という画像や動画を扱うための強力なライブラリです。今回のコードでは、読み取った文字の位置に四角い枠を描画するために使用します。PILからインポートするImage:これは「Pillow(ピロー)」という画像を読み込んだり、加工したりするためのライブラリです。画像ファイルを開く際に利用します。pyocr:これがOCRを実行するための中心となるライブラリです。Tesseract(テッセラクト)などのOCRエンジンをPythonで簡単に使えるようにしてくれます。pyocr.builders:pyocrライブラリの一部で、画像からどのような形式でテキストを抽出するか(例えば、単なるテキストとして抽出するか、位置情報も付けて抽出するか、など)を指定するために使用します。
OCRエンジンを選択する
次に、OCRを実行するためのソフトウェアである「Tesseract」の実行ファイルの場所をPythonに教えてあげて、使用するOCRエンジンを選択します。
1pyocr.tesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' 2 3tools = pyocr.get_available_tools() 4tool = tools[0]
pyocr.tesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'- ここで、PCにインストールされているTesseractというOCRソフトウェアの実行ファイル(プログラム本体)がどこにあるのかをPythonに伝えています。パス(場所を示す情報)は、お使いのPCのインストール場所に合わせて変更してください。
tools = pyocr.get_available_tools()pyocrが利用できるOCRエンジンのリストを取得しています。
tool = tools[0]- 利用可能なOCRエンジンの中から、最初のもの(この場合はTesseract)を選択して、
toolという変数に格納しています。これで、このtoolを使ってOCRの処理を実行できるようになります。
- 利用可能なOCRエンジンの中から、最初のもの(この場合はTesseract)を選択して、
画像を読み込む
次に、文字を読み取りたい画像をPythonプログラムに読み込みます。
1img_path = './sample.jpg' 2img = Image.open(img_path)
img_path = './sample.jpg'- 読み込みたい画像ファイルの名前と場所を
img_pathという変数に代入しています。./は、Pythonファイルと同じフォルダにあることを意味します。
- 読み込みたい画像ファイルの名前と場所を
img = Image.open(img_path)- 先ほどインポートしたPillowライブラリの
Image.open関数を使って、指定したパスの画像ファイルを開き、その画像データをimgという変数に格納しています。
- 先ほどインポートしたPillowライブラリの
画像からテキストを抽出する
画像を読み込んだら、いよいよ画像の中から文字の情報を抽出します。
1builder = pyocr.builders.TextBuilder(tesseract_layout=6) 2txt = tool.image_to_string(img, lang='eng+jpn', builder=builder)
builder = pyocr.builders.TextBuilder(tesseract_layout=6)TextBuilderは、画像から純粋なテキスト情報を抽出するための設定を作成しています。tesseract_layoutは、Tesseractが画像をどのように区切って文字を認識するか(例えば、画像全体を1つの文章とみなすか、複数行のブロックとみなすかなど)を指定するオプションです。0から13までの値があり、画像のレイアウトによって最適な値が異なります。ここでは、1つのまとまったテキストとして解析する「6」を指定しています。
txt = tool.image_to_string(img, lang='eng+jpn', builder=builder)- 選択したOCRエンジン(
tool)を使って、読み込んだ画像データ(img)からテキストを抽出しています。 lang='eng+jpn'は、画像に含まれる言語が英語と日本語の両方であると指定しています。これにより、Tesseractはこれらの言語の文字を正確に認識しようとします。builder=builderで、先ほど設定したテキスト抽出の方法(TextBuilder)を適用しています。- 抽出されたテキストは
txtという変数に格納されます。
- 選択したOCRエンジン(
テキストの位置を取得する
テキストを抽出するだけでなく、今回は「そのテキストが画像のどこにあるのか」という位置情報も取得します。
1builder = pyocr.builders.WordBoxBuilder(tesseract_layout=6) 2boxs = tool.image_to_string(img, lang='eng+jpn', builder=builder)
builder = pyocr.builders.WordBoxBuilder(tesseract_layout=6)- 今度は
WordBoxBuilderという設定を使用しています。これは、読み取った文字の「内容」だけでなく、「その文字が画像のどこに位置しているか」という情報(四角い枠の座標)も合わせて取得するためのものです。tesseract_layoutの設定は先ほどと同じ「6」を使用しています。
- 今度は
boxs = tool.image_to_string(img, lang='eng+jpn', builder=builder)- この行で、
imgから文字と位置情報を抽出し、その結果をboxsという変数に格納しています。boxsには、各文字のcontent(内容)とposition(位置)の情報が入っています。positionは((x1, y1), (x2, y2))という形式で、四角い枠の左上(x1, y1)と右下(x2, y2)の座標を示しています。
- この行で、
読み取った位置に赤枠を描画する
取得した文字の位置情報を使って、元の画像に赤い枠を描画します。これにより、OCRがどの部分を文字として認識したのかを視覚的に確認できます。
1image_up = cv2.imread(img_path) 2 3color = (0,0,255) 4thickness = 2 5 6for box in boxs: 7 cv2.rectangle(image_up, box.position[0], box.position[1], color, thickness)
image_up = cv2.imread(img_path)- OpenCV(
cv2)のimread関数を使って、元の画像を再度読み込み、加工しやすい「NumPy(ナムパイ)配列」という形式に変換しています。この形式で画像を扱うことで、OpenCVの様々な画像処理機能を使うことができます。
- OpenCV(
color = (0,0,255)- 枠線の色を定義しています。OpenCVでは、色を「BGR(青-緑-赤)」の順番で指定するのが一般的です。(0,0,255)は青が0、緑が0、赤が255という意味なので、純粋な「赤色」を表します。
thickness = 2- 枠線の太さを2ピクセルに設定しています。
for box in boxs:boxsには、先ほど取得したすべての文字の位置情報がリスト形式で入っています。このforループは、そのリストから一つ一つの文字の位置情報(box)を取り出して、以下の処理を繰り返すことを意味します。
cv2.rectangle(image_up, box.position[0], box.position[1], color, thickness)- OpenCVの
rectangle関数を使って、四角い枠を描画しています。image_up:枠を描画する画像データです。box.position[0]:四角い枠の左上の座標です。box.position[1]:四角い枠の右下の座標です。color:定義した赤色です。thickness:定義した枠線の太さです。
- OpenCVの
このループによって、認識されたすべての文字の周囲に赤い枠が描画されます。
画像を保存する
最後に、赤枠を描画して加工した画像をファイルとして保存します。
1cv2.imwrite('result.jpg', image_up)
cv2.imwrite('result.jpg', image_up)- OpenCVの
imwrite関数を使って、加工済みの画像データ(image_up)をresult.jpgという名前で保存しています。
- OpenCVの
このプログラムを実行すると、result.jpgという画像ファイルが新しく作成されます。このファイルを開くと、元の画像でOCRがどの部分を文字として認識し、テキストとして抽出したのかが赤い枠で囲まれて表示されていることを確認できるでしょう。
おわりに
本記事では、PythonとTesseract OCRを活用し、画像から文字を読み取る光学文字認識(OCR)の基本的な実装方法を解説しました。 Tesseractのインストールから環境変数設定、日本語学習データの導入といった準備が重要であることを確認し、PyOCRを使ってOCRエンジンを操作する方法を学びました。 さらに、OpenCVライブラリを用いて、読み取った文字のテキスト情報だけでなく、その位置に赤枠を描画して視覚的に確認する実践的なコードも実装しました。 これらの手順を通じて、システムエンジニアとして画像認識の基礎と、Pythonによる具体的な活用方法を理解いただけたことと思います。