⚠️ これは 非公式の翻訳サイトです。ImageMagick Studio LLC とは無関係です。正確な情報は 原文(https://usage.imagemagick.org/antialiasing/index.html) を参照してください。

ImageMagick 使用例 -- アンチエイリアス

ImageMagick 使用例 前書きと索引
アンチエイリアス入門
特定の色だけで描画する
細いビットマップ円を描く
アンチエイリアスとフラッドフィルの問題

アンチエイリアスは ImageMagick における全ての描画操作の主要な部分です。残念ながらこれは多くの問題を引き起こすこともあります。このページではそれらの問題を取り上げ、解決策を示そうとしています。


アンチエイリアス入門 ImageMagick は画像を描画するとき、非常に特殊なやり方で行います。「アンチエイリアス」と呼ばれる操作とともに描画するのです。これを示すために、透明な背景に画像を描き、その画像の小さな部分を拡大して何が起きているのかを見られるようにします。

   magick -size 80x80 xc:none \
            -fill white  -draw "circle 40,40 15,20" \
            -fill black  -draw "line 5,30 78,2"    drawn.png
    magick drawn.png -crop 10x10+50+5 +repage -scale 80x80  drawn_mag.png

[IM Output] [IM Output]

上の画像は、IM に使うよう指示したのがそれだけなので、'white'、'black'、'transparent' の3色しか持たないと思うかもしれません。しかし画像を拡大して見ると、まるごと一連の色を持っていることが分かります。こうすることで ImageMagick は、'アンチエイリアス' と呼ばれる技法を使って、画像をより滑らかで見栄えよく見せます。これは仰々しい用語ですが、要するにオブジェクトのエッジのピクセルを、複数の色や透明度を混ぜたもので埋め、オブジェクトを滑らかに見せるという意味です。もしアンチエイリアスが行われなければ、描画された全オブジェクトのエッジには 'エイリアシング' と呼ばれる階段状の効果が現れます。これはより一般的には 'ジャギー' と呼ばれます。ここでは再び画像を描きますが、今回は "[+antialias](https://imagemagick.org/command-line-options/#antialias)" を使って IM の自動アンチエイリアス操作をオフにするよう指示しています。

   magick -size 80x80 xc:none +antialias \
            -fill white  -draw "circle 40,40 15,20" \
            -fill black  -draw "line 5,30 78,2"    drawn_jaggies.png
    magick drawn_jaggies.png -crop 10x10+50+5 +repage -scale 80x80 \
            drawn_jaggies_mag.png

[IM Output] [IM Output]

今回は画像が本当に3色しか持っていません。しかし結果はまったくきれいではありません。最新の IM では1ピクセル分の線が階段状に描かれます。古い IM では線がかなり太く見え、さらに見栄えが悪くなったでしょう。基本的にこれは通常やりたいことではありません。'エイリアシング' の階段効果、一般に 'ジャギー' とも呼ばれるものこそ、IM が避けようとしていたものです。しかし特定の色が欲しいのであれば、これを受け入れるか、あるいは特定の色だけを使うことを保証する別の技法(色の量子化など)を使う必要があります。実際には2種類のアンチエイリアスが起きていることに注意してください。1つ目は画像内の白と黒の色の混合で、さまざまな色合い、この場合はグレーを生み出します。もう1つは色と透明度の混合で、画像内に半透明のピクセルを生成します。後者は心に留めておく必要があるもので、多くの画像フォーマット(GIF など)は半透明ピクセルを扱えず、そのようなピクセルを完全不透明か完全透明のどちらかにしてしまいます。GIF のブール透明度の例では、そのようなフォーマットへ保存する際に半透明ピクセルの扱いを制御する方法を示しています。

まとめ

アンチエイリアスはあらゆる種類の画像描画において非常に重要であり、心に留めておくべきものです。IM のアンチエイリアスが生成する混合色や半透明ピクセルを考慮しなければ、あなた自身が作った画像が一部のフォーマットで非常に見栄え悪く仕上がることがあります。これは、広く普及した "GIF" フォーマットのように、半透明ピクセルを許さない画像フォーマットで画像を作っているときには、さらに重要になります。この問題への対処法については GIF のブール透明度を参照してください。IM は色と透明度のアンチエイリアスは非常に得意ですが、(例えば特定のカラーマップに合わせるために)純粋に 'エイリアス' されたピクセルだけを描くのは実際にはとても苦手です。これは IM の後のリリースで重点的に扱われると聞いています。


特定の色だけを使って描画する

作成中

正確な色を持つ画像を生成するための、アンチエイリアスなしで描画するより良い方法。すなわち 'インデックス画像' のためのもの。具体的には、透明なキャンバスに描画し、アルファチャンネルをしきい値処理してから重ね合わせ、完全不透明なピクセルだけが描画されるようにします。


細いビットマップ円を描く

ここでは IM を使ってビットマップの '細い線' の円を描こうとする方法を見ていきます。通常これは、一般にブレゼンハムの円アルゴリズムとして知られる、より正確には 中点円アルゴリズム として知られるビットマップ円描画アルゴリズムを使って行われます。残念ながらこれは ImageMagick では利用できず、完全にアンチエイリアスされた描画環境では不要なので、今後も利用できないかもしれません。円を描くもう1つの代替手段は、これからすぐに見ますが、モルフォロジーを使って1つのピクセルを特別な リングカーネル で '膨張' させることです。
例えば、IM の通常の円の描き方では、円を滑らかに見せるために多くのグレーのアンチエイリアス色が生成されます。 |

  magick -size 15x15 xc: -fill none -stroke black \
          -draw 'translate 7,7 circle 0,0 5,0' \
          -scale 500%  circle_antialiased.gif

[IM Output]
しかし単にアンチエイリアスをオフにすると、きれいな細い 'ビットマップ' 線にはならない円や線が生成されます。 |

  magick -size 15x15 xc: -fill none -stroke black +antialias \
          -draw 'translate 7,7 circle 0,0 5,0' \
          -scale 500%  circle_aliased.gif

[IM Output]
必要なのは、デフォルトでは1ピクセル幅である "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" を、0.5ピクセル幅のようにもっと小さい値に調整することです。 |

  magick -size 15x15 xc: -fill none -stroke black +antialias \
          -strokewidth 0.5   -draw 'translate 7,7 circle 0,0 5,0' \
          -scale 500%  circle_thin_stroke.gif

[IM Output]
だいぶ良くなりましたが、まだ完璧ではありません。しかしストローク幅を小さくしすぎることもでき、特に半端な半径ではそうなります。 |

  magick -size 15x15 xc: -fill none -stroke black +antialias \
          -strokewidth 0  -draw 'translate 7,7 circle 0,0 5,0' \
          -scale 500%  circle_zero_stroke.gif

[IM Output]
そしてこちらが、実際のピクセル位置(整数)を中心とする半径5ピクセルの円に対する良い解決策です。 |

  magick -size 15x15 xc: -fill none -stroke black +antialias \
          -strokewidth 0.4  -draw 'translate 7,7 circle 0,0 5,0' \
          -scale 500%  circle_perfect.gif

[IM Output]
しかし多くの実験を行った結果、すべての半径と中心に対して機能する "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" は見つけられませんでした。特に少し中心からずれた円では。

すべての状況に対する理想的な解決策はない

例えば、ピクセルの上にもピクセル境界の上にも中心がないこの円は、上部に隙間があるだけでなく、下部では太くなりすぎています! ひどい! |

  magick -size 15x15 xc: -fill none -stroke black +antialias \
          -strokewidth 0.47  -draw 'translate 7,7.3 circle 0,0 5,0' \
          -scale 500%  circle_bad_stroke.gif

[IM Output]
特定の半径の細い1ピクセル幅の円を生成するための、良い "[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)" の表を以下に示します。使うのに最適な値は、円が 実際の ピクセル(' 5 , 5 ' など)の上に中心があるか、 ピクセル境界(' 5.5 , 5.5 ' など)の上に中心があるかによって変わることに注意してください。 円の半径 | SW 実ピクセル | SW 半ピクセル
---|---|---
1 | 0.3 | 0.3 ¶
1.5 | 0.5 ¶ | 0.3
2 | 0.3 | 0.3 §
2.5 | 0.5 ¶ | 0.3 ¤
3 | 0.3 ¤ | 0.3
3.5 | 0.5 | 0.3 ¤
4 | 0.5 § | 0.3
4.5 | 0.5 | 0.3
5 | 0.4 | 0.3
5.5 | 0.5 ¶ | 0.3
6 | 0.3 | 0.5 §
6.5 | 0.5 | 0.43
7 | 0.5 | 0.434
7.5 | 0.5 § | 0.5 §
8 | 0.4 | 0.5
¤ 非常に良い小さな円
§ 理想的な幅は見つからなかった
¶ 円が非常に悪い
余談: 画像上で円を中心に置くには、描画座標(ピクセル座標)で (size-1)/2 です


アンチエイリアスとフラッドフィルの問題 IM のアンチエイリアス機能のため、フラッドフィル("[-draw](https://imagemagick.org/command-line-options/#threshold) color floodfill")はアンチエイリアス効果のある画像で使うと問題が生じます。"JPG" 画像フォーマットから読み込んだ画像でも同様の問題があります。基本的に、IM のほとんどのオブジェクトはアンチエイリアスされている(または "JPG" フォーマット画像ファイルから読み込まれた)ため、描画されたオブジェクトのエッジ付近の色は、フラッドフィルで置き換えようとしている特定の色であることはまれです。これは、アンチエイリアスを完全に避けていない限り、フラッドフィルが塗りつぶそうとしている領域のまさにエッジを塗りつぶさないことを意味します。本質的にフラッドフィル、あるいは色の置換でさえも、アンチエイリアスを理解しておらず、それ自体もアンチエイリアス技法を使いません。結果として、フラッドフィルは一般に塗りつぶそうとしている領域のまさにエッジのピクセルを取りこぼします。例えば、ここでは典型的なフラッドフィル操作を行います。円を描き、それをパターンで塗りつぶそうとします... |

    magick -size 60x60 xc:lightblue -strokewidth 2 \
            -fill none -stroke red -draw "circle 30,30 5,30" \
            -tile tile_weave.gif  -draw "color 30,30 floodfill" \
            tile_fill_1.gif
    magick tile_fill_1.gif -crop 10x10+35+4 +repage -scale 80x80 \
            tile_fill_1_mag.gif

[IM Output] [IM Output]
画像の拡大部分で分かるように、これらのピクセルの色が塗りつぶしていた領域とまったく同じではなかったため、'色違い' のピクセルの線がフラッドフィル操作で完全に取りこぼされました。これを改善する1つの方法は、塗りつぶす予定の領域を、使うパターンに合う色であらかじめ塗りつぶしておくことです。パターンは依然として領域を完全には塗りつぶしませんが、少なくともそれほどひどくは見えなくなります。 |

    magick -size 60x60 xc:lightblue -strokewidth 2 \
            -fill black -stroke red  -draw "circle 30,30 5,30" \
            -tile tile_weave.gif  -draw "color 30,30 floodfill" \
            tile_fill_2.gif
    magick tile_fill_2.gif -crop 10x10+35+4 +repage -scale 60x60 \
            tile_fill_2_mag.gif

[IM Output] [IM Output]
これを行うもう1つの方法は、高い ファズ係数 でパターンによる塗りつぶしを行い、エッジのピクセルを取りこぼさずにまさにエッジまで領域を完全に塗りつぶすよう強制することです。 |

    magick -size 60x60 xc:lightblue -strokewidth 2 \
            -fill none -stroke red  -draw "circle 30,30 5,30" \
            -fuzz 35% -tile tile_weave.gif -draw "color 30,30 floodfill" \
            tile_fill_3.gif
    magick tile_fill_3.gif -crop 10x10+35+4 +repage -scale 60x60 \
            tile_fill_3_mag.gif

[IM Output] [IM Output]
| このような高い 'ファズ係数'、あるいは細すぎる境界線は、塗りつぶしパターンが定義された領域から '漏れ出す' 結果になりうることに注意してください。フラッドフィル操作を使うときは常にいくらかの注意が必要です。このため、私はこれを一般的な解決策として実際には推奨しません。
---|---
これの問題は、フラッドフィルがその性質上それ自体ではアンチエイリアスを使わないため、塗りつぶした領域のエッジが 'ジャギー' すなわちエイリアス効果に悩まされることです。画像の描画を別々のステップに分けることで、その状況を改善できます。色付きの円を作り、それを塗りつぶし、それから境界線を描きます。 |

    magick -size 60x60 xc:lightblue -fill black -draw "circle 30,30 5,30" \
            -tile tile_weave.gif -draw "color 30,30 floodfill" +tile \
            -fill none -stroke red  -strokewidth 2 -draw "circle 30,30 5,30" \
            tile_fill_4.gif
    magick tile_fill_4.gif -crop 10x10+35+4 +repage -scale 60x60 \
            tile_fill_4_mag.gif

[IM Output] [IM Output]
これはフラッドフィルを改善する1つの簡単な方法です。他には形状オーバーレイを使う方法がありますが、それは考え出すのが厄介な方法になりえます。後で既存画像に対する同様の変更を見ていきます。もちろん、フラッドフィルする領域を自分で描いていて既存画像を使っていないのであれば、理想的な解決策は、元の描画操作で塗りつぶしパターンを指定することでフラッドフィルを避けることです。 |

    magick -size 60x60 xc:lightblue -strokewidth 2 \
            -tile tile_weave.gif -stroke red -draw "circle 30,30 5,30" \
            tile_fill_5.gif
    magick tile_fill_5.gif -crop 10x10+35+4 +repage -scale 60x60 \
            tile_fill_5_mag.gif

[IM Output] [IM Output]


将来: 既存画像(特に JPG フォーマット)におけるアンチエイリアスの問題。

例えば、テキストや図の画像を色や背景の上へ再着色して重ね合わせること。

また、GIF ファイルへの透明度の再付与、アイコン用に再スケールした JPEG への再付与。

**限られた色セットを持つ画像の平滑化またはアンチエイリアス**
具体的にはビットマップ(純粋な白黒)画像。

まず、アンチエイリアスはビットマップ画像では機能しません。

アンチエイリアスは、斜めの線や色の境界の '階段状' または 'ジャギー' 効果を平滑化
しようとするために、色と透明度の混合を使うことを伴います。利用できる色が2色しか
なければ、アンチエイリアスは起き得ません!

アンチエイリアスを使えるようにするには、最低でも画像を白黒またはグレースケールから
変換しておく必要があります。

エッジを平滑化する簡単な方法は、B&W 画像やごく小さなパレットサイズの画像を読み込んだ
後に、少量のぼかしを使うことです。

例:   magick image.xbm  -blur 0x.3  smoothed_image.png