web-dev-qa-db-ja.com

imagemagick:アンチエイリアシングで画像の背景色を変更する方法

fox

キツネだけを飼いたい。それはimagemagickで画像の白い背景色を透明に変更することです。

アンチエイリアシングは扱いにくく、画像のエッジは鋸歯状です。

試してみました。

ここにコードがあります:

convert fox.jpeg -alpha set -channel RGBA \
-fill none -opaque white fox_one.jpeg 

convert fox.jpeg -Matte -fill none \
-draw 'color 0,0 replace' fox_two.jpeg

どちらも失敗しました

enter image description here

color_basics /#replace に従ってそれを行いました。

より正確なドキュメントをお勧めしますか?そしてそれを修正する方法は?

4
dengApro

残念ながら、 アイコンに関する以前の質問とは異なり 、より複雑な画像を使用して背景を除去する方法はたくさんあります...したがって、単一の「良い」解決策はありません。そうは言っても、あなたが投稿した例では、より満足できるいくつかのアプローチがあります。


私は以下の提案をしますが、私が現在気付いていないことを行うにはもっと良い方法があるでしょう。間違い、記載漏れ、見落としなどありましたらご容赦ください。 =)


シンプルな単色の透明度

単一の色(背景など)を透明に変換するには、次を使用できます。

convert fox.jpg -transparent white fox_transparent.png

ただし、これにより、悪い画像と同じ結果が得られます。これは望ましくありません。

例fox_transparent

fox_transparent_nofuzz

これは、白(上記)の領域が実際には白ではないためです(主に、前述のようにアンチエイリアシングが原因で、オフホワイトになっています)。これを修正するための1つの可能なオプションは、 -fuzz を使用して、ほぼ(ほぼ)白のピクセルを選択することです。

convert fox.jpg -fuzz 11% -transparent white fox_transparent_fuzzed.png

これにより、より良い結果が得られます。

例fox_transparent_fuzzed

fox_transparent_fuzzed


より良いエッジ(?)

-fuzzの単純な使用で十分に機能する場合もありますが、それでも望ましくない粗さが存在する可能性があります。

例fox_transparent_fuzzed-ラフエッジ

fox_transparent_fuzzed_jaggies

この問題に対処するために、ぼかされた mask を使用して、画像のエッジを柔らかくすることができます。これを1つのステップで行うには、 このフォーラムの投稿からコードを取得できます そして次のように使用します。

convert fox.jpg ( -clone 0 -fuzz 11% -transparent white -blur 0x1 ) -compose copy_opacity -composite fox_transparent_fuzzed_blurry_mask.png

このコマンドは、ぼやけたマスクを作成し、それを元の画像と合成します。これが結果です:

例fox_transparent_fuzzed_blurry_mask

fox_transparent_fuzzed_blurry_mask

エッジが柔らかくなっていることがわかります。

fox_transparent_fuzzed_nojaggies

必要に応じて、2つのステップで同様のことを行うことができます。

convert fox.jpg -type Grayscale -negate -fill white -fuzz 11% +opaque "#000000" -blur 0x1 fox_blur_mask.jpg
convert fox.jpg fox_blur_mask.jpg -compose copy_opacity -composite fox_transparent_blur_mask_result.png

最初のコマンド:

  • 画像の白黒バージョンを作成します(-type Grayscale)。

  • (効果的に)マスキングの目的で色を反転します( -negate )。

  • -fill white -fuzz 11% +opaque "#000000"を使用して、キツネの頭を白で塗りつぶします(元の画像のほとんどを見ることができます)。

  • 画像にライト-blur 0x1を適用します。

これは作成されたマスクであり、最終的な画像では黒のすべてが透明になります。

例fox_blur_mask

fox_blur_mask

2番目のコマンドは、元の画像とマスクを単純に組み合わせて、次の結果を取得します。

例fox_transparent_blur_mask_result

fox_transparent_blur_mask_result

結果は、前に示した「すべて一緒に」の例とほぼ同じであることに気付くでしょう。

fox_transparent_fuzzed_blurry_maskfox_transparent_blur_mask_result


警告

  • すでに述べたように、与えられた提案は物事を達成する唯一の方法ではなく、与えられたコマンドの代替/より良いバージョンがあるかもしれません。

  • これらの例は、元の画像に透明度がないことを前提としています。ある場合は、別のオプション/コマンドを使用する必要がある場合があります。同様に、これらの提案は、入力形式として.jpgファイル、出力形式として.pngファイルでのみテストされています。

  • -fuzzの基本的な欠点は、一貫した方法で適用するのが難しいことです。 -fuzz 11%は、サンプル画像に最適です。 -fuzz 10%またはfuzz 12%は、不要な浮遊ピクセルを残す可能性があります。他の-fuzz値は、他の画像にも必要になる可能性があります。

  • これらの提案は、背景と同じ色の画像の特定の部分(キツネの白い目など)を維持するためのアプローチには対応していません。このためには、A)最後の例でマスクを変更するか、B)上から2番目の例のようなものが必要な場合は、たとえばを使用します。

    convert fox.jpg -bordercolor white -border 1x1 -fuzz 11% -fill none -floodfill +0+0 white -shave 1x1 fox_flood_2_minimal.png
    
  • 上記のコマンドは、すでに提供されている マスキング リンクからコピーされたものであることに注意してください。

5
Anaksunaman