読者です 読者をやめる 読者になる 読者になる

tesseract-ocrを使って紙の書籍のソースコードを読んでみた

どーも。panjaです。

通勤中にちまちまと「レガシーコード改善ガイド」を読んでいます。

レガシーコード改善ガイド

レガシーコード改善ガイド

文章中にはちょいちょいC++Javaコードスニペットが現れるのですが、普段IDEの力を借りて開発してることもあり、構文強調表示が無いとまぁ頭に入ってきません。
そんなことを思いながらなので当然モチベーションーも下がってきます。

どうにかしたいなーとぼんやり考えていたのですが、とりあえずデータ化しないと何も出来ないだろうということでOCRにチャレンジしてみました。

使用したOCRライブラリはtesseract-ocrです。元々はHPが開発していたらしいですが、今はGoogleが管理しているようです。オープンソースということで気軽に使用出来ます。
github.com

今回は自作のプログラムで使いたかったので、Githubからクローンしてきてビルドしたものを使いました。その辺の手順なんかはググってもらえればたくさん出てくると思いますので割愛します。


VisualStudio2013でtesseract-ocrをビルドして新規にソリューションを作成しました。
適当にパスなどを通してあげると使えるようになります。
dogear11.hatenablog.com
基本的に上記のページを参考にさせてもらいました。コードもほとんど同じです。

早速結果を見てみましょう。
以下は「レガシーコード改善ガイド」の一部をスキャンしたものです。
f:id:panda531531:20161124233105j:plain

この画像から文字を読み取ってみると......
f:id:panda531531:20161124233125p:plain

。。。。。。
前半はかなりいい感じですが、後半グダグダですね。
※「recognized text:」はOCRの結果ではありません

ソースコード自体弧を描いてるのはかなりまずい気がします。
が、とりあえず入力画像を2値化してみることにしました。


2値化した入力画像がこちらです。
f:id:panda531531:20161124233028j:plain
ゴミも残っていますが、文字自体は結構いい感じに2値化されています。

結果がこちらです。
f:id:panda531531:20161124233117p:plain
おぉ!?
少し良くなりましたね。
変な改行なんかが入っていますが改行文字を改行文字でも読み取ったんでしょうか。
ゴミの部分も無理やり文字化しているようですが、それを除くと数文字誤りがありますがそこそこの精度で読み取れているようです。

【今後の課題】

  • 日本語のコメントはどう見えるの?
  • ソースコードを線形に補正するような画像処理をかます(そんなものはあるんでしょうか?)
  • (きれいに読み込めた暁には)構文解析して強調表示なんか出来たらいいなぁ