小さな境界線を残しながら Imagemagick で自動トリミングするにはどうすればよいでしょうか?

小さな境界線を残しながら Imagemagick で自動トリミングするにはどうすればよいでしょうか?

黒いフェルトの背景にコインの写真が入ったファイルが多数あります。ImageMagick を使用すると、-trim と -fuzz を使用してこれらの画像を簡単に自動トリミングできます。

エッジ検出はうまく機能していますが、私が見つけたいのは、「エッジを見つけてから 10 ピクセル戻る」、つまりコインに対して切り取るのではなく、コインの周囲 10 ピクセルを保持するという指定を可能にするパラメータです。-splice コマンドのように新しい境界線を追加したいのではなく、元の画像からの間隔を保持したいのです。

これまでのところ、それを実行する方法が見つかっていません。私が思いついた最も近い方法は、-trim info:- モードで実行し、出力をキャプチャして、手動クロップを使用してクロップを再計算することですが、1 ステップのプロセスの方が望ましいです。

私は Windows 10 で ImageMagick を使用しており、bash 拡張機能をインストールしていますが、その下でスクリプトをテストしたことがないので、純粋に Imagemagick コマンド ラインを使用するソリューションが望ましいでしょう。

答え1

エレガントな解決策がなかったので、実際に機能しているものを使用して、うまく機能していると思われる粗雑な bash スクリプトを作成しました。これにより、元のグラフィックを使用して背景を提供し、コインの周囲に 25 ピクセルのオフセットが残ります。最終的にはこれをパラメーター化してクリーンアップしますが、これが今日の作業用スクリプトです。

for f in *.jpg; do
    trimbox=$(convert $f -fuzz 25% -format "%@" info:)
    orig=$trimbox
    first=${trimbox%x*}
    trimbox=${trimbox#*x}
    second=${trimbox%%+*}
    trimbox=${trimbox#*+}
    third=${trimbox%+*}
    fourth=${trimbox#*+}
    #echo "trimbox: $orig first: $first second: $second third: $third fourth:$fourth"
    ((first+=50))
    ((second+=50))
    ((third-=25))
    ((fourth-=25))
    trimbox=$first"x"$second"+"$third"+"$fourth
    convert "$f" -crop "$trimbox" +repage "trimmed-$f"
done

答え2

-borderこれにはと を使用できます-bordercolor- たとえば、透明な境界線の場合は、次のようにします。

for f in *.jpg; do
  convert -fuzz 25% -trim -border 25 -bordercolor none +repage $f trimmed-$f
done

見るhttp://www.imagemagick.org/Usage/crop/#border

関連情報