memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

画像からテキストエリアを抽出する

ある論文で使用していた標記のプログラムを動かしてみようと作者のBill Moorierさんのサイトにアクセスしてコード(1ファイル)をダウンロードしました。ちなみに、現在、このリンクは彼のサイトで公開していないようです。論文中にURLがあったのでアクセスできました。

で、このコードをコンパイルしたところエラー。。。com.sun.image.codec.jpegパッケージがdeprecatedになったことが原因でググると対策はImageIOを使えとのこと。

で、以下が書き替えて動いたコードのdiffです。確かに便利になっていますね。ImageIOを使うと1行で入出力できます。

18c18
< import com.sun.image.codec.jpeg.*;
---
> import javax.imageio.ImageIO;
408d407
<             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( out );
416c415
<             encoder.encode( contrastjpg );
---
>             ImageIO.write(contrastjpg, "jpeg",  out);
592,593c591
<             JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder( in );
<             BufferedImage image = decoder.decodeAsBufferedImage();
---
>             BufferedImage image = ImageIO.read(in);
600,601c598
<             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder( out );
<             encoder.encode( myget.isolateText( boxes ) );
---
>             ImageIO.write(myget.isolateText( boxes ), "jpeg", out);

ちなみにコードはこちら(gist)に置きました。

ちなみに、実行してみた結果は以下のような感じです。赤枠線がテキストエリアとして認識した結果になっているようです。

f:id:ke_takahashi:20150313144447j:plain

f:id:ke_takahashi:20150313144452j:plain

コードを読んでいませんが、論文には平均輝度を求めてそれより高い値を文字の部分と捉え塊があればテキストエリアと認識する。。。といったことが書かれていました。塊と見なす閾値を調整しないとうまくいかないのでしょうね。たぶん。