8月 25, 2013

ScanSnapの白黒2値読み取りについて

文字主体の本はできれば白黒2値,それが読みにくいなら16階調グレースケールにすることを念頭において,白黒2値化について実験中なのだが,とりあえず,ScanSnap IX500 の白黒2値読み取りについてのメモ。

300dpi カラー読み取りの画像を,赤チャンネル抽出によるグレースケール化,レベル補正,白黒2値化したものと比較すると,直接ScanSnapから300dpi 白黒でスキャンした画像の方が,品質が高そうに思える。

これが,300dpi カラーで読み取ったままの画像。

300dpiカラー圧縮度1

全体的に紙焼けがあるものの,文字は読みやすく,ファイルサイズを気にしなければ,実用上は問題ない。これを1つ前の日記に書いたように,画像梱包,Ralpha, XnView を用いて白黒2値にしたものが,次の画像。

300dpiカラー圧縮度1から白黒2値に変換

紙焼けも除去されていて,まずまずだと思う。ところが,ScanSnapから直接300dpi 白黒で読み込んだ次の画像と較べてみると,明らかに後者の方が品質がよさそうなのである。

300dpi白黒

紙の左端の方に紙焼けの影響が残ってはいるが,それ以外は手動で白黒化したものよりも綺麗というのが,納得の行かないところ。そんなに素晴らしいアルゴリズムなのか?

ところが,画像のサイズを見ると,この白黒画像は縦横ともに300dpiカラーの2倍あるのだ!これはどういうことだろうか。想像だが,300dpiで読み取ったものを2倍に拡大して,それから白黒2値化しているのではないだろうか。そう言えば,スーパーファインについては 300dpi (白黒は600dpi相当) と不思議な事が書いてあった。600dpi相当というのは,そういうことなのかもしれない。

そこで,実験。300dpiカラーで読み取った画像に対して,2倍に拡大(アルゴリズムはLanczos)した後に,白黒2値化を手続きを施してみた。それが次の画像。

300dpiカラー圧縮度1を600dpiに拡大したのち白黒2値に変換

紙焼け除去のためのレベル補正とかの影響を除けば,ScanSnapの300dpi白黒とほぼ同じ品質だと思う。ファイルサイズも,CCITT FAX G4圧縮のTIFFファイル同士で,ほぼ同じであった。

というような訳で,断言は出来ないが,ScanSnapが生成する白黒画像は,おそらくは2倍にリサンプリングしたのちに2値化しているのだろうと思う。だから,白黒とカラーのどちらか一方を選ぶとすれば,フルカラーの方が良いかも。白黒2値化はあとでソフトウェア的に行えるのだから。まあ,それが面倒なら白黒でも悪くはないのだが。

スキャンしたPDFの後処理

以前から懸案ではあったのだが,Windowsマシンも買ったことだし,画像処理関係のツールをいろいろ集めて実験してみた。実は,Mac上でもImageMagickなどで実験していたのだが,Windowsだと専用のツールが豊富にあるようなので,それがWindowsマシン購入の理由の1つだったりするのだ。

自分でスキャンするものについては,スキャンの段階で白黒2値とか選べるが,Bookscanなどのスキャン代行業者に依頼したものは,そういうわけにもいかず,黄色く紙焼けした本など,そのまんまカラーでスキャンされているものが,けっこうある。それをきれいに脱色して,白黒2値あるいは16階調グレースケールあたりに変換するのが目的である。

いくつか試してみた結果,画像梱包,Ralpha Image Resizer, XnView の3つを使って,とりあえず目的を果たした。XnViewはMac版やLinux版もあるが,あとの2つはWindows専用のプログラムである。

まず,画像梱包(pic2pdf)を使って,PDFの画像を抽出する。ソフトの注意書きには,画像梱包でPDFにしたものに対してのみ抽出可能とあったが,スキャンした本のPDFでも大丈夫のようだった。要するに,複雑な構造のPDFもあるから,それは無理ということなのだろう。本をスキャンして作ったPDFは,たいていの場合,単にJPEGのデータにヘッダー(XMLとか)を付加しただけであるから,問題ないのだと思う。抽出のスピードも非常に速い。AcrobatでJPEG出力するよりもずっと速いのだ。しかもJPEGのヘッダーを外すだけなので,基本的に無劣化で画像が取り出せるらしい。

次は,Ralpha Image Resizer を使っての画像処理。紙焼けは,周辺部がとくにひどいので,文字がないことを確認してから,上下左右をトリミングする。そして,同じ分量だけ付け加える。こうすると,紙の周囲が真っ白になる。次に,2倍に拡大する。これで,600dpi相当にオーバーサンプリングしたことになる。最後に白黒2値化するので,解像度を上げておきたいから。続いて,トーンカーブを調節する。ここのところは,ImageMagickのlevel処理のように,high, low, gamma の3つで簡単に処理しても良いと思うのだが,まあ,似たようなもの。プレビュー出来るので,結果を見ながら調節できる。最後に,赤チャンネルのみを抽出してグレースケールにする。

このあと,白黒2値でCCITT FAX G4圧縮のTIFFにしたいのだが,Ralphaでは白黒2値というメニューがない。グレースケールで色数を2色にすれば,白黒2値と同じなのかもだが,それでもJPEGになってしまうのは嫌なので,Ralphaだけで済ますのはあきらめた。結局,Ralphaでは,グレースケールにしてPNGとして出力させて終了。

Ralphaで出力したPNGファイルをXnViewで一括変換する。一気に白黒2値とどれくらい違うが疑問だが,段階を踏むことにして,グレースケールの色数を4bit, 3bit, 2bitと下げていき,最後に1bitつまり白黒2値にする。白黒2値にする際には,閾値(しきいち,threshold)というパラメーターがあるはずなのだが。何故か見当たらない。ここが謎なのだが,ともかく白黒2値にする。出力はCCITT FAX G4圧縮のTIFFファイルとする。

最後に,再び画像梱包を使う。解像度を600dpiと指定して,PDFに固める。解像度の指定をしておくと,Acrobatで見るとき,100%でもそれほど巨大にならないし,それに,表紙と裏表紙(これはPDFから抽出したままで,2倍にしていない)を後からAcrobatで加えるとき,同じ大きさで表示されるので,ちょうど良い。

以上で作業は終了。これをバッチ処理できるスクリプトがあればよいのだが。書式は,
mypdf2pdf hoge.pdf -level high low gamma -color 1-2 143-144 -resize 2 hoge2.pdf
とかいった感じで。