OCR_image.py テクニカルドキュメント
プログラムの動作
OCR_image.py は、Pythonの pytesseract ライブラリを利用して、指定された画像ファイルから光学文字認識(OCR)を実行し、抽出されたテキストを標準出力に表示するプログラムです。
このプログラムの主な機能は以下の通りです。
画像からのテキスト抽出: 指定された画像ファイルを開き、Tesseract OCRエンジンを用いて画像内の文字を認識します。
多言語対応: 日本語(
jpn)や英語(eng)など、複数の言語を指定して文字認識を行うことができます。複数の言語を同時に指定することも可能です。エラーハンドリング: ファイルが見つからない場合や、OCR処理中に何らかのエラーが発生した場合に、適切なメッセージを表示します。
ダミー画像生成(初回実行時): 実行時に指定された画像ファイルが存在しない場合、プログラムが自動的にテスト用のダミー画像(「これはテスト画像です。」「Hello, OCR!」というテキストを含む)を生成し、その画像に対してOCRを実行します。これにより、ユーザーが事前に画像ファイルを用意していなくても、プログラムの動作を確認できます。
このプログラムは、紙媒体のドキュメントをスキャンした画像やスクリーンショットなどから、手軽にテキスト情報をデジタルデータとして抽出したいという課題を解決します。
原理
このプログラムは、以下の主要な技術とアルゴリズムに基づいています。
Tesseract OCRエンジン: プログラムの核となるのは、Googleが開発したオープンソースのOCRエンジンであるTesseractです。
pytesseractライブラリは、PythonプログラムからこのTesseractエンジンを呼び出すためのラッパーとして機能します。 Tesseract OCRは、一般的に以下のステップでテキストを認識します。画像の前処理: ノイズ除去、二値化、傾き補正などが行われます。
レイアウト解析: 画像内のテキストブロック、行、単語の領域が検出されます。
文字認識: 各文字の領域から個々の文字を識別します。これには、パターンマッチングや特徴抽出、ニューラルネットワークなどの技術が用いられます。
ポストプロセス: 認識された文字列に対して、辞書照合や言語モデルを用いてスペルチェックや文脈に応じた修正を行い、最終的なテキストを生成します。
Pillow (PIL): Python Imaging Library (PIL) のフォークであるPillowライブラリは、画像ファイルの読み込みと操作に使用されます。
Image.open(image_path)は、指定されたパスの画像ファイルをPillowのImageオブジェクトとして読み込み、Tesseractエンジンが処理できる形式に変換します。また、ダミー画像の生成においても、画像オブジェクトの作成、描画、保存にPillowが利用されています。
プログラムの動作は、pytesseract.image_to_string(img, lang=lang) 関数呼び出しに集約されます。この関数が内部でPillowで読み込んだ画像をTesseractに渡し、指定された言語(lang)でOCR処理を実行し、結果のテキストを文字列として返します。
必要な非標準ライブラリとインストール方法
このプログラムを実行するには、以下の非標準Pythonライブラリと、Tesseract OCRエンジン本体が必要です。
Pillow: 画像ファイルを扱うためのライブラリです。
pytesseract: Tesseract OCRエンジンとPythonを連携させるためのライブラリです。
Tesseract OCRエンジン本体:
pytesseractが利用するバックエンドのOCRツールです。
これらのインストール方法は以下の通りです。
Pythonライブラリのインストール
コマンドプロンプトやターミナルで以下のコマンドを実行します。
pip install Pillow pytesseract
Tesseract OCRエンジン本体のインストール
Tesseract OCRエンジンは別途インストールが必要です。お使いのOSに応じた方法でインストールしてください。
Windowsの場合: Tesseract OCR for Windowsの公式ダウンロードページ(
https://tesseract-ocr.github.io/tessdoc/Downloads.html)からインストーラーをダウンロードし、指示に従ってインストールしてください。インストール時に、Tesseractの実行ファイルへのパスをシステムの環境変数PATHに追加することをお勧めします。macOSの場合: Homebrewを使ってインストールするのが一般的です。
brew install tesseract
Linux (Debian/Ubuntu) の場合:
sudo apt update sudo apt install tesseract-ocr sudo apt install tesseract-ocr-jpn tesseract-ocr-eng # 日本語と英語の言語データ
言語データファイルの入手
Tesseractが特定の言語でOCRを実行するためには、対応する言語データファイル(.traineddata)が必要です。例えば、日本語を認識するには jpn.traineddata が、英語には eng.traineddata が必要です。これらのファイルはTesseract OCRエンジンのインストール時に自動的にインストールされることが多いですが、もし不足している場合は、Tesseractの公式リポジトリから手動でダウンロードし、Tesseractの tessdata ディレクトリに配置する必要があります。
必要な入力ファイル
プログラムがOCRを実行するために必要とする入力ファイルは、以下の種類です。
画像ファイル:
OCRの対象となる画像ファイルです。JPEG (
.jpg), PNG (.png), TIFF (.tiff) など、PillowライブラリとTesseractがサポートする一般的な画像形式であれば使用できます。プログラム内では
image_file = "IMG_8583.jpg"という変数で指定されており、デフォルトではIMG_8583.jpgというファイル名が期待されます。このファイルはプログラムと同じディレクトリに存在する必要があります。もし指定された画像ファイルが存在しない場合、プログラムは自動的にテスト用のダミー画像(ファイル名はデフォルトの
IMG_8583.jpg)を生成します。
Tesseract言語データファイル:
認識したい言語に対応する
.traineddataファイルが、Tesseract OCRエンジンのtessdataディレクトリ内に存在する必要があります。例えば、日本語と英語を認識する場合、
jpn.traineddataとeng.traineddataが必要です。
生成される出力ファイル
このプログラムは、基本的に標準出力(コンソール) にOCR結果のテキストを表示します。直接ファイルとして結果を保存する機能は持っていません。
ただし、以下の条件の場合にのみ、特定のファイルが生成される可能性があります。
ダミー画像ファイル:
プログラム実行時に、
image_file変数で指定された画像ファイル(デフォルトではIMG_8583.jpg)が存在しない場合、テスト用のダミー画像ファイルが生成されます。このダミー画像ファイルは、プログラムが実行されたディレクトリに、指定されたファイル名(例:
IMG_8583.jpg)で保存されます。ダミー画像には「これはテスト画像です。」と「Hello, OCR!」というテキストが描画されています。
コマンドラインでの使用例 (Usage)
OCR_image.py は、引数を受け取らずに直接実行することを想定しています。
OCRの対象となる画像ファイル名や、認識する言語は、現在のコードではプログラムのソースコード内部で直接設定する必要があります。
基本的な実行コマンドは以下の通りです。
python OCR_image.py
画像ファイルの指定: 現在のバージョンでは、
OCR_image.py内のimage_file変数の値を直接編集して、対象となる画像ファイル名を変更する必要があります。image_file = "your_image_file.png" # 実際の画像ファイル名に置き換えてください
認識言語の指定:
ocr_from_image関数を呼び出す際のlang引数を編集することで、認識する言語を変更できます。extracted_text_image = ocr_from_image(image_file, lang='eng') # 英語のみ extracted_text_image = ocr_from_image(image_file, lang='jpn') # 日本語のみ extracted_text_image = ocr_from_image(image_file, lang='jpn+eng') # 日本語と英語
コマンドラインでの具体的な使用例
OCR_image.py を実行する具体的なシナリオとその結果を説明します。
シナリオ: プログラムと同じディレクトリに
IMG_8583.jpgという名前の画像ファイルが存在しない状態でプログラムを実行します。実行コマンド:
python OCR_image.py実行結果の説明: まず、
IMG_8583.jpgが見つからないため、プログラムは自動的にPillowライブラリを使って「これはテスト画像です。」と「Hello, OCR!」というテキストが描かれたダミー画像を生成します。 その後、そのダミー画像に対してOCR処理を行い、認識されたテキストをコンソールに出力します。予想される出力例:
ダミー画像 'IMG_8583.jpg' を作成しました。 --- 画像ファイル 'IMG_8583.jpg' のOCR結果 --- これはテスト画像です。 Hello, OCR!
(注: Tesseractのバージョンや言語データの品質、フォントによっては、認識結果が上記と完全に一致しない場合があります。)
シナリオ: 既に
IMG_8583.jpgという名前の画像ファイル(例えば、スキャンした日本語のドキュメント)が存在する状態でプログラムを実行します。実行コマンド:
python OCR_image.py実行結果の説明:
IMG_8583.jpgが既に存在するため、ダミー画像の生成はスキップされます。既存のIMG_8583.jpgに対して直接OCR処理が実行され、画像内のテキストが抽出されてコンソールに表示されます。予想される出力例: (例として、
IMG_8583.jpgに「技術ドキュメント」と「Python」というテキストが含まれている場合)--- 画像ファイル 'IMG_8583.jpg' のOCR結果 --- 技術ドキュメント Python