最初に。OCRって何?
OCRとは、画像から文字列を抽出するための技術です。
Google翻訳でスマホで読み取った画面を翻訳してくれる技術ありますね。あれがOCRです。あれは、読み取った画像に対してテキストを抽出して、自然言語処理を行っています。
で、OCR使って何できんの?それって日常に便利?
画像から文字を抜くのはわかったけど、他に何に使えるの?って話になります。例えばもらったチラシや会社、学校でのプリント、これらを読み取ってWordファイルなどにすることができます。また、黒板、ホワイトボードでの内容をわざわざメモすることなくテキストに変換できます。
事前準備
・Python3のインストール
・pyocrのインストール
・Pillowのインストール
・tesseractOCRのインストール
Python3のインストールは長いので割愛
Macユーザなので、そっち側の説明のみ行います。
Windowsユーザの方は下記リンクの執筆者様から参照ください。
では、Macの方.
pip install Pillow
または
pip3 install pillow
pip install pyocr
または
pip3 install pyocr
brew install tesseract
以上. sudoを前につけないと実行できない事もあるかもしれないので注意.
実践
png画像のみをターゲットとしています。他の形式のサポートは知りません。
import glob
import pyocr.builders
from PIL import Image
# 画像のファイル名を受け取ったら,txtを返す
class OCRs:
def __init__(self):
self.tools = pyocr.get_available_tools()
self.tool = self.tools[0]
self.langs = self.tool.get_available_languages()
self.lang = self.langs[0]
self.res = False
print(self.tools)
if len(self.tools) != 0:
self.res = True
def read(self, file_name):
if not self.res:
return 'error'
else:
txt = self.tool.image_to_string(
Image.open(file_name),
lang=self.lang,
builder=pyocr.builders.TextBuilder()
)
return txt
OCRsとかいうチンケな名前はおいといて、内容へ。
まず先に使うモジュールの宣言。
globはファイル(ディレクトリ)内のパスを取得するためのモジュールです。
pyocrはPythonでOCRを行うためのtesseractくんっていうエンジンとPythonとの架け橋のモジュールです。
PILは画像の読み込みに必要なモジュールです。
そして、initではtool,langなど一度しか使わない(呼び出す必要がない)もののセットをしています。
もしresにはOCRエンジンが無ければFalse,あればTrueという値を持たせておきます。
はい、メインのread関数ですね。やっていることは、引数にファイル名を受け取り、OCR(文字列抽出したもの)してテキストにて返却するということです。
まず、最初にOCRエンジンがあるかないかを判定します。無ければerrorという文字列を返すようにしています。
そして、後は画像と言語などをセットしてtxtにテキストを受け取ってから返します。
はい、メイン関数へいきましょう。
if __name__ == '__main__':
cl = OCRs()
cl.__init__()
file_names = glob.glob('/Users/sa/Desktop/プログラミング/target_folder/*')
for file_name in file_names:
if cl.read(file_name) == 'error':
print('OCRソフトが見つかりませんでした。')
break
else:
print(cl.read(file_name))
では見ていきましょう。まず、先ほどのクラスをclに代入してからinitを呼び出します。初期設定完了です。
それで、設定したい(OCRしたい)画像フォルダをglobを使って指定してあげます。
ディレクトリ操作がまだ難しいよって人のために僕の構成をちょっと改変して置いておきます。アホそうとか言わないで??
# 指定してあげたいディレクトリ(フォルダ)を入れる。
filenames = glob.glob('hogehoge/*')
# これでhogehoge内のファイル名全てを取得できる.
そして、繰り返しのfor文を使って全ての要素をさっきの関数にぶん投げる。
errorが返ってきたらOCRソフト入ってないよ。
以上。
もしこの画像1つだけ指定したいよ!!とかいう場合には、下記みたいに呼んであげればおk.
cl.read(filename)