OCRで写真や画面キャプチャ画像から文字列データを取得する方法

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

今回はPythonのプログラムで写真やキャプチャ画像からテキストを簡単に抽出できる方法を紹介します。

光学式文字認識にはGoogleがオープンソースで公開しているTesseract OCRエンジンを使用します。画像処理やデータ分析、事務処理業務の自動化など、様々な場面で役立ちますので、ぜひ活用してみてください。

目次

使用するPythonライブラリ

pytesseract

pytesseractは、GoogleのTesseract OCRエンジンをPythonプログラムから簡単に利用できるようにするラッパーライブラリです。Tesseract OCRは、光学式文字認識(OCR)のためのオープンソースエンジンで、多くの言語に対応しています。pytesseractを使用することで、画像からテキストを抽出するプロセスを簡単かつ効率的に実行できます。このライブラリは、画像処理、文書スキャン、自動化などのさまざまなアプリケーションで利用されています。

Pillow (PIL Fork)

Pillowは、画像の読み込み、変換、フィルタリング、描画などの機能を提供しています。さまざまな画像フォーマットに対応し、高速な画像操作が可能です。Pillowは、ウェブアプリケーションやデータ分析、画像処理などの幅広い分野で利用されています。
今回紹介するプログラムでは、pytesseractに入力する画像をRGBモードに変換するために使用します。

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

コマンドプロンプトで以下のコマンドを実行してください。

pip install pytesseract
pip install Pillow

日本語データをダウンロード

日本語の言語ファイルをダウンロード

Tesseractに日本語を認識させるためには、日本語の学習データファイルが必要です。

日本語の学習データファイルをダウンロードし、適切な場所に配置します。その後、環境変数TESSDATA_PREFIXを設定して、Tesseractが学習データファイルを参照できるようにします。

言語ファイルのダウンロードページ(https://github.com/tesseract-ocr/tessdata)にアクセスします。「jpn.traineddata」という日本語の言語ファイルをダウンロードし、tessdataactのディレクトリに配置します。
(Anacondaを使用した場合のディレクトリの例です)

C:/Users/(ユーザー名)/anaconda3/pkgs/tesseract-5.3.0-hcb5f61f_0/share/tessdata

使用できる言語を確認する

言語ファイルの配置が完了したら、コマンドプロンプトで以下のコマンドを実行すると使用できる言語ファイルを確認することができます。

tesseract --list-langs

作成したPythonコード

ここからは実際にpytesseractを使った光学文字認識処理の実装方法について解説します。

Pythonコード解説

読み込む画像ファイルの指定

読み込む画像ファイルのパスを変数 IMG_FILE_PATH に設定します。

#読み込む画像ファイルのパスを設定
IMG_FILE_PATH = "ocrtest.jpg"

環境変数の設定

Tesseract OCRの言語ファイルが格納されているパスを変数 tessdata_dir に設定し、環境変数 TESSDATA_PREFIX にこれを設定します。これにより、Tesseract OCRが言語ファイルを正しく読み込めるようになります。

#言語ファイルのパスを環境変数に設定
tessdata_dir = "C:/Users/(ユーザー名)/anaconda3/pkgs/tesseract-5.3.0-hcb5f61f_0/share/tessdata"
os.environ["TESSDATA_PREFIX"] = tessdata_dir

RGBモードへ変換

image.convert('RGB') を使って画像をRGBモードに変換します。これにより、画像が異なるモード(例:CMYKやグレースケール)であっても、Tesseract OCRが処理できる形式に変換されます。(RGBモード以外だと読み込み時にエラーが発生する場合があります)

#画像をRGBモードに変換
image = image.convert('RGB')

光学文字認識処理を実行

pytesseract.image_to_string() 関数を使って、画像から文字列データを抽出します。この関数には、処理対象の画像オブジェクトと、使用する言語(ここでは日本語)を指定します。

#画像から文字列データを抽出
text = pytesseract.image_to_string(image, lang='jpn')

全体のソースコード

作成したPythonの全体のソースコードは以下の通りです。

from PIL import Image
import pytesseract
import os

#読み込む画像ファイルのパスを設定
IMG_FILE_PATH = "ocrtest.jpg"

#言語ファイルのパスを環境変数に設定
tessdata_dir = "C:/Users/(ユーザー名)/anaconda3/pkgs/tesseract-5.3.0-hcb5f61f_0/share/tessdata"
os.environ["TESSDATA_PREFIX"] = tessdata_dir

#画像ファイルを開く
image = Image.open(IMG_FILE_PATH)

#画像をRGBモードに変換
image = image.convert('RGB')

#画像から文字列データを抽出
text = pytesseract.image_to_string(image, lang='jpn')

#結果を出力
print(text)

実行結果

認識させる画像

今回は動作テストに使用する画像として以下のページで公開している芥川 龍之介の「魚河岸」の一部をスクリーンショットしたものを使用します。

実際のスクリーンショットがこちらです。

pytesseractの出力

先ほどのプログラムを実行し、Tesseract OCRで文字認識した結果が以下となります。

あくたがわりゅうのすけさく うおがし 去年の春の夜といってもまだ風の 寒い月のさえた夜の
九時ごろ やすきちは三人の友達とうおがし の往来を歩いていた 三人の友達とは俳人の路西 洋
画家の風中 新江氏の除丹 三人とも
本名は明かさないがその 道では知られた腕つっこきである ことに路西は年笠でもあり 新塵行の
俳人としては都に名を 馳せた男だった 我々は皆酔っていた もっとも風中と靖吉とは外子 除丹
は名代の主号だったから三人 は普段と変わらなかった ただ路西はどうかすると足元も 少々危
なかった 我々は路西を仲にしながら生臭い 月明かりの吹かれる通りを 日本橋の方へ歩いて行
つた路西は喫水の江戸っ子だった 曹操夫は食産や文帳と こういうの扱った人である いえも菓
子の丸生といえば あの界隈では知らぬものはない それを路西はずっと前から 家業はほとんど
人任せに従り 自分は三夜の路地の奥に 食と書と転殺等を楽しんでいた だから路西には我々に
ない どこかいなせな風格があった 下町片城よりは殿房な 山の手にはもちろん縁の遠いいわば
某子のマグロの寿司と 一味相通ずる何者かがあった 路西はさも邪魔そうに時々街頭 の袖をは
ねながら 快活に我々と話し続けた 女主は静かに笑い笑い話の合図 を打っていた そのうちに
我々はいつのまにか 菓子のとっつきへ来てしまった このまま菓子を出抜けるのは みんな妙に
物足りなかった するとそこに養殖屋が一見 片側を照らした月明かりに白い のれんをたらして
の店の叶は靖吉さえも何度か 聞かされたことがあった 入ろうか 入ってもいいな そんな
い合ううちに我々 はもう風中を先に 狭い店の中へなだれ込んでいた 店の中には客が
二人 細長い剤に向かっていた 客の一人は菓子の若い衆 もう一人はどこかの食行らしかった
我々は二人ずつ向かい合いに 同じ卓に割り込ませてもらった それから平具のフライを魚に ち
びちび正宗をなめ始めたもちろん下骨の風中や靖吉は 二つとちょくは重ねなかった その代わ
り料理を平げさすと 二人ともなかなか健坦だった この店は卓も腰掛もニスを準らない 白木だ
つた おまけに店を加工者は江戸伝来の 吉津だった だから洋食が食っつていてもほとんど 洋食屋
とは思われなかった風中はあつらえた美不敵が来る とこれは切り身じゃないかと言ったりし
た序端はナイフの切れるのに大いに 敬意を表していた 靖吉はまた伝統の明るいのがこういう
場所だけにありがたかった 路西も路西は土地っこだから何も 珍しくはないらしかった しか取
口棒を網だにしたまま序端 と研修を重ねては相変わらず快活 に喋っていた するとその最中に中
折れ棒をかぶ った客が一人ぬとのれんをくぐって 来た客は街頭の毛皮の鶴に太った類をうず
めながら 見るというよりはにらむように 狭い店の中へ目をやった それから一言の挨拶もやせず
序端 若い衆との間の席へ大きい体 を割り込ませた 靖吉はライスカレーをすくいながら いや
なやつだなと思っていた これが和泉強化の小説だと人気を 喜ぶべき芸者か何かに退治られる や
つだがと思っていた しかしまた現代の日本林は到底 強化の小説のように動きっこはない とも
思っていた客は注文を通した後王兵に煙革 を吹かし始めた その姿は見れば見るほど堅木役 の
寸法にはまっていた 油ぎったあから顔はもちろん大島 の羽織認めになる指輪 ことごとく肩を入
れなかった 靖吉はいよいよ当てられたから この客の存在を忘れたさに隣にいる 路西へ話しか
けた が路西はうんとかえーとかいい 加減な返事しかしてくれなかった のみならず彼も当てら
れたのか 伝続の光に音きながらわざと取り 打ち棒をまぶかにしていた 靖吉はやむを得ず風中

発生したエラー

実行時に発生したエラーです。

raise TesseractError(proc.returncode, get_errors(error_string))
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file ./jpn.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language \'jpn\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')

言語ファイルが正しい場所に配置されていないと、環境変数を設定していても発生するようです。デフォルトの言語ファイルが配置されているディレクトリを検索し、同じ場所に配置してみてください。

まとめ

今回は、Tesseract OCRを使った画像からの文字抽出プログラムを作成しました。このプログラムは、OCR技術を利用して画像内のテキストを瞬時に取得できます。気になったWebサイトや書籍、雑誌などの情報もOCRを活用することで効率的にストック、利用できますのでぜひ活用してみてください。

Tesseract OCRで検出した文章をChatGPTで要約する方法についても以下の記事で解説しています。

また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。

スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。

講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次