Tesseractでデスクトップの一部にOCRをかける


要約

 デスクトップの一部をMacデフォルトのコマンドscreencaptureで保存し、それをsipsコマンドで拡大し、インストールしたtesseractでOCRをかける。余分な中間ファイルは削除する。

はじめに

 画面上の一部にOCR(Optical Character Reader;光学式文字認識)をかけたいことがある。例えば、web上に画像として新聞記事の一部がアップロードされているとして、その内容をいつでも検索できるように文字データとして保存したい時である。Mac上でコマンドラインで比較的簡単に導入できた。コマンドラインなので軽く、利用価値が高いと考え記事にした。

環境

macos: バージョン11.2.2
zsh: 5.8
tesseract: 4.1.1

準備

Tesseractをインストールする

 Tesseractとはエンジンフリーソフトウェアの光学式文字認識エンジンのことである1Homebrewを用いてインストールする2
 日本語は最初からは入っていないので、日本語読み取り用のデータをダウンロードする2。GithubからダウンロードするものよりUbuntuのapt-getコマンドでインストールするデータのほうが精度が良いようである2
 日本語は縦書きの場合があり、Githubには縦書き読み取り用のデータ(jpn_vert.traineddata)もある5。なお、縦書きの読み取りは難しく7--psmオプションを利用するなどの工夫をする8
 ダウンロードしたデータを決められたフォルダに保存する3。なお、言語データはTesseractのバージョンごとに異なるようだ4
 --psm(ページセグメンテーションモード)については以下を参照9

Tesseractの基本的な書き方

-l(エル)で言語を指定する。

tesseract input_file output_file -l jpn

・複数の言語を指定可3
・言語指定の順序が結果に影響を与えることがある10。ここではjpn+engの順にする。

tesseract input_file output_file -l jpn+eng

screencaptureコマンド

 Mac固有コマンド11。キーボード操作のshift + command + 4(または3)に相当し、スクリーンキャプチャする。画面上でOCRをかける範囲を指定するのに利用する。

sipsコマンド

 Mac固有コマンド11。画像の操作をする。今回は画像拡大に用いる。

手順概要

 原始的な方法で行う。一旦スクリーンキャプチャした画像をデスクトップに保存し、その画像にOCRをかけ、その後に画像を削除する。OCRをかけて得たテキストファイルもデスクトップに保存する。デスクトップ上で処理されていく様子を目で確認できるのがよい(?)。

スクリーンキャプチャ

-iオプションでインタラクティブモード(画面全体ではなく、選択した範囲のみキャプチャ)とする13
・上にあげた理由により、デスクトップに保存する。ファイル名はbeforeTest.pngとする。
・キャプチャに少し時間がかかるので、適当な時間待つ。簡単のためsleepで行う。

screencapture -i '/Users/issei-617/Desktop/beforeTest.png'

画像の拡大

・画像内の文字が大きい方がOCRの精度良い可能性があるので拡大する12。有名なコマンドライン画像処理ソフトにimagemagicがある。しかしMacには最初からはいってはいない。そこで今回はsipsコマンドを使用することにした12

sipsコマンドの使い方は他の方の素晴らしい記事があるのでそれを参照15

#ピクセル高を取得
sips -g pixelHeight PathToBeforeFile
#ピクセル幅を取得
sips -g pixelWidth PathToBeforeFile
#画像の全プロパティを取得
sips -g all PathToBeforeFile

・結果の必要なところだけ取り出す。今回はawkを使った。

beforeHeight=$(sips -g pixelHeight PathToBeforeFile | awk '(NR==2){print $2}')
beforeWidth=$(sips -g pixelWidth PathToBeforeFile | awk '(NR==2){print $2}')

・画像を拡大する。
・元の画像を上書きせず、オプション-oafterTest.pngとしてデスクトップに保存する。
・今回は適当に縦横それぞれ5倍にした。

sips -z $((beforeHeight*5)) $((beforeWedth*5)) PathToBeforeFile -o PathToAfterFile

OCRをかける

・上記のとおり、psmオプションで読み取り精度が上がることがある。不要かもしれないが、今回はなんとなくpsm 1としてみる。

tesseract PathToAfterFile PathToOCRFile -l jpn+eng --psm 1

デスクトップ上の不要なファイルを削除する。

・今回はOCRをかけた結果のテキストファイルだけ残す。

rm PathToBeforeFile PathToAfterFile

その他

・はじめにMacのdisplay alert機能を使ってメッセージを表示する。
・applescriptを用いるのでosascriptコマンドを使う。

osascript -e 'display alert "OCRをかける範囲を設定してください"'

・そのままではセキュリティに引っかかって使えない。システム環境設定 -> セキュリティとプライバシー -> プライバシ -> 画面収録 と選択し、鍵をあけて、ターミナルにチェックをいれる。

コード全体

#!/bin/zsh
#メッセージ
osascript -e 'display alert "OCRをかける範囲を設定してください"'
#スクリーンキャプチャ
screencapture -i '/Users/isssei/Desktop/beforeTest.png'
sleep 1
#パス準備
beforePath='/Users/isssei/Desktop/beforeTest.png'
afterPath='/Users/isssei/Desktop/afterTest.png'
ocrPath='/Users/isssei/Desktop/ocrTest'
#高さ、幅取得
beforeHeight=$(sips -g pixelHeight $beforePath | awk '(NR==2){print $2}')
beforeWedth=$(sips -g pixelWidth $beforePath | awk '(NR==2){print $2}')
#画像拡大
sips -z $((beforeHeight*5)) $((beforeWedth*5)) $beforePath -o $afterPath
#OCR
tesseract $afterPath $ocrPath -l jpn+eng --psm 1
sleep 3
#不要なファイルを削除
rm $beforePath $afterPath

・ヤフーの天気予報をデスクトップに表示してOCRをかけた。デスクトップに一時ファイルが作成される様子がわかる。
・ターミナル上でが完全に作業が終わるま前にデスクトップのファイルを開いたりするとエラーになるので注意。

考察

 同様の記事はあったが、「sipsではなくimagemagic」、「applescript連携のシェルスクリプトではなくシェルスクリプト連携のapplescript」、「デスクトップに表示されている画面ではなく保存されている画像」といった違いがあったため、あらためて記事にした。

参考

[1], https://ja.wikipedia.org/wiki/Tesseract_(ソフトウェア), Tesseract (ソフトウェア) - Wikipedia
[2], https://rooter.jp/ml/tesseract-with-mac/, MacでTesseract OCRを使って画像内のテキストを取り出してみる – 株式会社ルーター
[3], https://oku.edu.mie-u.ac.jp/~okumura/misc/190808.html, TesseractでOCR
[4], https://binary-star.net/tesseract-language-download, tesseract 言語データのダウンロード | Binary Star
[5], https://digitalnagasaki.hatenablog.com/entry/2019/08/01/155644, フリーのOCRソフトTesseract 4 が簡単に使えるようになってました! - digitalnagasakiのブログ
[6], https://mac-ra.com/mac-tesseract-screenshot/, 【Mac】メモをとる? スクショでいいじゃん | 林檎コンピュータ
[7], https://chichi1091.hatenablog.jp/entry/2019/12/10/001337, Tesseractで画像やPDFをテキスト化する - Believe you can
[8], https://qiita.com/henjiganai/items/7a5e871f652b32b41a18, PythonとTesseract OCRで文字認識 - Qiita
[9], https://binary-star.net/tesseract-option-psm, tesseract のオプション PSM をいじってみた | Binary Star
[10], https://blog.machine-powers.net/2018/08/02/learning-tesseract-command-utility/, tesseractコマンドの使い方(Tesseract OCR 4.x) | テクノロジーで楽がしたい
[11], https://macwiki.osdn.jp/wiki/index.php/OSX%E3%81%AE%E5%9B%BA%E6%9C%89%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89, OSXの固有コマンド - MacWiki
[12], https://qiita.com/tmsanrinsha/items/b195257a76ab190dccc9, Macでスクリーンショットからテキストを抽出して貼り付ける - Qiita
[13], https://do-zan.com/mac-terminal-screencapture/, Mac スクリーンショットコマンド「screencapture」の使用方法まとめ | D-Box
[14], https://mac-ra.com/image-resize-shellscript/, 【Mac】ターミナルで画像のリサイズ | 林檎コンピュータ
[15], https://qiita.com/livlea/items/53b755e5067d4ebc5b43, Macのターミナルで簡単に画像処理できるsipsの使い方 - Qiita