2012年08月31日

スキャン画像ものぐさ補正作戦

Summary:
I wrote a simple bash script that calls scantailor-cli to deskew and clean scanned images.
It processes all jpg images including subfolders.
And it uses xargs to run scantailor-cli up to 4 instances simultaneously.
IT OVERWRITES ORIGINAL IMAGES SO KEEP BACKUP BEFORE TRYING!
Enjoy!

ちょっと前の「P6道とは打ち込むことと見つけたり」の続きです。
スキャンした紙面をScanTailorというソフトで補正すると書きましたが、このソフトはGUIで、基本的に1つのフォルダ内の画像に対してだけ機能します。
これまでためてきた紙面は、打ち込む時になったら補正すればいいやと思っていたので、何も補正せずに掲載号ごとのフォルダに分けて保管していました。
後になってスマホで読もうとしたら、補正なしでは読めたもんではない、かと言ってGUIでは1フォルダずつしか補正できない、という事でScantailorのコマンドライン版を使ってスクリプトで一括補正することにしました。

bashで画像フォルダをカレントディレクトリにした状態で以下のスクリプトを呼び出すとサブフォルダまで再帰的にたどってすべてのJPGファイルを補正(黒枠除去、傾き補正、ノイズ除去、レベル補正、50%縮小)します。
元画像は問答無用で上書きするので(おい)バックアップを取っておいてください。
キモはxargsコマンドを使って複数画像を同時に処理しているところです。

こんなの需要あるかなと思いましたが、海外では意外と自炊の情報交換が盛んで、scantailorもかなり使われている印象なので、一応アップしてみました。

ファイルや元雑誌の種類によるパラメータ調整は全くやっていないにも関わらず、なかなか良好な結果を出しています。
deskew1.png
I/Oのページヘッダーの部分は黒帯に白抜きなので、一部コピーの影と誤認されて消されてるページがありますが、実害はあまりないのでよしとします。(おい)
deskew2.png


#!/bin/bash
processjpg(){
echo processing $PWD/$1...
local BASENAME
BASENAME=`basename $1 .jpg`
convert $1 "$BASENAME".tif
scantailor-cli --layout=1 --disable-content-text-mask --color-mode=color_grayscale --normalize-illumination "$BASENAME".tif .
convert -resize 50% -level 20%,90% $BASENAME.tif "$BASENAME".jpg
rm $BASENAME.tif
}

processdir(){
pushd "$1" > /dev/null

#recursive
IFS=$'\n'
local dirname
for dirname in `ls -1`; do
if [ -d "$dirname" -a "$dirname" != '.' ]
then
processdir "$dirname"
fi
done

#remove temporary file
rm *_d.jpg 2> /dev/null
rm *.tif 2> /dev/null

#unpaper process
#parallel processing
ls -1 *.jpg | xargs -n1 -P4 -I{} bash -c "processjpg {}"
popd > /dev/null
}

SAVEIFS=$IFS
export -f processjpg
processdir "$PWD"
IFS=$SAVEIFS

ラベル:自炊 OCR scantailor
posted by eighttails at 21:11| Comment(0) | PC-6001 | このブログの読者になる | 更新情報をチェックする

2012年07月30日

P6道とは打ち込むことと見つけたり

N6XBasicCheckerもひとまずリリースできたという事で、せっかくなのでプログラムの打ち込みをしてみましょう。
昔はベーマガの誌面をカッターで切り取って、赤線付きの棒ルーペを当てて打ち込んでいましたが、エミュレータの登場により、プログラム打ち込みのワークフローは全く変わってしまいました。

今回は私のプログラム打ち込み手順を晒しておきたいと思います。

続きを読む
posted by eighttails at 23:53| Comment(3) | PC-6001 | このブログの読者になる | 更新情報をチェックする

2012年06月13日

モチベーションが落ち込んだりもしたけど、私は元気です。

前回の更新から1ヶ月が立ってしまったけれど、
件のN6XBasicCheckerは一旦仕切りなおしたいと思います。
ANTLRを使って開発するという方針を立てたは良いのだけど、実際に進めてみると
・IDE(ANTLRWorks)上でデバッグした構文解析結果と、実際に生成されたソースをコンパイルした際の構文解析結果が異なる。
・同じBASICリストを読み込ませても構文解析を実行するたび解析結果が異なる(パーサーの状態変数に不定値が含まれていると思われる)
という感じで、ちょっとこのまま開発を継続するのは難しいと判断しました。

そういうわけで、FLEX&Bison, boost spiritなど、
いくつかの他のパーサージェネレータを再評価とかやってる間に1ヶ月過ぎてしまいました。
現在はspiritを使って実装を進めており、何とか使えそうという感触を得ています。

その後の進捗は別のエントリに譲るとして、ネタがないのを埋め合わせに、今回はこの1ヶ月の間のP6活動を振り返ってみたいと思います。

続きを読む
posted by eighttails at 23:28| Comment(0) | PC-6001 | このブログの読者になる | 更新情報をチェックする