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

## Tesseractの基本的な書き方

・`-l（エル）`で言語を指定する。

```zsh:
tesseract input_file output_file -l jpn
```

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

```zsh:
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`で行う。

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

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

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

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

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

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

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

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

```



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

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

## デスクトップ上の不要なファイルを削除する。
・今回はOCRをかけた結果のテキストファイルだけ残す。

```zsh
rm PathToBeforeFile PathToAfterFile
```

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

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

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



# コード全体

```zsh
#!/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をかけた。デスクトップに一時ファイルが作成される様子がわかる。
・ターミナル上でが完全に作業が終わるま前にデスクトップのファイルを開いたりするとエラーになるので注意。


![デスクトップOcr_低画質.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444980/1192d175-21a6-5d21-de3f-a4adee16197a.gif)


# 考察
　同様の記事はあったが、「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

[1]: https://ja.wikipedia.org/wiki/Tesseract_(ソフトウェア)
[2]: https://rooter.jp/ml/tesseract-with-mac/
[3]: https://oku.edu.mie-u.ac.jp/~okumura/misc/190808.html
[4]: https://binary-star.net/tesseract-language-download
[5]: https://digitalnagasaki.hatenablog.com/entry/2019/08/01/155644
[6]: https://mac-ra.com/mac-tesseract-screenshot/
[7]: https://chichi1091.hatenablog.jp/entry/2019/12/10/001337
[8]: https://qiita.com/henjiganai/items/7a5e871f652b32b41a18
[9]: https://binary-star.net/tesseract-option-psm
[10]: https://blog.machine-powers.net/2018/08/02/learning-tesseract-command-utility/
[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
[12]: https://qiita.com/tmsanrinsha/items/b195257a76ab190dccc9
[13]: https://do-zan.com/mac-terminal-screencapture/
[14]: https://mac-ra.com/image-resize-shellscript/
[15]: https://qiita.com/livlea/items/53b755e5067d4ebc5b43