Tesseract を使ってスクリーンショットからテキストを抜き出す

システム技術部の木田です。小ネタです。

古いドキュメントを整理していたら、コマンド実行例などがスクリーンショットで保存されていました。
「少量なら仕方ない」と、画像を見ながら手打ちでテキストを起こしていましたが、どうにも量が多いようなのでOCRで処理することにします。

  1. TesseractWindwosバイナリ をインストールします。
  2. "c:\Program Files\Tesseract-OCR\tesseract.exe" image.png - -l eng で標準出力にOCRでスキャンした結果を表示してくれます。
  3. おわり。

Tesseract はとても扱いやすい OCR エンジンなので、インストールしてコマンドを叩くだけで簡単にテキスト起こしをしてくれます。

しかし、これを実際にやってみると「画像に文字以外の物が含まれるので結果にゴミが混ざる」「画像がSVG形式なのでPNGに変換しなければならない」など結構厄介です。 ドキュメントを書きながら画像が出てくるたびにこの作業をするのも面倒。

VSCode の bash でお手軽にOCRする

ということで、コマンド一発でクリップボードの画像をテキストに変換するようにしました。 普段 Visual Studio Code の bash を使って作業しているので、Power Shell と bash 用のエイリアスです。

クリップボードのイメージをPNG形式で保存する

PowerShell スクリプト*1
ファイル名は c:\tmp\ocr.png 決め打ち。

~/scripts/save-clip-image.ps1

Add-Type -AssemblyName System.Windows.Forms
$filename = "c:\tmp\ocr.png"
if ($([System.Windows.Forms.Clipboard]::ContainsImage())) {
    $image = [System.Windows.Forms.Clipboard]::GetImage()
    [System.Drawing.Bitmap]$image.Save($filename, [System.Drawing.Imaging.ImageFormat]::Png)
} else {
    exit 1
}

画像をスキャンしてクリップボードに送る

c:\tmp\ocr.png をスキャンして結果のテキストをクリップボードに送るエイリアス。

~/.bashrc

alias save-clip-image="powershell ~/scripts/save-clip-image.ps1"
alias tesseract="/c/Program\ Files/Tesseract-OCR/tesseract.exe"
alias ocr="save-clip-image && tesseract /c/tmp/ocr.png - -l eng | clip "
alias ocrjp="save-clip-image && tesseract /c/tmp/ocr.png - -l jpn | iconv -c -t SJIS | clip"

英語のみが含まれる画像は英語モードでスキャンした方が精度が良いので、ocrocrjp の2つ用意しています。

使い方

ドキュメント編集中に画像化されたテキストを見つけたら

  1. Windows+Shift+S で必要な部分だけスクリーンショットを撮る。
  2. bash で ocr って叩く*2
  3. 画像があった部分にペースト。スキャンミスがあれば修正。

これでかなり素早く作業出来るようになりました。

Tesseract を使ったOCRは目新しいものでは無いですが、ちょっとコマンドを組み合わせると扱いやすくなるよという話でした。

*1:Save Image from clipboard using PowerShell - Stack Overflowを参考にしました。

*2:ocrと打つのも面倒なら、VSCode のショートカットにしてあげてもよい。