Tesseract-OCRとPyOCRで遊ぼう_2019秋
きっかけ
- 画像ソースしかないコードをテキスト(ってか.Rや.sql)で取得したかったけれども、全文打ち込むのが面倒だった
tesseract概要
- 画像から文字起こしする技術を光学文字認識(Optical Character Recognition)という。略してOCR。
- OCRを実施できるソフトウェアに、Googleが開発元の「テッセラクト(tesseract)」というものがある。「tesseract-OCR」とも呼ばれる。
- tesseract-OCRはオープンソース。
- tesseract-OCRをPythonで使えるようにするためのライブラリが「pyocr」
インストール
MacなのでHomebrewで入れる。
依存パッケージ①
brew install automake autoconf libtool brew install pkgconfig brew install icu4c brew install leptonica brew install gcc
ちなみに、
In order to prevent conflicts with Apple's own libtool we have prepended a "g" so, you have instead: glibtool and glibtoolize.
と出たので、
brew install glibtool glibtoolize
とやったけど、そんなのないよって言われた。。
依存パッケージ②
brew install pango
本体
このあたりを参考にしつつ、
git clone https://github.com/tesseract-ocr/tesseract/ cd tesseract ./autogen.sh ./configure make sudo make install # if desired sudo ldconfig make training # if installed with training dependencies
あとpyocr
は
sudo pip install pyocr
で入った。
辞書
日本語の辞書はここ。
本体インストール時に入っていなかったら
/usr/local/Cellar/tesseract/4.1.0/share/tessdata
に入れておく。*1
実践
まずはコマンドラインから
Pythonで日本語OCRを行うときのメモを参考に「笑顔が一番!れにちゃん」の画像を用意して、
tesseract ocr_test.png out -l jpn
と実行すると結果が以下(※外部テキストout.txtに出力される)
笑 顔 が 一 番 ! れ に ち ゃ ん
tessteractのバージョンが上がったからか、Qiitaのときよりも精度上がってる気がする。
Pythonで
Pythonで日本語OCRを行うときのメモとTesseract+PyOCRで簡易OCRを試してみるを参考に。
引数で画像ファイルと使用言語指定できるようにした。
import pyocr import pyocr.builders import argparse from PIL import Image parser = argparse.ArgumentParser(description='tesseract ocr test') parser.add_argument('image', help='image path') parser.add_argument('lang', help='choose language') args = parser.parse_args() tools = pyocr.get_available_tools() if len(tools) == 0: print("No OCR tool found") sys.exit(1) # The tools are returned in the recommended order of usage tool = tools[0] res = tool.image_to_string(Image.open(args.image), lang=args.lang, builder=pyocr.builders.TextBuilder(tesseract_layout=6)) print(res)
これをexample_2.py
とし、*2
$ python example_2.py ocr_test.png jpn 笑 顔 が 一 番 ! れ に ち ゃ ん
他にも色々試してみたけれども、なかなか英語中心に使える感じ。
終わりに
この手の話はPythonだろうなと思ったけど、やっぱりRでもできるんですよね! 近くRでもやってみたい。