d.sunnyone.org
sunnyone.org

ページ

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

0 件のコメント:

コメントを投稿