[Python] 画像からテキストを抽出する方法【OCR】

Pythonで画像からテキストを抽出するには、OCR(Optical Character Recognition)技術を使用します。

代表的なライブラリとして Tesseract OCR があり、Pythonからは pytesseract パッケージを利用します。

まず、Tesseractをインストールし、次に pytesseractPillow などの画像処理ライブラリをインストールします。

画像を読み込み、pytesseract.image_to_string()関数を使うことで、画像内のテキストを抽出できます。

この記事でわかること
  • OCRの基本と仕組み
  • Tesseract OCRの特徴と利点
  • PythonでのOCR実装手順
  • 画像の前処理方法とその重要性
  • PDFやスクリーンショットからのテキスト抽出方法

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

OCR(Optical Character Recognition、光学文字認識)は、画像やスキャンした文書からテキストを自動的に抽出する技術です。

この技術は、印刷された文字や手書きの文字をデジタルデータに変換するために広く利用されています。

OCRは、画像処理と機械学習の技術を組み合わせて、文字の形状を認識し、対応するテキストに変換します。

これにより、文書のデジタル化やデータの自動入力が可能になり、業務の効率化や情報の検索性向上に寄与しています。

OCRは、さまざまな言語やフォントに対応しており、特にビジネスや教育の分野で重要な役割を果たしています。

目次から探す

Tesseract OCRの概要

Tesseract OCRとは?

Tesseract OCRは、Googleが開発したオープンソースの光学文字認識エンジンです。

元々はHP(ヒューレット・パッカード)によって開発され、その後Googleがメンテナンスを引き継ぎました。

Tesseractは、印刷されたテキストや手書きの文字を高精度で認識することができ、多くの言語に対応しています。

特に、プログラミング言語やスクリプト言語を使用して簡単に統合できるため、開発者にとって非常に便利なツールです。

Tesseractの特徴と利点

スクロールできます
特徴説明
オープンソース無料で使用でき、ソースコードが公開されている。
多言語対応100以上の言語に対応しており、カスタム言語も追加可能。
高精度機械学習を用いたアルゴリズムにより、高い認識精度を実現。
拡張性PythonやJavaなど、さまざまなプログラミング言語と統合可能。
コミュニティサポート大規模なユーザーコミュニティがあり、情報やサポートが豊富。

Tesseractのインストール方法(Windows/Mac/Linux)

Windows

  1. Tesseractの公式リリースページからインストーラーをダウンロードします。
  2. インストーラーを実行し、指示に従ってインストールします。
  3. 環境変数にTesseractのインストールパスを追加します(例:C:\Program Files\Tesseract-OCR)。

Mac

  1. Homebrewを使用してTesseractをインストールします。

以下のコマンドをターミナルで実行します。

brew install tesseract

Linux

  1. ディストリビューションに応じて、以下のコマンドを実行します。
  • Ubuntu/Debian:
sudo apt-get install tesseract-ocr
  • Fedora:
sudo dnf install tesseract
  1. インストール後、tesseract --versionで正しくインストールされたか確認します。

これで、Tesseract OCRを使用する準備が整いました。

次のステップでは、Pythonを使ってOCRを実装する方法を見ていきます。

PythonでOCRを実装するための準備

必要なライブラリのインストール

PythonでOCRを実装するためには、主に以下の2つのライブラリが必要です。

これらをインストールすることで、画像からテキストを抽出する機能を実現できます。

スクロールできます
ライブラリ名説明
pytesseractTesseract OCRエンジンをPythonから利用するためのラッパー。
Pillow画像処理を行うためのPython Imaging Library(PIL)のフォーク。

pytesseractのインストール方法

pytesseractをインストールするには、以下のコマンドをターミナルまたはコマンドプロンプトで実行します。

pip install pytesseract

Pillowライブラリのインストール方法

Pillowライブラリも同様に、以下のコマンドでインストールできます。

pip install Pillow

Tesseractのパス設定(Windowsの場合)

TesseractをWindowsで使用する際には、TesseractのインストールパスをPythonスクリプト内で指定する必要があります。

以下のように、pytesseract.pytesseract.tesseract_cmdにTesseractの実行ファイルのパスを設定します。

import pytesseract
# Tesseractのインストールパスを指定
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

環境パスを通している場合は、ファイル名のみで構いません。

この設定を行うことで、PythonからTesseractを呼び出してOCR処理を行うことができるようになります。

次のステップでは、画像からテキストを抽出する基本的な手順について説明します。

画像からテキストを抽出する基本的な手順

画像の読み込み方法(Pillowを使用)

Pillowライブラリを使用して画像を読み込む方法は非常に簡単です。

以下のコードでは、指定したパスから画像を読み込みます。

from PIL import Image
# 画像を読み込む
image_path = 'path/to/your/image.png'  # 画像のパスを指定
image = Image.open(image_path)

pytesseractでテキストを抽出する方法

読み込んだ画像からテキストを抽出するには、pytesseractを使用します。

以下のコードで、画像からテキストを取得できます。

import pytesseract
# 画像からテキストを抽出
extracted_text = pytesseract.image_to_string(image, lang='jpn')  # 日本語の場合
print(extracted_text)

画像の前処理(グレースケール化、リサイズなど)

OCRの精度を向上させるために、画像の前処理が重要です。

以下のコードでは、画像をグレースケール化し、リサイズする方法を示します。

# 画像をグレースケール化
gray_image = image.convert('L')
# 画像をリサイズ(幅を300ピクセルに変更)
resized_image = gray_image.resize((300, int(gray_image.height * (300 / gray_image.width))))
# 前処理後の画像を表示(必要に応じて)
resized_image.show()

抽出したテキストの表示と保存

抽出したテキストを表示するだけでなく、ファイルに保存することもできます。

以下のコードでは、テキストをコンソールに表示し、output.txtというファイルに保存します。

# 抽出したテキストを表示
print(extracted_text)
# テキストをファイルに保存
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(extracted_text)

この手順を通じて、画像からテキストを抽出し、必要な前処理を行い、結果を表示および保存することができます。

次のステップでは、画像の前処理による精度向上について詳しく見ていきます。

画像の前処理による精度向上

前処理の重要性

OCRの精度は、入力する画像の品質に大きく依存します。

画像がぼやけていたり、ノイズが多かったりすると、文字認識の精度が低下します。

前処理を行うことで、画像の品質を向上させ、OCRエンジンが文字を正確に認識できるようにすることが重要です。

前処理には、グレースケール化、ノイズ除去、リサイズ、二値化などの手法があります。

これらの手法を適切に組み合わせることで、OCRの精度を大幅に向上させることができます。

グレースケール化の方法

グレースケール化は、カラー画像を白黒の画像に変換する処理です。

これにより、色の情報が不要になり、文字の認識が容易になります。

以下のコードで、Pillowを使用して画像をグレースケール化する方法を示します。

from PIL import Image
# 画像を読み込む
image = Image.open('path/to/your/image.png')
# 画像をグレースケール化
gray_image = image.convert('L')
gray_image.show()  # グレースケール化した画像を表示

ノイズ除去の方法

画像に含まれるノイズは、OCRの精度を低下させる要因となります。

ノイズ除去には、フィルタリング技術を使用します。

以下のコードでは、Pillowのfilterメソッドを使用して、ガウシアンブラーを適用することでノイズを除去します。

from PIL import ImageFilter
# ノイズ除去のためにガウシアンブラーを適用
denoised_image = gray_image.filter(ImageFilter.GaussianBlur(radius=1))
denoised_image.show()  # ノイズ除去後の画像を表示

画像のリサイズと解像度の調整

画像のサイズや解像度を調整することで、OCRの精度を向上させることができます。

特に、文字が小さい場合は、リサイズして大きくすることが効果的です。

以下のコードでは、画像をリサイズする方法を示します。

# 画像をリサイズ(幅を600ピクセルに変更)
resized_image = denoised_image.resize((600, int(denoised_image.height * (600 / denoised_image.width))))
resized_image.show()  # リサイズ後の画像を表示

二値化処理の実装

二値化処理は、画像を白と黒の2色に変換することで、文字と背景を明確に分離します。

これにより、OCRエンジンが文字を認識しやすくなります。

以下のコードでは、Pillowを使用して二値化処理を実装します。

# 二値化処理を実施
threshold = 128  # 閾値を設定
binary_image = resized_image.point(lambda p: 255 if p > threshold else 0)
binary_image.show()  # 二値化後の画像を表示

これらの前処理を行うことで、OCRの精度を向上させることができます。

次のステップでは、複数言語のテキスト抽出について詳しく見ていきます。

複数言語のテキスト抽出

Tesseractで対応可能な言語

Tesseractは、100以上の言語に対応しており、特に日本語、英語、中国語、フランス語、スペイン語など、さまざまな言語のテキストを認識することができます。

さらに、ユーザーが独自の言語データを追加することも可能です。

Tesseractの言語データは、.traineddataファイルとして提供されており、これを使用して特定の言語の認識精度を向上させることができます。

言語データのインストール方法

Tesseractで特定の言語を使用するためには、その言語のデータファイルをインストールする必要があります。

以下の手順で言語データをインストールできます。

  1. Tesseractの公式GitHubリポジトリから、必要な言語の.traineddataファイルをダウンロードします。
  • 例: 日本語の場合、jpn.traineddataをダウンロードします。
  1. ダウンロードしたファイルをTesseractのtessdataフォルダにコピーします。
  • Windowsの場合: C:\Program Files\Tesseract-OCR\tessdata\
  • Mac/Linuxの場合: /usr/local/share/tessdata/

複数言語のテキストを抽出する方法

複数言語のテキストを抽出するには、image_to_stringメソッドlang引数に言語コードを指定します。

複数の言語を指定する場合は、言語コードをプラス記号で結合します。

以下のコードでは、日本語と英語のテキストを同時に抽出する方法を示します。

# 日本語と英語のテキストを抽出
extracted_text = pytesseract.image_to_string(image, lang='jpn+eng')
print(extracted_text)

言語ごとの精度の違い

Tesseractは、言語によって認識精度が異なる場合があります。

一般的に、英語や日本語などの主要な言語は高い精度で認識されますが、特定の方言や特殊なフォント、手書き文字の場合は精度が低下することがあります。

また、言語データの質や前処理の方法も精度に影響を与えます。

したがって、特定の言語でのOCRを行う際には、適切な言語データを使用し、前処理を工夫することが重要です。

これにより、Tesseractを使用して複数言語のテキストを抽出する方法が理解できました。

次のステップでは、特定領域からのテキスト抽出について詳しく見ていきます。

特定領域からのテキスト抽出

画像内の特定領域を指定する方法

OCRを行う際に、画像全体ではなく特定の領域からテキストを抽出したい場合があります。

特定領域を指定するためには、画像の座標(左上のx, y座標と右下のx, y座標)を使用します。

この座標を基に、画像の一部を切り取ることができます。

例えば、左上の座標が(100, 100)で、右下の座標が(400, 300)の場合、指定した領域のテキストを抽出することができます。

Pillowで領域を切り取る方法

Pillowを使用して画像の特定領域を切り取るには、cropメソッドを使用します。

以下のコードでは、指定した領域を切り取る方法を示します。

from PIL import Image
# 画像を読み込む
image = Image.open('path/to/your/image.png')
# 切り取りたい領域を指定 (左, 上, 右, 下)
crop_area = (100, 100, 400, 300)  # 例: (左, 上, 右, 下)
cropped_image = image.crop(crop_area)
# 切り取った画像を表示
cropped_image.show()

pytesseractで領域指定してテキストを抽出する方法

切り取った画像からテキストを抽出するには、pytesseractを使用します。

以下のコードでは、切り取った領域からテキストを抽出する方法を示します。

import pytesseract
# 切り取った画像からテキストを抽出
extracted_text = pytesseract.image_to_string(cropped_image, lang='jpn')  # 日本語の場合
print(extracted_text)

この手順を通じて、画像内の特定領域からテキストを抽出することができます。

特定の情報を効率的に取得したい場合に非常に便利です。

次のステップでは、手書き文字の認識について詳しく見ていきます。

応用例:手書き文字の認識

手書き文字のOCRの難しさ

手書き文字の認識は、印刷された文字に比べて非常に難易度が高いです。

手書き文字は個人の書き方やスタイルによって大きく異なり、同じ文字でも形状が異なるため、OCRエンジンが正確に認識するのが難しくなります。

また、手書き文字はしばしば不均一で、文字間のスペースやサイズも異なるため、認識精度が低下する要因となります。

これらの理由から、手書き文字のOCRには特別な前処理や工夫が必要です。

手書き文字認識のための前処理

手書き文字を認識するためには、画像の前処理が特に重要です。

以下の手法を用いることで、手書き文字の認識精度を向上させることができます。

  1. グレースケール化: カラー画像をグレースケールに変換し、色の情報を排除します。
  2. ノイズ除去: 手書き文字の周囲にあるノイズを除去するために、フィルタリングを行います。
  3. リサイズ: 文字が小さい場合は、画像をリサイズして大きくします。
  4. 二値化: 画像を白と黒の2色に変換し、文字と背景を明確に分離します。

以下のコードは、手書き文字の前処理を行う例です。

from PIL import Image, ImageFilter
# 画像を読み込む
image = Image.open('path/to/your/handwritten_image.png')
# グレースケール化
gray_image = image.convert('L')
# ノイズ除去
denoised_image = gray_image.filter(ImageFilter.GaussianBlur(radius=1))
# リサイズ
resized_image = denoised_image.resize((600, int(denoised_image.height * (600 / denoised_image.width))))
# 二値化処理
threshold = 128
binary_image = resized_image.point(lambda p: 255 if p > threshold else 0)
binary_image.show()  # 前処理後の画像を表示

pytesseractで手書き文字を認識する方法

前処理を行った後、pytesseractを使用して手書き文字を認識します。

以下のコードでは、前処理した画像から手書き文字を抽出する方法を示します。

import pytesseract
# 手書き文字を認識
extracted_text = pytesseract.image_to_string(binary_image, lang='jpn')  # 日本語の場合
print(extracted_text)

手書き文字の認識は、印刷された文字に比べて難易度が高いですが、適切な前処理を行うことで精度を向上させることが可能です。

次のステップでは、PDFからのテキスト抽出について詳しく見ていきます。

応用例:PDFからのテキスト抽出

PDFから画像を抽出する方法

PDFファイルから画像を抽出するには、PDFを画像形式に変換する必要があります。

これには、PyMuPDFpdf2imageといったライブラリを使用することが一般的です。

これらのライブラリを使うことで、PDF内のページを画像として取得し、その画像からテキストを抽出することができます。

PyMuPDFやpdf2imageを使ったPDFの画像化

PyMuPDFを使用する方法

PyMuPDFfitzを使用してPDFを画像に変換する方法は以下の通りです。

import fitz  # PyMuPDF
# PDFファイルを開く
pdf_document = fitz.open('path/to/your/document.pdf')
# 1ページ目を画像として保存
page = pdf_document[0]  # 0は1ページ目を指す
pix = page.get_pixmap()
pix.save('page1.png')  # 画像として保存

pdf2imageを使用する方法

pdf2imageを使用する場合、以下のようにPDFを画像に変換できます。

from pdf2image import convert_from_path
# PDFファイルを画像に変換
images = convert_from_path('path/to/your/document.pdf')
# 1ページ目を保存
images[0].save('page1.png', 'PNG')

PDF内の画像からテキストを抽出する方法

PDF内の画像を抽出した後、その画像からテキストを抽出するには、先に説明した手法を使用します。

以下のコードでは、pytesseractを使ってPDFから抽出した画像からテキストを取得する方法を示します。

from PIL import Image
import pytesseract
# PDFから抽出した画像を読み込む
image = Image.open('page1.png')
# 画像からテキストを抽出
extracted_text = pytesseract.image_to_string(image, lang='jpn')  # 日本語の場合
print(extracted_text)

この手順を通じて、PDFファイルから画像を抽出し、その画像からテキストを取得することができます。

PDF内の情報を効率的にデジタル化するために非常に便利な技術です。

次のステップでは、スクリーンショットからのテキスト抽出について詳しく見ていきます。

応用例:スクリーンショットからのテキスト抽出

スクリーンショットの取得方法

スクリーンショットを取得する方法はいくつかありますが、PythonではpyautoguiPillowを使用することが一般的です。

以下のコードでは、pyautoguiを使用してスクリーンショットを取得する方法を示します。

import pyautogui
# スクリーンショットを取得
screenshot = pyautogui.screenshot()
# スクリーンショットを保存
screenshot.save('screenshot.png')

このコードを実行すると、現在の画面のスクリーンショットがscreenshot.pngというファイル名で保存されます。

スクリーンショットからテキストを抽出する手順

取得したスクリーンショットからテキストを抽出するには、pytesseractを使用します。

以下のコードでは、スクリーンショットからテキストを抽出する手順を示します。

from PIL import Image
import pytesseract
# スクリーンショットを読み込む
image = Image.open('screenshot.png')
# 画像からテキストを抽出
extracted_text = pytesseract.image_to_string(image, lang='jpn')  # 日本語の場合
print(extracted_text)

この手順を通じて、スクリーンショットから簡単にテキストを抽出することができます。

スクリーンショットの前処理と精度向上

スクリーンショットからのテキスト抽出の精度を向上させるためには、前処理が重要です。

以下の手法を用いることで、OCRの精度を向上させることができます。

  1. グレースケール化: カラー画像をグレースケールに変換し、色の情報を排除します。
  2. ノイズ除去: 画像のノイズを除去するために、フィルタリングを行います。
  3. リサイズ: 文字が小さい場合は、画像をリサイズして大きくします。
  4. 二値化: 画像を白と黒の2色に変換し、文字と背景を明確に分離します。

以下のコードは、スクリーンショットの前処理を行う例です。

# グレースケール化
gray_image = image.convert('L')
# ノイズ除去
denoised_image = gray_image.filter(ImageFilter.GaussianBlur(radius=1))
# リサイズ
resized_image = denoised_image.resize((600, int(denoised_image.height * (600 / denoised_image.width))))
# 二値化処理
threshold = 128
binary_image = resized_image.point(lambda p: 255 if p > threshold else 0)
binary_image.show()  # 前処理後の画像を表示

これらの前処理を行った後、再度pytesseractを使用してテキストを抽出することで、精度を向上させることができます。

スクリーンショットからのテキスト抽出は、特にウェブページやアプリケーションの情報を取得する際に非常に便利です。

次のステップでは、よくある質問について詳しく見ていきます。

よくある質問

pytesseractで日本語が認識されないのはなぜ?

pytesseractで日本語が認識されない場合、主に以下の理由が考えられます。

  • 言語データが不足している: 日本語を認識するためには、jpn.traineddataファイルがTesseractのtessdataフォルダに存在する必要があります。

これがないと、日本語のテキストを正しく認識できません。

  • 前処理が不十分: 画像の品質が悪い、または前処理が適切に行われていない場合、認識精度が低下します。

特に、ノイズやぼやけた画像は認識を妨げます。

  • フォントやスタイルの問題: 特殊なフォントや手書き文字の場合、Tesseractが正しく認識できないことがあります。

一般的なフォントを使用することが推奨されます。

画像の解像度が低いと精度が落ちるのはなぜ?

画像の解像度が低いと、文字の形状が不明瞭になり、OCRエンジンが正確に文字を認識できなくなります。

解像度が低いと、以下の問題が発生します。

  • 文字のディテールが失われる: 文字の細部がぼやけてしまい、OCRが文字を正確に識別できなくなります。
  • ノイズの影響が大きくなる: 低解像度の画像では、ノイズが文字と混ざりやすく、誤認識の原因となります。
  • 文字間のスペースが不明瞭になる: 文字同士の間隔が狭くなることで、OCRが文字を分離できず、誤った結果を生成することがあります。

OCRの精度を向上させるためのコツは?

OCRの精度を向上させるためには、以下のポイントに注意することが重要です。

  • 高品質な画像を使用する: 解像度が高く、明瞭な画像を使用することで、認識精度が向上します。
  • 適切な前処理を行う: グレースケール化、ノイズ除去、リサイズ、二値化などの前処理を行うことで、OCRの精度を向上させることができます。
  • 言語データを正しく設定する: 使用する言語に応じた言語データを正しくインストールし、指定することが重要です。
  • フォントの選択に注意する: 認識しやすい一般的なフォントを使用することで、精度が向上します。
  • 複数回の試行を行う: 同じ画像に対して異なる前処理や設定を試すことで、最適な結果を得ることができます。

これらのポイントを考慮することで、OCRの精度を大幅に向上させることが可能です。

まとめ

この記事では、Pythonを使用して画像からテキストを抽出する方法について詳しく解説しました。

特に、OCR技術の基本から始まり、Tesseract OCRの概要、Pythonでの実装手順、画像の前処理、複数言語のテキスト抽出、特定領域からのテキスト抽出、手書き文字の認識、PDFやスクリーンショットからのテキスト抽出に至るまで、幅広い応用例を紹介しました。

これらの知識を活用することで、さまざまな場面でOCR技術を効果的に利用できるようになります。

ぜひ、実際に手を動かして、画像からのテキスト抽出を試してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す