LoginSignup
3
7

More than 5 years have passed since last update.

画像をOCRして検索用のテキストファイルを作る

Last updated at Posted at 2019-02-23

環境

  • Windows 10
  • Python 3.7.1 (Anaconda3-2018.12-Windows-x86_64)
  • pyocr
  • Tesseract OCR 4.0.0

Tesseract OCRとpyocrは以下の記事を参考に入れた。
PythonでOCR

フォルダ内の全画像のOCR

とりあえずフォルダ内の全画像にOCR掛ける雑なツールを作った。
遅いので並列化した→ 画像からOCRテキスト出すやつを並列化する
以下のソースは勉強用にしてください。

from PIL import Image
import sys

import pyocr
import pyocr.builders
import glob
import os

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]
print("Will use tool '%s'" % (tool.get_name()))
# Ex: Will use tool 'libtesseract'

langs = tool.get_available_languages()
print("Available languages: %s" % ", ".join(langs))
lang = langs[0]
print("Will use lang '%s'" % (lang))

ocrtext = ""
for p in glob.glob('./**', recursive=True): # ディレクトリとファイル取得
       if os.path.isfile(p):
           # ファイルの場合
           name,ext = os.path.splitext(p)
           if ".jpg" == ext or ".png" == ext or ".gif" == ext:
                txt = tool.image_to_string(
                    Image.open(p),
                    lang="jpn",
                    builder=pyocr.builders.TextBuilder(tesseract_layout=6)
                )
                ocrtext += p + ":\n" + txt + "\n\n"
                print( p )
                print( txt )

f = open('ocrtext.txt', 'w', encoding='utf-8')
f.write(ocrtext)
f.close()

これでOCR済みテキストが保存できる。

これにエディタとかで検索をかければ手動で画像探す時のインデックス代わりに使えそう。

ただし、実行にかなり時間がかかった。約2500画像ほどで約1時間(CPUはRyzen7 2700X)。
CPU使用率が20%程度と低く、シングルスレッドでちくちく動いてしまっているのでなんとかしたい。
1日経たずに並列化した→画像からOCRテキスト出すやつを並列化する

2/27追記: なんか"UnicodeEncodeError: 'cp932' codec can't encode character ..."とエラーが出た。
書き込み時のエンコーディング指定忘れが原因だった。ちゃんとencoding='utf-8'をつけましょう…。

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7