Pythonを使ったOCRの完全ガイド!10ステップで写真からテキストへ

Pythonを使用したOCRのコーディングプロセスの図解Python
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングといえば、複雑なコードを書いて何かを動かす、というイメージが強いかもしれません。

しかし、それだけではありません。

プログラミングは、私たちが日々の生活や仕事で遭遇する問題を解決するツールであり、それを効果的に使うことで多くの作業を自動化したり、新しい解決策を見つけることができます。

特にPythonはそのようなタスクを効率よくこなすための優れた言語と言えます。

そして今回、この記事ではPythonを用いてOCR(Optical Character Recognition)という技術を使って、画像からテキストを読み取る方法を詳しく解説します。

この記事を読むことで、Pythonを使って画像からテキストを抽出する方法を習得でき、日々の作業をより効率化することができます。

それではまずはPythonとOCRの基本から始めましょう。

●PythonとOCRの基本

それではまず、PythonとOCRについて基本的な事を説明します。

○Pythonとは

Pythonは、1991年にグイド・ヴァンロッサムによって作られたプログラミング言語です。

彼の目指したところは「コードが読みやすく、明確で、ユーザーがプログラムを書く際に楽しめる言語」を作ることでした。

その結果、Pythonはその読みやすさとコーディングのしやすさから多くの開発者に愛されています。

特に、データ分析や機械学習、Web開発など、幅広い領域で活用されています。

○OCRとは

OCRは、Optical Character Recognitionの略で、光学的文字認識とも呼ばれます。

これは、スキャンされた文書や写真、あるいは映像から文字情報を抽出する技術です。

たとえば、紙に書かれた文書をスキャナでデジタル化した後、OCRを使ってその文書のテキスト情報を抽出することができます。

これにより、紙ベースの情報をデジタル化し、テキストとして扱うことが可能になります。

これからは、Pythonでこれらの技術を使ってどのようにして画像からテキストを抽出するのか、10のステップで詳しく見ていきましょう。

●必要なツールとライブラリ

OCRをPythonで行うためには、まずPythonと、PythonでOCRを行うためのライブラリが必要となります。

○Pythonのインストール

Pythonのインストールは非常に簡単です。

公式サイトからダウンロードし、インストーラに従ってインストールを進めれば完了します。

また、Pythonの実行環境としては、Jupyter NotebookやGoogle Colabなども人気があります。

これらの環境を利用すれば、ブラウザ上で直接Pythonのコードを実行し、結果を確認することができます。

○OCRライブラリのインストール

PythonでOCRを行うためには、OCRのライブラリが必要です。

その中でもTesseractというライブラリは無料で使うことができ、非常に高性能です。

PythonからTesseractを使うためにはpytesseractというパッケージをインストールします。

これはPythonからTesseractを呼び出すためのインターフェースを提供しています。

このパッケージはpipを使って簡単にインストールできます。

Pythonと必要なライブラリが揃ったら、実際にOCRを試してみましょう。

●OCRの詳細な使い方

OCRの詳細な使用法について説明します。

具体的には、画像の前処理と文字の位置情報の取得について深く掘り下げます。

○サンプルコード2:画像の前処理

画像の前処理はOCRの結果に大きな影響を与えます。

ノイズの除去、明度・コントラストの調整、二値化など、適切な前処理を行うことで、OCRの精度を高めることが可能です。

このコードでは、Pythonの画像処理ライブラリであるPILを使って、画像の前処理を行うコードを紹介します。

この例では、画像の二値化とノイズ除去を行っています。

from PIL import Image, ImageFilter

# 画像の読み込み
img = Image.open('sample.jpg')

# 画像をグレースケールに変換
img_gray = img.convert('L')

# 二値化
img_bin = img_gray.point(lambda x: 0 if x < 200 else 255)

# ノイズ除去
img_denoise = img_bin.filter(ImageFilter.MedianFilter(size=3))

# 画像の保存
img_denoise.save('preprocessed.jpg')

このコードを実行すると、元の画像が二値化され、ノイズ除去が行われた画像が得られます。

この画像をOCRにかけることで、より高精度な結果を得ることが期待できます。

○サンプルコード3:文字の位置情報の取得

OCRは単にテキストを抽出するだけでなく、その文字が画像のどの位置に存在するかという情報も得られます。

これを利用することで、レイアウト情報を保持したテキスト抽出が可能です。

このコードでは、PythonのOCRライブラリであるTesseractを使って、文字の位置情報を取得するコードを紹介します。

この例では、各文字のバウンディングボックス(囲む矩形)の位置を取得しています。

import cv2
import pytesseract

# 画像の読み込み
img = cv2.imread('preprocessed.jpg')

# OCRの実行(バウンディングボックスの情報を含む)
d = pytesseract.image_to_data(img, output_type=pytesseract.Output.DICT)

# 各テキストのバウンディングボックスを表示
n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:  # 信頼度60%以上のもののみ
        (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 画像の保存
cv2.imwrite('boxed.jpg', img)

このコードを実行すると、文字が存在する位置に矩形が描かれた画像が得られます。

これにより、各文字の位置情報を視覚的に把握することができます。

●OCRのカスタマイズ方法

OCRはそのまま使っても非常に便利ですが、より特定の目的に合わせてカスタマイズすることで、更なるパワーを発揮します。

特定の言語を認識させたい場合や、認識精度を上げたい場合など、その応用範囲は広大です。

ここでは、異なる言語のOCRとOCRの精度向上の2つのカスタマイズ方法を解説します。

○サンプルコード4:異なる言語のOCR

Tesseract OCRは多言語をサポートしています。

初期設定では英語が設定されていますが、別の言語を認識させたい場合は、その言語のパラメータを指定します。

例えば、日本語を認識させたい場合は、次のようなコードを書きます。

from PIL import Image
import pytesseract

# 画像を読み込み
img = Image.open('example_japanese.jpg')

# 日本語のパラメータを指定
result = pytesseract.image_to_string(img, lang='jpn')

print(result)

このコードではPILとpytesseractを使用して、日本語の文字が含まれている画像からテキストを抽出するコードを紹介しています。

この例では、まずPILを使って画像ファイルを開き、その画像データをpytesseractのimage_to_string関数に渡しています。

ここで重要なのは、image_to_string関数の第二引数にlang=’jpn’と指定することで、日本語のOCRを行っている点です。

このコードを実行すると、’example_japanese.jpg’という日本語の文字が書かれた画像から、そのテキスト情報が抽出されます。

実行結果は、画像に書かれた日本語のテキストが表示されます。

○サンプルコード5:OCRの精度向上

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

ノイズが多い画像や解像度が低い画像では、テキストの認識精度が下がる可能性があります。

しかし、画像処理の技術を利用して、画像の品質を改善することで、OCRの精度を向上させることが可能です。

ここでは、OpenCVを使用して画像のノイズを軽減し、OCRの精度を向上させる方法を紹介します。

import cv2
import pytesseract
from PIL import Image

# 画像をグレースケールで読み込み
img = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 画像のノイズを軽減
img = cv2.medianBlur(img,5)

# OpenCVの画像データをPILの画像データに変換
img = Image.fromarray(img)

# OCRを実行
result = pytesseract.image_to_string(img)

print(result)

このコードでは、まずOpenCVを使って画像をグレースケールで読み込みます。

次に、cv2.medianBlur関数を用いて画像のノイズを軽減しています。

この操作は、画像の各ピクセルをその周囲のピクセルの中央値に置き換えることでノイズを軽減します。

そして、その結果得られた画像データをPILの形式に変換し、pytesseractのimage_to_string関数でテキストを抽出します。

このコードを実行すると、’example.jpg’という画像からノイズを軽減した上でテキストを抽出します。

ノイズ軽減の効果は、元の画像と抽出されたテキストを比較することで確認できます。

●OCRの応用例

OCRの可能性は無限大です。

Pythonを使用してOCRをカスタマイズすると、あらゆる種類のプロジェクトやタスクで使用できます。

ここでは、OCRを使用したいくつかの一般的な応用例をご紹介します。

○サンプルコード6:PDFからのテキスト抽出

一つ目の応用例は、PDFからテキストを抽出することです。

これは大量の文書を電子的に管理する必要がある企業や研究者にとって非常に有用です。

このコードではPyPDF2というPythonのライブラリを使用してPDFからテキストを抽出し、その後でOCRを適用しています。

import PyPDF2
from PIL import Image
import pytesseract

# PDFを開く
with open("document.pdf", "rb") as file:
    pdf = PyPDF2.PdfFileReader(file)
    page = pdf.getPage(0)

    # ページをイメージに変換
    writer = PyPDF2.PdfFileWriter()
    writer.addPage(page)
    with open("out.pdf", "wb") as out:
        writer.write(out)

    image = convert_from_path("out.pdf")[0]
    image.save("out.jpg", "JPEG")

# OCRを適用
result = pytesseract.image_to_string(Image.open("out.jpg"))
print(result)

この例ではまず、PDFのページを画像に変換しています。

次に、この画像に対してOCRを適用してテキストを抽出します。

この方法を用いると、PDFからのテキスト抽出が可能となります。

○サンプルコード7:ハンドライティングのOCR

OCRは印刷されたテキストだけでなく、手書きのテキストからもテキストを抽出することができます。

この例では、手書きのテキストから情報を抽出するためのコードを紹介します。

from PIL import Image
import pytesseract

# ハンドライティング画像を開く
img = Image.open("handwriting.jpg")

# OCRを適用
result = pytesseract.image_to_string(img, config='--psm 10')
print(result)

この例では、Page Segmentation Mode(psm)を10に設定しています。

これは、画像が単一の文字だけを含むという想定の下でOCRを適用するための設定です。

手書き文字の認識は印刷文字よりも困難なため、このような設定が必要となります。

○サンプルコード8:リアルタイムOCR

リアルタイムOCRは、ビデオストリームからリアルタイムでテキストを抽出することが可能です。

この例では、webカメラからのビデオフレームからテキストを抽出するためのコードを紹介します。

import cv2
import pytesseract

# カメラからのビデオストリームを開く
cap = cv2.VideoCapture(0)

while True:
    # フレームをキャプチャ
    ret, frame = cap.read()
    if not ret:
        break

    # OCRを適用
    result = pytesseract.image_to_string(frame)
    print(result)

    # 'q'キーでループを抜ける
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

このコードでは、カメラからのビデオストリームを開き、各フレームでOCRを適用してテキストを抽出します。

この方法は、リアルタイムの情報を必要とする場面、例えば、ナンバープレートの自動認識やストリートビューからのテキスト抽出などに使用できます。

○サンプルコード9:OCRを用いた機械学習

OCRは機械学習のプロジェクトにも利用できます。

特に、大量の画像データからラベルを抽出する場合にOCRは有用です。

この例では、画像データからテキストラベルを抽出し、それを用いて機械学習モデルを訓練するためのコードを紹介します。

from PIL import Image
from sklearn import svm
import pytesseract
import os

# データの読み込みとラベルの抽出
X = []
y = []
for filename in os.listdir("images"):
    img = Image.open(os.path.join("images", filename))
    X.append(img)
    label = pytesseract.image_to_string(img)
    y.append(label)

# モデルの訓練
clf = svm.SVC()
clf.fit(X, y)

このコードでは、指定したディレクトリ内のすべての画像を読み込み、それぞれからテキストラベルを抽出しています。

そして、これらの画像とラベルを用いてSVMモデルを訓練しています。

この方法を用いると、画像データからラベルを自動的に抽出し、大量のデータに対して機械学習モデルを訓練することが可能となります。

○サンプルコード10:WebスクレイピングとOCRの組み合わせ

OCRはWebスクレイピングと組み合わせて使用することも可能です。

ウェブサイトから取得した画像データからテキストを抽出する場合などには、OCRが非常に有用です。

この例では、ウェブサイトから画像を取得し、それからテキストを抽出するためのコードを紹介します。

import requests
from PIL import Image
from io import BytesIO
import pytesseract

# ウェブサイトから画像を取得
response = requests.get("https://example.com/image.jpg")
img = Image.open(BytesIO(response.content))

# OCRを適用
result = pytesseract.image_to_string(img)
print(result)

このコードでは、まず指定したURLから画像を取得しています。

次に、この画像に対してOCRを適用してテキストを抽出します。

この方法を用いると、ウェブサイトから取得した画像データからテキストを自動的に抽出することが可能となります。

これらの応用例は、PythonとOCRの組み合わせが持つ無限の可能性を示しています。

これらのコードは基本的なものですが、各種のプロジェクトやタスクに合わせてカスタマイズすることで、より高度なOCRの応用が可能となります。

●OCRにおける注意点と対処法

OCRは非常に便利なツールですが、全てのケースで完全な結果を提供するわけではありません。

特に、フォントの種類や大きさ、画像の品質などが結果に影響を与えます。

また、複数の言語が混在するテキストや、書体が複雑なテキストの解析は困難な場合があります。

これらの問題に対する一つの解決策は、画像を事前に処理することです。

例えば、画像を二値化したり、ノイズを除去したりすることで、OCRの結果を改善することができます。

また、pytesseractの設定を変更することで、異なる種類のテキストに対応することも可能です。

PythonとOCRを組み合わせることで、あらゆる種類のテキストから情報を抽出することが可能となります。

ただし、その際には、OCRが完全ではないことを理解し、適切な前処理と設定を行うことが重要です。

まとめ

本記事では、Pythonを使用してOCRを行う方法を詳細に解説しました。

PythonとOCRを組み合わせることで、様々なタイプの画像からテキストを抽出することが可能です。

OCRの基本的な使用法から応用例、そして注意点と対処法まで、一通りの内容をカバーしました。

これで、あなたもPythonでOCRを活用することができます。

ぜひこれを機に、PythonとOCRを使用して自分のプロジェクトやタスクに挑戦してみてください。