|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スキャンした書籍や書類の余白をImageMagickで除去する

-trim, -fuzz

そういう都合のいいオプションはないものかと調べてみると、 -trim というのが見つかりました。

convert -trim a.png a-out.png
a.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-a.png

a-out.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-a-out.png


ただし、 -trim オプションは「角のピクセルと同じ色」を除去するようで、 紙の色ムラ・染みなどノイズが混じっていると上手く除去できません。

convert -trim b.png b-out.png
b.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-b.png

b-out.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-b-out.png

convert -trim c.png c-out.png
c.png
//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-c.png
c-out.png
//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-c-out.png

そこらへんも適当にうまいことやってくれよーと思うわけですが、 なんと大変都合の良いことに -fuzz というオプションがあるんですね。

-trim に添えて -fuzz 50% などと指定してやります。

convert -fuzz 50% -trim b.png b-out2.png
b.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-b.png

b-out2.png

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-b-out2.png

すばらしい。


↓ パラメータをいじるとこんな感じで除去の度合いが変化します。

除去しない 0% ←→ 100% 強く除去する

スキャンした紙を加工する

以下、紙からスキャンした場合を想定した例です。

スキャンした画像 original.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-original.jpg


上記と同じように fuzz + trim

convert -fuzz 50% -trim original.jpg out-1.jpg
out-1.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-out-1.jpg


パーセント指定を大きくしすぎると 除去しなくていい部分(文字の一部)まで削れてしまいます。

convert -fuzz 70% -trim original.jpg out-2.jpg
out-2.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-out-2.jpg


せっかくなのでレベル補正しましょうか。

convert -level 0%,75%,0.8 -fuzz 50% -trim original.jpg out-3.jpg
out-3.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-out-3.jpg


さらに固定幅の余白を付けたい場合は -border を使います。

convert -level 0%,75%,0.8 -fuzz 50% -trim \
  -bordercolor '#ffffff' -border 10%x10% \
  original.jpg out-4.jpg
out-4.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-out-4.jpg


固定幅の余白を付けるのではなく できあがりの画像サイズを指定して中央に配置したい場合、 -border を使う代わりに次の2つの処理を組み合わせます。

(1) 白で塗りつぶした200x100ピクセルの画像を作成:

convert -size 200x100 xc:white out.jpg

(2) 下敷きとなる画像(sita.jpg) の上にそれより小さな画像(ue.jpg)を重ねる。 配置は上下左右の中央:

convert sita.jpg ue.jpg -gravity center -composite out.jpg

全部一緒に組み合わせるとこうなります。

convert \
  \( -size 320x400 xc:white \) \
  \( -level 0%,75%,0.8 -fuzz 50% -trim original.jpg \) \
  -gravity center -composite out-5.jpg
original.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-original.jpg

out-5.jpg

//blog-imgs-45-origin.fc2.com/h/a/r/haraita9283/im-trim-paper-out-5.jpg

分かりにくい場合は無理に繋げなくても中間ファイルを作って段階ごとに処理すれば良いかと思います。

参考

ImageMagick逆引きコマンドリファレンス
ImageMagick逆引きコマンドリファレンスクーガー株式会社 石井 敦

インプレスジャパン 2008-11-28
売り上げランキング : 426384


Amazonで詳しく見る
by G-Tools
「自炊」のすすめ 電子書籍「自炊」完全マニュアル
「自炊」のすすめ 電子書籍「自炊」完全マニュアル
インプレスジャパン 2011-07-22
売り上げランキング : 21130


Amazonで詳しく見る
by G-Tools
電子ブック自炊完全マニュアル
電子ブック自炊完全マニュアル戸田 覚

東洋経済新報社 2010-12-03
売り上げランキング : 67122


Amazonで詳しく見る
by G-Tools
スポンサーサイト

一定時間だけ指定範囲をハイライトする Emacs Lisp

一時的に指定範囲をハイライトするちょっとした Emacs Lisp を作ってみました。 ハイライトした後、一定時間後にハイライト表示が自動的に消えます。

volatile-highlight.el ― Gist


ハイライトしたい範囲の開始ポイントと終了ポイントを指定すると 一時的に指定範囲をハイライトする。 ハイライトする時間はデフォルトは 0.1秒なので、一瞬キラっとする感じ。


;; require する
(require 'volatile-highlight)

;; 使う
(volatile-highlight 1 10) ; 開始位置、終了位置
(volatile-highlight 1 10 2) ; 開始位置、終了位置、ハイライトさせる時間(秒)

ハイライトに使っているフェイスは volatile-highlight-face で、たとえば背景色を変えたい場合は


(set-face-background 'volatile-highlight-face "#ff8")

のように指定する。

デフォルトのハイライト持続時間を変更したい場合は volatile-highlight:default-duration-sec に秒数をセットする。


(setq volatile-highlight:default-duration-sec 10)

eval-defun または eval-last-sexp して一瞬キラッとさせたい場合の例:


(require 'thingatpt) ; for beginning-of-sexp

(defadvice eval-defun
  (after blink-after-eval-defun activate)
  (let (beg end)
    (save-excursion
      (end-of-defun) (forward-char -1)
      (setq end (point))
      (beginning-of-defun)
      (setq beg (point)))
    (volatile-highlight beg end 0.2)))
(ad-activate 'eval-defun)

(defadvice eval-last-sexp
  (after blink-after-eval-last-sexp activate)
  (let (beg end)
    (save-excursion
      (setq end (point))
      (beginning-of-sexp)
      (setq beg (point)))
    (volatile-highlight beg end 0.2)))
(ad-activate 'eval-last-sexp)

追記 2011-10-26

修正しました。変更点は以下の通り。

  • 複数の箇所を同時にハイライトできるようにした
  • volatile-highlight の3番目の引数で持続時間を指定できるようにした(optional)
  • 変数名などを修正

関連記事

参考

DbUnit メモ

基本的なこと

代表的な(?)使い方

- テーブルのレコード数を期待値と比較 … getRowCount
- テーブルの特定の行・列にある値を期待値と比較 … getValue
- テーブル同士(DBから取得したものとあらかじめ用意した期待値)を比較 … assertEquals
- データセット同士(DBから取得したものとあらかじめ用意した期待値)を比較 … assertEquals

データセットとテーブル

データセット(dataset)は複数のテーブルを持てる。

データセットオブジェクトは
- DB
- XMLファイル
- xlsファイル
から生成できる。
(サードパーティの(DbUnit公式ではない)ライブラリとして
JSON や YAML を利用するものもあるようです)

次の XML では、1つのデータセットに
MEMBERS と ITEMS という2つのテーブルが含まれている。

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <MEMBERS ID="1" NAME="ミネア" />
  <MEMBERS ID="2" NAME="マーニャ" />
  <ITEMS ID="1" NAME="ぬののふく" />
  <ITEMS ID="2" NAME="ひのきのぼう" />
</dataset>
xls の場合、ブック(ファイル) が dataset に、シートがテーブルに対応する。



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。