ImageMagick で写真から被写体を切り抜く

ImageMagick に入門して遊んでみています。

今回は学んだコマンドを使って、写真から被写体を切り抜くのを ImageMagick を使ってやってみました。

使うのは自分のアイコン画像です。背景が単色(ぽい)で処理しやすそうだったので。

1. JPEGPNG に変換する

今回は背景を透過したいので、まずオリジナルのJPEGからPNGに変換します。

$ magick original.JPG -strip original.png

普通に変換したら以下のようなエラーが出てしまったので、-strip でプロフィール情報を取り除きました。

$ identify -verbose original.png
...
identify: invalid profile length `original.png' @ warning/png.c/MagickPNGWarningHandler/1748.

f:id:co_bachie:20220213162124p:plain:w200
original.png

2. マスク画像を作成する

$ magick original.png -blur 10x5 -threshold 90% -transparent "#FFFFFF" mask.png

オリジナル画像の背景はクリーム色1色に見えるのですが、うっすら影みたいなものが写っていたりして、そのままでは二値化したときにごみが残ってしまいました。

そのため、まずぼかしをかけてごみを除去してから画像を二値化し背景領域を透過する処理をしました。

ぼかし

ImageMagick にはぼかしのオプションがありますが、今回はノーマル(?) な -blur を利用しました。

引数には {radius}x{sigma} を指定します。radius はぼかす範囲、sigma はぼかし量(σは標準偏差なので散らばり具合かな)です。

二値化

画像の二値化というのは、その名の通り画像を白と黒の2色のみに変換する処理のことです。

今回は -threshold オプションを使って、しきい値を超えた値は最大値(255 == 白)に、それ以外は最小値(0 == 黒)に変換する処理をしました。

しきい値は手探りでちょうどいい値を探しました。

背景領域を透過

二値化することで、被写体が黒 #000000、背景が白 #FFFFFF に置き換わったので、背景の白の部分を -transparent オプションで透明にしました。

f:id:co_bachie:20220213161936p:plain:w200
mask.png

3. 被写体を切り抜く

$ magick composite -compose DstIn mask.png original.png -alpha Set out.png

-compose オプションを使ってマスク画像とオリジナル画像を重ねます。 -compose の方法はいろいろあるので詳細は こちら を参照してください。今回は DstIn を使って2画像の重なる領域を取得しました。

そして最後に、新しく生成した画像で背景の透過を維持するために -alpha オプションを指定しておきます。

f:id:co_bachie:20220213161428p:plain:w200
out.png

おまけ

つくった画像でアクキーつくりました。

suzuri.jp