ページ

2012-07-29

ImageMagickで「本文ボールド化」っぽいことをする

スキャンした本達を加工しているのだが、バッチ的に加工したいので、ImageMagickで加工する方法を模索している。

概ね自分に必要なことはImageMagickでできそうなのだが、ChainLPについている「本文ボールド化」というのに相当するのが見当たらない。ImageMagickなら適当に操作すればできるだろうということでやってみた。

結論のコマンドは、以下のとおり。


どうしてこうなったのかがわからないと思うので、詳しいことは以下に書く。

方針
本文ボールド化の設定画面を見ると、XとかYがあって、それぞれ値を増やすと画像の黒い部分がそれぞれの方向に伸びる。 ということは、黒い部分を検出して、XとYに伸ばしているに違いないと読んだ。

これは、以下の方法でできそうなので、それをコマンドでやることにする。
  1. 画像をコピーする
  2. 黒検出する
  3. 1pixel移動する
  4. 元の画像に重ねる
実装
上述の方法を、ImageMagickのコマンドで実現するとこうなる。
convert input.jpg # input.jpgをロード
   '('                   # スタックの次の画像として処理開始
      +clone                   # 最後の画像をコピー
      -threshold 50%           # 50%を境に、白黒にする
      -alpha Copy              # 白黒の値(Value大=白なので、白っぽさ)をアルファチャンネルにコピーする
      -channel alpha -negate   # アルファチャンネルの値を、逆転させる(黒っぽさにする)
      -geometry +0+1           # 縦に1pixelずらす
        '('                    # スタックの次の画像として処理開始
            +clone             # 前の画像をコピーして
            -geometry +1-1     # 縦の1pixelを戻し、横に1pixelずらす
        ')'                    # スタックの現在の画像の処理完了
      +composite               # ひとつ前の画像を、その前の画像に結合
    ')'                        # スタックの現在の画像の処理完了
   +composite                  # ひとつ前の画像を、その前に画像に結合 
   output.jpg                  # output.jpgに出力

-threshold 50%は、結構悩んだ。最適解には思えないので、-levelとか、-black-thresholdとかをうまくあてこむともっとよくなると思う。

参考
さらっと書いているが、ここまでたどりつくのにだいぶ苦労した。いろいろなところを読んだのだが、一番近くなったのはここ。
ImageMagick 透過PNGを非透過な画像に変換する

まぁ、なんといっても公式が大事。-fxまで使えれば、特殊なアルゴリズムを必要としない、バッチ的な画像加工は概ねできるんじゃないかと思っているが、まだ使いこなせていない。
ImageMagick: Command-line Options

2012-07-12

片付けの基本方針とコンピュータのデータ管理

片付けについてTipsはよくあれど、原則というか、もっと基本方針的なものがあるに違いない、ということで、ちょっと片付けについて勉強してみた。

Tips集ではなく、片付け方針が書いてありそうな本ということで、この本をチョイス。

この本[もう片づけで疲れない収納法]には、概ねこんなことが書いてある(もっと書いてあるけど、自分に都合のいいところだけピックアップ)
  •  片付けをするのは、使うため(使いやすくするため)。
  •  身の丈にあった片付け方をする(人によって、家の広さも、片付けにかけられる時間も、収納にかけられるお金も異なる)
  •  収納指数(歩数+アクション数)を最小に(よく使うものほど近く)
このあたりから、これって、こんぴゅーたにおけるデータの管理の仕方の話じゃね?ということに思い当たる。
  • 保存しなければいけないのは、後で使うデータ。それ以外、さっさと解放したほうがいい。
  • indexをつけると検索(取り出し)は早くなるが、書き込み(収納)は遅くなる(=手間がかかる)。
  •  アクセスコストの低い装置(L1, L2, メインメモリ…)には、よく使うものを配置したほうが効率が良い。

とりあえずの基本方針として、以下を選定。
  •  不要なものは、きちんと捨てる(Garbage Collectionする)。
  •  人/場所/物に合わせた、検索効率と書込効率のバランスのとれた収納手段を選ぶ。
  •  アクセスコストの低い場所には、利用頻度が高いものを収納する。

何をもって必要と判断するか、というとても大きな問題が残っているけど、とりあえずは。継続性を考えるのが最優先課題である。

昔は「メモリは、机の広さみたいなもので、広い方がいい」なんていう話をよく聞いたけど、今は逆の発想で、「机の上(memory)は限度があるから、使っていない(recentにuseしていない)ものはしまう(page outする)」とか、そういった方向性で考えたい。

2012-07-05

vimでテキストを横に並べて同期スクロールする

二つのテキストファイルがあり、WinMergeのような比較ツールが役に立たない場合に、並べて比較したい場合がある。

そんなときは、gvimを使って、垂直ウィンドウ分割をした後、それぞれにファイルをロードし、それぞれで以下のコマンドを打つと、左右のウィンドウでスクロールが同期されて便利。
:set scb

中身が全然違っていて、ずれちゃったような場合は、テキストを入力してずらしてもいいし、以下のコマンドを打てば、スクロール同期が解除される。
:set noscb

本当はもっと汎用的な方法(エディタに依存しないとか)がありそう、というかそうしたいのだけど、とりあえず。

参考:http://edo.tumblr.com/post/10388828485/vim