Just another Ruby porter,


8月下旬の日記 | RDF

2014-08-21 (Thu)

multicropから必要なところだけを抜き出してみた

肝心要は-draw "matte X,Y floodfill"だった。
colorとは違いmatte channelつまりalpha channelを書き換える。
これで簡単にかたまりごとにマスクを作ることが可能になる。
スキャンした画像に対してはこれだけでいい。

% convert foo.pbm -fill none -draw 'matte 500,500 floodfill' -alpha extract -trim -format '%wx%h%O' info:
1360x1971+114+235

-alpha extractでcurrent channelをmatte channelで置き換え、trimした結果を表示。

実際はこれだと500,500と決め打ちになってるのがちょっとまずい。
黒にぶちあたればいいが、白になるかもしれない。
たまたま孤立点に当たるかもしれない。

% convert foo.pbm -fill none -draw 'matte 412,500 floodfill' -alpha extract -trim -format '%wx%h%O' info:
1x2+412+499

そこで確実に黒にするために適当な長さで線を引く。

% convert foo.pbm -fill black -draw 'line 500,500 600,600' -fill none -draw 'matte 500,500 floodfill' -alpha extract -trim -format '%wx%h%O' info:        
1360x1971+114+235

これで安定して本文だけの領域が求めれらた。
最終的には500,500とかじゃなくて画像の中心で。
-gravity centerで0,0にすれば中心になるかと思ったが全然ならなかったのは残念。


2014-08-20 (Wed)

スキャンしたページを重ね合わせる

1ページだと文字がばらばらになるが、
数十ページも重ねてやればかたまりになるはず。

とりあえずサイズでソートして真ん中の30個ほどで重ねてみた。
二値画像のほうがやりやすいのでpbmにしている。

% cat foo.sh
#! /bin/bash
N=30
for i in "{@-.}"; do
  pages=($(ls -S "$i"/*))
  n=$((${#pages[@]}/2))
  mid=${pages[n]}
  mid20=(${pages[@]:n-N/2:N})
  convert "${pages[n-N/2-1]}" multiply.pbm
  for j in "${mid20[@]}"; do
    convert multiply.pbm $j -compose multiply -composite -verbose multiply.pbm
  done
done
convert multiply.pbm -resize 30% multiply.png

これをmulticropにかけてみると、結構いい感じで本文だけ抜き出せた。
最下部の句読点を考えてちょっとマージンを大きめに設定すれば十分使えそうだ。

% multicrop -d 100 -u 3 multiply.pbm multicrop.pbm

Processing Image 0
Size: 1360x1971
Page Geometry: 1574x2360+114+235
% convert multicrop-000.pbm -resize 30% multicrop.png

実際はXはどうでもよくて、Yだけあれば十分なので、
縦に分割してても問題ない。

あとはmulticropの中を読んで最低限必要な部分を抜き出せばokだな。


2014-08-19 (Tue)

multicrop

これもfloodfillを利用してるようだ。
最後に書いてあるスクリプトの概要を見ると、
縦横を格子状に分割してその各点を含む領域を求める感じかな。
これを応用してスキャンした画像のノンブルを除いた本文だけの領域が抜き出せないかな。
ただ、各文字はどう考えても分離しているのでいい感じで全部つなげないとだめだ。
やってみると確かに何文字かが抽出されただけだ。
ぼやけさせるにしても限度があるし。


2014-08-18 (Mon)

pamtiltは速いが微妙

pamtiltはconvert -deskewに比べると格段に速いが結果がいまいち。
pamtiltした結果でrotateした画像をもう一度pamtiltすれば0になるはずだが、
微妙にまだ傾いてるよという結果になったりする。

% pamtilt 020-90.pbm 
-0.46
% convert 020-90.pbm -rotate 0.46 pbm:- | pamtilt                                         
-0.30

とまあなんとも微妙な結果だ。その点convertのdeskewはちゃんと0になってくれる。

% ~/local/bin/convert 020-90.pbm -deskew 10% -format '%[deskew:angle]\n' info:
0.671404
% convert 020-90.pbm -rotate 0.671404 pbm:- | \
  ~/local/bin/convert - -deskew 10% -format '%[deskew:angle]\n' info:
-0

%[deskew:angle]が使えるのは最近のconvertなのでそこだけ~/local/binのを使ってる。


2014-08-17 (Sun)

スキャンした画像からconvert -floodfillで黒い帯を消す

先日drawのcolorでfloodfillする技について触れたが、
これを利用すれば 黒い帯も消せるんじゃないかと思い実験。

drawだと二値化しないときついが、-floodfillオプションだと-fuzzでごまかせる。
というわけで、外側に1画素大きめのborderをgrayで書いて-floodfillで白く塗り潰す。

% convert black-belt.png -bordercolor gray -border 1x1 \
  -fill white -fuzz 50% -floodfill +0+0 gray -shave 1x1 \
  black-belt-floodfilled.png

こんな感じで右側の帯がきれいに消せた。

original floodfill

あれ、なんか色も濃くなってるけどなんでだ?まあいいか。むしろ好都合。

これは偶数奇数ページによって左右に出てくるので-chopや-cropで対処するのは面倒。
その点-floodfillだとどちらに出ててもというか上下にあっても問題なく除去できるはず。


8月下旬の日記 | RDF


WWW を検索 jarp.does.notwork.org を検索

わたなべひろふみ
Key fingerprint = C456 1350 085F A320 C6C8 8A36 0F15 9B2E EB12 3885
Valid HTML 4.01!