Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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を簡単に利用できるようになります。

以下の手順で環境変数を設定します。

  1. デスクトップの「PC」アイコンを右クリックし、「プロパティ」を選択します。または、Windowsの検索バーで「システムの詳細設定」と検索し、「システムの詳細設定の表示」をクリックします。
  2. 表示された「システムのプロパティ」ウィンドウで、「詳細設定」タブを選択し、下部にある「環境変数」ボタンをクリックします。
  3. 「環境変数」ウィンドウが表示されます。「システム環境変数」の項目から「Path」を選択し、「編集」ボタンをクリックします。
  4. 「環境変数名の編集」または「新しい環境変数」ウィンドウが開きます。「新規」をクリックし、Tesseractをインストールしたディレクトリのパス(通常はC:\Program Files\Tesseract-OCR)を入力して「OK」をクリックします。
  5. 開いているすべての「環境変数」および「システムのプロパティ」ウィンドウを「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の処理を実行できるようになります。

画像を読み込む

次に、文字を読み取りたい画像を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という変数に格納しています。

画像からテキストを抽出する

画像を読み込んだら、いよいよ画像の中から文字の情報を抽出します。

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という変数に格納されます。

テキストの位置を取得する

テキストを抽出するだけでなく、今回は「そのテキストが画像のどこにあるのか」という位置情報も取得します。

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の様々な画像処理機能を使うことができます。
  • 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:定義した枠線の太さです。

このループによって、認識されたすべての文字の周囲に赤い枠が描画されます。

画像を保存する

最後に、赤枠を描画して加工した画像をファイルとして保存します。

1cv2.imwrite('result.jpg', image_up)
  • cv2.imwrite('result.jpg', image_up)
    • OpenCVのimwrite関数を使って、加工済みの画像データ(image_up)をresult.jpgという名前で保存しています。

このプログラムを実行すると、result.jpgという画像ファイルが新しく作成されます。このファイルを開くと、元の画像でOCRがどの部分を文字として認識し、テキストとして抽出したのかが赤い枠で囲まれて表示されていることを確認できるでしょう。

おわりに

本記事では、PythonとTesseract OCRを活用し、画像から文字を読み取る光学文字認識(OCR)の基本的な実装方法を解説しました。 Tesseractのインストールから環境変数設定、日本語学習データの導入といった準備が重要であることを確認し、PyOCRを使ってOCRエンジンを操作する方法を学びました。 さらに、OpenCVライブラリを用いて、読み取った文字のテキスト情報だけでなく、その位置に赤枠を描画して視覚的に確認する実践的なコードも実装しました。 これらの手順を通じて、システムエンジニアとして画像認識の基礎と、Pythonによる具体的な活用方法を理解いただけたことと思います。

関連コンテンツ

関連IT用語