概要
いろいろやってみたいことがある中シリーズの、今回は「Pythonによる文字起こしを行ってみたいな」に取り組んでみようかと思います
活用できるシーンとしては、レシートの画像から文字・数字をを読み取りたいなであったり、本や手書きメモの画像から文字を抜き出すといったことができれば、何かしら役に立つのではないかと思いました
(すでに何番煎じかという話題なような気もします、スマートフォンのアプリにもそのようなやつを見かけたり・利用したこともあります)
実際に使ってみることで見える世界もあると思うので、導入の仕方や簡単な使用例を挙げて記事をまとめられればなと思います
本題
そもそもOCRとは?
導入に入る前に少し座学的なことを説明しておきます
OCRとありますが、こいつは何者なんでしょうか?
OCRとは「Optical Character Recognition」という光学的文字認識と呼ばれるもので、画像に含まれる文字を認識し、編集可能なデジタルテキストデータに変換する技術というものです
種類とまではいきませんが、事前に学習させたパターンにマッチした内容で識別する方法や、手書きに対応させるために独自にディープラーニングさせたAI OCRというものがあるそうです(機械学習の教師ありか教師なしかみたいな話ですね)
ということで簡単にまとめるとOCRとは、画像に含まれる文字を認識しデータ化することということでした
導入
OCRの意味もわかったところで、PythonでOCRを行っていきたいと思います
作業環境は「MacBook Air M1, 2020」です(買い替えたい)
PythonでOCRするにはTesseract OCRエンジンとPythonライブラリのインストールが必要になります
Tesseract OCRエンジンのインストール
homebrewからインストールします
brew install tesseract
# 自分の場合ではコマンド実行後に以下のコマンド実行するように言われました
brew reinstall tesseract
# インストール後確認
tesseract --version
Pythonライブラリのインストール
Pythonでも必要なモジュールをインストールします
pip install pytesseract Pillow
実装
実際のコードを記載します
import pytesseract
from PIL import Image
import os
image_path = "読み取りたい画像のパス"
output_filename = "読み取ったテキストの出力先"
def extract_text(image_file, output_file):
"""
画像からテキストを抽出し、ファイルに保存する関数
"""
if not os.path.exists(image_file):
print(f"画像ファイル{image_file}が見つかりません")
return
try:
# 画像読み込み
img = Image.open(image_file)
# TesseractでOCRを実行
# 言語を変えたい場合はlangを変更してください
extracted_text = pytesseract.image_to_string(img, lang="eng")
with open(output_file, "w", encoding="utf-8") as f:
f.write(extracted_text)
except pytesseract.TesseractNotFoundError:
print("Tesseract OCRエンジンが見つかりません。Tesseract本体をインストールしてください")
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
if __name__ == "__main__":
extract_text(image_path, output_filename)
image_path, output_filenameに必要な情報を入れて実行してください
工夫の仕方としては読み取りたい画像だけのディレクトリを作成して、ディレクトリ内の画像を全て読み取るでも良さそうです
また、手書きの文字では人それぞれの癖などもあり、正確に読み取ることは難しくなります
そういった場合は、高解像度化や二値化を行うことで読み取り精度を上げられるようにしましょう
二値化についてはPillowやOpenCVライブラリで実現することが可能です
最後に自分のアウトプットですが、すでに白黒の画像を使用しました
これを利用して、アウトプットすると以下になりました
正確に読み取ることができています
cat output.txt
Thirty years.
おわりに
ということでPythonでOCRをしてみたという内容でした
今回は自分の活用したいアイディアに二値化や手書きの文字読み取りなど凝ったものが必要ではなかったので深掘りはしませんでしたがもう少し複雑な文字の読み取りについてはどうなっていたのか気になるところです
例えば、文字の順番などはどの方向から読み取られるのか(上から下に順番なのか?)などなど
そちらについては皆さんの手元で実行して試していただければと思います
では次の記事でお会いしましょう
