最近は電子書籍が普及して、スマホやKindleなど画面上で本を読むことが多くなりました。私のお気に入りの雑誌「週刊アスキー」のなかに「JavaScriptの部屋」という記事があり、毎回、「JavaScriptでこんなこともできるのか」と驚かされるような興味深い内容が掲載されています。ただ、ダウンロードできるファイルとしてソースコードが提供されていないので、雑誌を見ながら手打ちでソースコードを打ち込む必要があります。これが結構大変なのですが、ふと「これ、OCRで自動的に文字を認識できたら楽なんじゃない?」と思い、画像から文字を抜き出すプログラムをPythonで作ってみたので、今回紹介したいと思います。

※ OCR(Optical Character Recognition/Reader、オーシーアール、光学的文字認識)とは、手書きや印刷された文字を、コンピュータが利用できるデジタルの文字コードに変換する技術。

準備

今回はオープンソースのOCRエンジンであるTesseract(テッセラクト)を使用します。準備の手順は以下の通りです。

  1. Tesseractをダウンロードする
    Tesseract: https://tesseract-ocr.github.io/tessdoc/Home.html
    Windowsのインストーラーは以下のURLからダウンロードできます。
    https://github.com/UB-Mannheim/tesseract/wiki
  2. ダウンロードしたファイルを実行して、インストールする。
  3. 日本語の訓練データを以下のURLからダウンロードする
    https://github.com/tesseract-ocr/tessdata_best/blob/main/jpn.traineddata
  4. インストールされたフォルダ(デフォルトでは「C:\Program Files\Tesseract-OCR」)内にある「tessdata」フォルダに「jpn.traineddata」を配置する。

またPythonモジュールとして「pyocr」を使うので、以下のコマンドでインストールします。

使い方

実行すると以下のようなGUIが立ち上がります。

ボタンを押すと画像ファイルを選択するダイアログが開くので、文字が含まれる画像を選んでください。複数のファイルにも対応しています。複数のファイルを選択するときは、コントロールボタンを押したまま、逆順(最後のファイルから)にファイルを選択していってください。選択後、ファイルを選んで「開く」ボタンを押すとOCR処理が始まります。

ここでは以下の2つの画像ファイルを読み込んでみました。

トロッコ1.png
トロッコ2.png

しばらく時間が経つと、テキストエリアに結果が表示されます。

結果を見ると、ところどころ間違った文字に認識されているところもありますが、概ねきちんと認識されているようです。

ソースコード

ソースコードの説明

12,13行目でインストールしたTesseractの実行ファイルがあるフォルダのパスと機械学習の学習済みデータが入っているパスを指定します。デフォルトでは以下の通りですが、違う場所にインストールした場合はそのパスを指定してください。

26~39行目にあるget_string_ocrメソッドがOCR処理をする関数です。

まずPIL(Python Image Library)ライブラリで画像を開いた後、グレースケールに変換し、さらにコントラストを上げる処理をしています。その後、OCRエンジンのimage_to_string関数で画像から文字を抜き出しています。第2引数に「lang=’jpn’」を指定することで、【準備】でインストールした学習データ「jpn.traineddata」を使用するようになるので、日本語を認識してくれます。

またimage_to_string関数で抜き出された文字列は文字と文字のあいだにスペースが入っているので、replaceメソッドでそれを取り除く処理をしています。

さいごに

このプログラムを使って「週刊アスキー」の「JavaScriptの部屋」に掲載されているソースコードをOCR処理してみました。「,(コンマ)」を「.(ピリオド)」と認識したり、「ID(アイ・ディー)」を「lD(小文字のエル・ディー)」と認識したり、「i(小文字のアイ)」を「;(セミコロン)」と認識したり、うまくいかないところもありますが、全て手打ちするよりは遥かに効率的にソースコードを書き写すことができるようになり、とても満足です。