ImageMagick の例 --
画像のぼかしとシャープ化

目次
ImageMagick の例 序文と目次
画像のぼかし
画像のシャープ化 (開発中)
影の生成
特殊なぼかし
ぼかしを使用した形状のフェザリング (開発中)
関連する演算子 (開発中)
画像のぼかしとその反対のシャープ化は、画像処理において非常に重要な側面です。このセクションでは、両方を見ていきます。

画像のぼかし

画像をぼかして曖昧にすることは、あまり役に立つ操作のように思えないかもしれませんが、実際には背景効果や影の生成に非常に役立ちます。「ジャギー」の影響を滑らかにし、画像の端をアンチエイリアス処理したり、特徴を丸めてハイライト効果を生み出すのにも非常に役立ちます。ぼかしは非常に重要であるため、画像のサイズ変更の不可欠な部分ですが、異なるぼかし方法であり、元の画像の単一ピクセルの境界内に制限されています。ImageMagickには、2つの一般的な画像ぼかし演算子があります。「-gaussian-blur」と「-blur」です。2つの結果は非常に近いですが、「-blur」の方がアルゴリズムが高速であるため、前者の方が数学的に正確であるにもかかわらず、一般的には前者の方が好まれます。(ぼかしとガウスぼかし演算子の比較を参照)。

ぼかし/ガウスぼかしの引数

-blur」と「-gaussian-blur」の引数は同じですが、画像処理に慣れていない人にとっては、引数の値が分かりにくい場合があります。
     -blur  {radius}x{sigma} 
上記で重要な設定は2番目のシグマ値です。これは、画像をどれだけ「拡散」またはぼかすか(ピクセル単位)の近似値と考えることができます。画像をぼかすために使用するブラシのサイズと考えてください。数値は浮動小数点値なので、「0.5」のような非常に小さな値を使用できます。最初の値である半径も重要で、演算子がピクセルの拡散時に参照する領域の大きさを制御します。この値は通常「0」にするか、少なくともシグマの2倍にする必要があります。オプションの効果を示すために、周囲に多くのスペースがあるこの単純な画像(ぼかし演算子は動作するために多くのスペースを必要とします)を取り上げ、さまざまな演算子設定の結果の表を作成します。また、太線と細線の両方を含むフォントを意図的に使用して、小さな線の詳細と大きな色の領域のぼかしを確認します。

  magick -font Gecko -pointsize 48  label:A \
          -bordercolor white -border 20x10  blur_source.png
[IM Output]
[IM Output]
小さな半径は、ぼかしの効果を、ぼかされているピクセルからそのピクセル数以内のピクセル(正方形の半径)に制限します。「1」のような非常に小さな半径を使用すると、ぼかしは各ピクセルの直近の隣接ピクセル内に効果的に制限されます。シグマは浮動小数点数ですが、半径は浮動小数点数ではないことに注意してください。浮動小数点値が与えられる(または内部的に計算される)場合、それは最も近い整数に切り上げられ、「近傍」のぼかしが決定されます。各隣接ピクセルが最終結果にどの程度寄与するかは、依然としてシグマによって制御されます。非常に小さなシグマ(「1」未満)は、それらの寄与を少量に制限しますが、より大きなシグマは、すべての隣接ピクセルからより均等な量を寄与します。「65355」という最大のシグマは、正方形の近傍内のすべてのピクセルの単純な平均値を生成します。また、半径が小さめでシグマが大きい場合、ぼかしの結果にアーチファクトが表示されることに注意してください。「-blur 5x8」の出力で特に顕著です。これは、小さな正方形の近傍がぼかしの領域を「切り取る」ことによって、ぼかしの滑らかなガウスカーブに突然の停止が生じ、その結果、シャープなエッジにリンギングアーチファクトが発生することによって引き起こされます。そのため…
ぼかしでは、半径シグマより小さくしないでください。
理想的な解決策は、上記表の最後の行に示されているように、半径を「0x」に設定することです。その場合、演算子は与えられたシグマに対して最適な半径を自動的に決定しようとします。IMが使用する最小半径は3であり、通常はIM Q16バージョンの場合は3 * シグマです(IM Q8の場合は精度が低いため、より小さな半径が使用されます)。私がゼロ以外の半径を使用するのは、非常に小さなシグマの場合や特殊なぼかしの場合だけです。そのため…
可能であれば、ぼかし操作には半径をゼロにしてください。
シグマの小さな値は、通常、アンチエイリアシングが使用されていない画像の線をぼかしたり、エッジを滑らかにするのにのみ使用されます(詳細についてはアンチエイリアシングを参照)。その状況では、「1x0.3」のぼかしが、画像のほとんどの「ジャギー」を除去するのに役立つ値であることがわかりました。しかし、大きな値は、背景や影の効果(複合フォントを参照)、または画像のハイライト効果(高度な例ページで示されているように)を作成するのに役立ちます。IMが「x」スタイルの引数を処理する方法により、上記ではシグマはオプションです。しかし、それはより重要な値であるため、半径がオプションであるべきです。なぜなら、半径は自動的に決定できるからです。そのため、このタイプの畳み込み演算子への単一値の引数は役に立ちません。これは、非常に長い間このようになっているため、多くのものを壊してしまうため、変更される可能性は低いです。

ぼかしはチャンネル設定を使用します

ぼかしを示すために、明るい青色の背景にぼやけた黒い円を生成することから始めましょう…

  magick -size 70x70 xc:lightblue \
          -fill black -draw 'circle 35,35 20,25'  circle_on_blue.png
  magick circle_on_blue.png    -blur 0x8         circle_on_blue_blur.png
[IM Output] [IM Output]
ご覧のとおり、このような単純な画像のぼかしには問題ありません。期待どおりに動作します。しかし、透明な背景を含む画像でこれをもう一度試してみると…

  magick -size 70x70 xc:none \
          -fill black -draw 'circle 35,35 20,25'  black_circle.png
  magick black_circle.png       -blur 0x8        black_blurred.png
[IM Output] [IM Output]
ちょっと待って、何が起こったんだ!画像は変わりませんでした!実際には、演算子は動作しました。「-blur」はグレースケールチャンネル演算子であるため、「-channel」設定によって、3つのカラーチャンネルのみに制限されます。つまり、画像の3つのカラーチャンネルのみがぼかされ、画像の透明度またはアルファチャンネルはそのまま残されます。ただし、上記では、画像は「none」の色(IMは完全に透明な黒として定義しています)の背景キャンバスに完全に不透明な円です!つまり、一部が不透明で、一部が透明な、すべての色が黒の画像があります。その結果、画像をぼかしたときに、黒を黒でぼかしただけになり、予想どおり黒になりました!したがって、結果は色の変化がありませんでした。また、画像のアルファまたは透明度チャンネルには触れていなかったので、画像の透明度は変化しませんでした。つまり、黒い円です!実際にやりたかったことは、4つの画像チャンネルすべて、特にアルファチャンネルをぼかすことです。これを行うには、「-channel」設定を画像の4つのチャンネルすべてに設定します(例:値「RGBA」を使用)。

  magick black_circle.png  -channel RGBA  -blur 0x8  black_blurred_RGBA.png
[IM Output]
要約すると…
透明な画像をぼかす場合は、常に「-channel RGBA」設定を使用してください。
IMバージョン5.5.7では、4つのカラーチャンネルすべてが自動的にぼかされましたが、演算子には透明な画像に対して他のバグのある効果があります。詳細については透明度バグのあるぼかしを参照してください。
GIFやJPEGなどの一部の画像形式は、半透明のピクセルを処理しません。したがって、可能であれば、半透明の色のある画像にはPNG形式を使用することをお勧めします。
上記からわかるように、「-channel」設定は、「-blur」などのグレースケール演算子にとって非常に重要です。しかし、そのような演算子を使用する際に重要になる可能性のある唯一のものではありません。たとえば、最後の「「-channel」設定を忘れた」例をもう一度試してみましょう。今回は黄色の円を使用します。

  magick -size 70x70 xc:none \
          -fill yellow   -draw 'circle 35,35 20,25'   yellow_circle.png
  magick yellow_circle.png       -blur 0x8           yellow_blurred.png
[IM Output] [IM Output]
黒い円の場合のように変化しない画像が得られるのではなく、エッジの周りに黒が入り込んでいる、ひどい黄色の円が生成されました。これは嫌ですね!この問題は、新しいIMユーザーのほとんどが気づいていない事実によって引き起こされています。
透明なピクセルには色があります。たとえそれが見えないとしても。
上記の場合、その透明な色は黒であり、黄色の円に漏れていました。もちろん、「-channel」設定を透明な画像に対して正しく設定することで、問題は期待どおりに動作します。

  magick yellow_circle.png  -channel RGBA  -blur 0x8  yellow_blurred_RGBA.png
[IM Output]

ぼかしの内部処理

さらに複雑な例を使用して、このステップを進めてみましょう。これにより、「-blur」が内部的に正確に何をしているのかを調べることができます。ここでは、完全に透明な赤い背景に描かれた黄色の円の非常に特別な画像を作成します。これにより、透明な色が画像のぼかしにどのように影響するかを確認できます。

  magick -size 70x70 xc:'#F000' \
          -fill yellow   -draw 'circle 35,35 20,25'   yellow_on_red.png
[IM Output]
色「#F000」は完全に透明な赤です。つまり、画像の背景領域は、より一般的な完全に透明な黒ではなく、実際には目に見えない赤です。これは後のテストのために重要です。「-alpha off」演算子を使用して、画像のアルファチャンネルを効果的に削除することで、画像の透明な部分の色を確認できます。

  magick yellow_on_red.png   -alpha off  yellow_on_red_matte.png
[IM Output]
それでは、デフォルトの「RGB」、「-channel」設定を使用して、画像の色だけをもう一度ぼかしてみましょう。

  magick yellow_on_red.png   -blur 0x8   yellow_on_red_RGB.png
[IM Output]
ご覧のとおり、画像の完全に透明な赤い背景が、目に見える黄色の円に侵入し、以前のようにオレンジ色のエッジを与えています。この効果を気に入るかもしれませんが、目に見えない完全に透明な色に依存するよりも、それを生成するより良い方法があります。この画像を正しくぼかすことができることを証明するために、正しく行いましょう…

  magick yellow_on_red.png  -channel RGBA  -blur 0x8  yellow_on_red_RGBA.png
[IM Output]
アルファチャンネルを使用してぼかしたときに、以前のようにオレンジ色の色が生成されない理由は、「-blur」演算子がアルファチャンネルが関与していること(現在の「-channel」設定による)を検出すると、そのアルファチャンネルに従って見えるピクセルのみを使用してぼかすためです。アルファチャンネルが関与していない場合、完全に無視され、完全に透明な赤は黄色とぼかされてさまざまな色のオレンジが生成されます。基本的に、ぼかしアルゴリズムは、画像内の完全に透明なピクセルをすべて無視するように変更されており、どのような色であっても関係ありません。半透明のピクセルはまだ関与していますが、結果への影響も、その視認性によって調整されます。その結果、円はぼやけた半透明の黄色のスポットになります。おそらくユーザーが達成しようとしていたものです。本当に必要な場合は、色とアルファチャンネルの両方を個別にぼかすことができ、それによってアルゴリズムの「視認性調整」をカラーチャンネルから効果的に切り離すことができます。その結果は、汚れた茶色の霞を通して太陽が輝いているようなものです。

  magick yellow_on_red.png  -channel  A  -blur 0x8 \
                             -channel RGB -blur 0x8  yellow_on_red_GS.png
[IM Output]
最後の例では、アルファチャンネルと画像内の色(透明かどうかに関わらず)の間に全く相互作用がない場合、純粋なグレースケール演算子が生成したものと同じ結果が得られました。つまり、赤、緑、青、アルファの各チャンネルは、それぞれが独立したグレースケール画像であるかのように、完全に個別にぼかし処理されます。デフォルトの "-channel" 設定は 'RGB' であるため、デフォルトではアルファチャンネルはぼかし処理されず、さらに、画像内の不可視の色は可視の色と共にぼかし処理されることに注意してください。"-blur" がもはや常に純粋なグレースケール演算子ではないことを嬉しく思っていただけるのではないでしょうか。もちろん、どうしてもそのように使用することもできます。しかし、常にこの選択肢があったわけではありません...
IM バージョン 6.2.4-4 より前では、"-blur" と "-gaussian-blur" 演算子は純粋なグレースケール演算として適用され、アルファチャンネルの「可視性」に従って色の重みを調整しませんでした。その結果、透明度を伴うぼかし処理は、ほとんどの場合、前の例で意図的に生成されたようなひどい「黒いハロー」効果を生み出しました。

これは、IM ディストリビューションにおける長期間にわたる重大なバグと分類され、回避策を見つけるのが非常に困難でした。この問題の詳細については、透明度を伴うぼかしのバグ ページを参照してください。
FUTURE: Blur and Trimming Images. 

ぼかしとガウスぼかし演算子の比較

"-blur" と "-gaussian-blur" のどちらの演算子が画像のぼかしに適しているかについて、混乱がありました。まず、"-blur" は高速ですが、これは2段階の手法を使用しています。最初に1つの軸で、次に別の軸で行われます。"-gaussian-blur" 演算子は、一方では、すべての向きに同時にぼかすため、数学的により正確です。2つの間の速度差は、ぼかしの量に応じて、10倍以上にもなる可能性があります。より技術的な文脈では、"-blur" は2パス、1次元直交畳み込みフィルタであるのに対し、"-gaussian-blur" は2次元円筒畳み込みフィルタです。畳み込みの詳細については、を参照してください。他の「フィルタリングされた」畳み込み演算の使用とは異なり、2つの方法の結果は同じであるはずです。しかし、2パスシステムは、丸めまたは量子効果が発生する中間段階があることを意味します。Cristy もこのことを報告した際に裏付けています…速度が速いため、"-blur" を "-gaussian-blur" の代わりに常に使用する必要があります。丸めにより内部のピクセルが異なり、中間段階での仮想ピクセルのエッジ効果の損失により、エッジピクセルが異なる場合があります。要約すると、2つの演算子はわずかに異なりますが、最小限です。"-blur" ははるかに高速であるため、使用してください。ぼかしを含むほとんどすべての例で使用しています。

リサイズを使用した大きなぼかし

画像のぼかしに大きなシグマ値を使用すると非常に遅くなります。しかし、このプロセスを高速化するために1つの手法を使用できます。ただし、これは粗い方法であり、結果を改善するために数学的な厳密さが必要です。本質的に、大きなぼかしが遅い理由は、画像内のすべてのピクセルに対して、多数のピクセルをマージするための大きなウィンドウまたは「カーネル」が必要になるためです。しかし、リサイズ(画像の縮小)は同じことを行いますが、その過程で生成されるピクセル数は少なくなります。この手法は基本的に、画像を縮小してから拡大して、大きくぼかした結果を生成することです。ガウスフィルタは、ガウスシグマを直接指定できるため、特に役立ちます。たとえば、ここでは、2つの方法を使用して、小さなバラの画像をシグマ値5でぼかします。

  magick rose: -blur 0x5   rose_blur_5.png
  magick rose: -filter Gaussian -resize 50% \
          -define filter:sigma=2.5 -resize 200%  rose_resize_5.png
[IM Output] ==> [IM Output] [IM Output]
シグマ設定(拡大ステップでのみ使用)は、画像サイズも2倍になっているため、実際には必要な値の半分だけです。ダウンサイズ比率と指定されたシグマ値の両方調整することで、全体的なぼかし結果を大きくすることができます。ダウンサイジングステップは速度向上をもたらすステップですが、品質管理としてアップサイズステップにも多少のぼかし処理を行う必要があります。これは単なる手法の例です。これは、非常に大きな画像で非常に大きなシグマ値を使用する場合にのみ使用することを意図しています。たとえば、現代のデジタル写真でシグマ10以上のぼかしを使用する場合などです。この手法は、スパースカラーシェパード、代替案で単一の画像の複数レベルのぼかしを生成するためにも使用されます。

画像のシャープ化

建設中
シャープ化とは、テレビ番組や映画で最も頻繁に見られるコンピュータグラフィックスアルゴリズムです。警察が銀行強盗の車のナンバープレートの「ズームイン」された写真、またはぼやけた防犯カメラビデオの人物の顔を「きれいにする」様子を想像してみてください。基本的に、彼らがやっていることは、カメラレンズによる画像の自然なぼやけや低解像度の画像によって失われた画像の細かいディテールを回復しようとしていることです。シャープ化の引数?(展開)
The most important factor is the sigma. As it is the real control of the
sharpening operation.  It is only due to historical accident it is the second
term in the above.
It can be any floating point value from  .1  for practically no sharpening to
3 or more for sever sharpening.   0.5 to 1.0 is rather good. 

Radius is just a limit of the effect as is the threshold.

Radius is only in integer units as that is the way the algorithm works, the
larger it is the slower it is.  But it should be at a minimum 1 or better
still 2 times the sigma.
最初の数字は無視して、0を使用してください。そうすると、指定した「シグマ」係数に最適な数値が使用されます。シグマが大きいほど、シャープ化の効果が高まります。
-sharpen 0x.4 非常に小さい
-sharpen 0x1.0 約1ピクセルサイズのシャープ化
-sharpen 0x3.0 おそらく大きすぎる
"-sharpen" 演算子は、ある種の逆ぼかしです。実際、ほぼ同じように機能します。ぼかしとの関連を示す例については、補間と外挿による画像処理を参照してください。たとえば、単純な画像をぼかしてから、ぼかしを削除するために再度シャープ化してみましょう。

  magick -font Gecko -pointsize 72 label:A  A_original.jpg
  magick A_original.jpg     -blur    0x3    A_blur.jpg
  magick A_blur.jpg         -sharpen 0x3    A_blur_sharp.jpg
  magick A_blur_sharp.jpg   -sharpen 0x3    A_blur_sharp_x2.jpg
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]
ご覧のとおり、結果は完璧ではありません。ピクセルを拡散すると、画像の鋭い角が不明瞭になります。特に、画像の一番上の2本の線の角で生じた余分な太さと、細い線のほぼ消失に注目してください。操作を繰り返したり、シャープ化領域のサイズを大きくしたりしても、画像を正確に元に戻すことはできません。基本的には、画像のぼかしによって細かいディテールが失われているためです。ただし、マクロディテールは非常にうまく復元できます。ぼやけた画像や大きくズームされた画像の細かいディテールを復元できるシャープ化アルゴリズムは、警察、天文学者、政府のスパイ機関で使用されるソフトウェアパッケージで高額な値がつけられています。

画像のアンシャープ化

建設中
"-sharpen" と "-unsharp" の両方の演算子は、ぼかしを元の画像から差し引くというまったく同じ手法を使用して機能します。"-sharpen" と "-unsharp" の実際の動作に関する内部の詳細については、アンシャープ畳み込みを参照してください。

  magick A_blur.jpg       -unsharp 0x5        A_blur_unsharp.jpg
[IM Output] ==> [IM Output]
From comments on  Sharpening with ImageMagick from Alex Beels

  Matching GIMP unsharp
    Take gimp radius and add 1 => IM sigma
    Threshold divide by 255    => IM Threshold

  So  GIMP  radius=2  amount=1.5  threshold=5  results in
    -unsharp 0×3+1.5+0.0196

  Another suggested that   im_sigma = sqrt(gimp_radius)

Raw notes from Fred Weinhaus

Blur Image for test.

A_original.jpg

magick A_original.jpg -blur 0x3 A_original_blur3.jpg

sharpen is just a gaussian type blurred image subtracted from the image to
make an edge image (high pass filter), then equally blends that back with the
original, so one has a high pass enhanced image.

magick A_original_blur3.jpg -sharpen 0x3 A_original_blur3_sharp3.jpg

unsharp is more complex. It is similar. It takes the difference (edge result)
as above, i.e. like sharpen BUT only blends some fraction or multiple of that
with the original image, AND only if the difference is above a threshold. Thus
unsharp 0x3+1+0 is basically the same as sharpen 0x3

magick A_original_blur3.jpg -unsharp 0x3+1+0
A_original_blur3_unsharp3_1_0.jpg

compare -metric rmse A_original_blur3_sharp3.jpg
A_original_blur3_unsharp3_1_0.jpg null:
164.661 (0.00251256)

The difference may be due to whether one uses a separable (gaussian) blur
filter or not in one or the other but not both. Or it could be just some
slight differences elsewhere in the IM implementation.

If one blends less with the original, one gets less sharpening.

magick A_original_blur3.jpg -unsharp 0x3+0.5+0
A_original_blur3_unsharp3_0p5_0.jpg

If one blends more with the original, one gets more sharpening.

magick A_original_blur3.jpg -unsharp 0x3+2+0
A_original_blur3_unsharp3_2_0.jpg

If one increases the threshold, then one gets less sharpening again.

magick A_original_blur3.jpg -unsharp 0x3+2+0.2
A_original_blur3_unsharp3_2_0p2.jpg

Several of my (Fred's) scripts, binomialedge, gaussianedge, sharpedge use this
blending concept (between the high pass filtered result and the original
image) and a description is there with the scripts. The thresholding in my
scripts is done differently and for a different purpose.

Sharpen using de-convolution

There is a technique of using de-convolution (division in a Fast-Fourier
generated frequency form of images),  This works best when the exact 'blur'
that was applied to the original image is known, or calculated in some way.

At the moment only raw 'DIY' methods are as yet available in IM
and a number of such methods are demonstrated (trialed) in the sub-section
Fourier Multiply/Divide.


影の生成

"-shadow" 演算子は、IM のサンプルページで開発された高度な演算子です。基本的に、これは、指定された画像の透明形状の非常に複雑なぼかしと色の再設定を表しています。これは IM ユーザーが常に実行していた操作ですが、正しく達成する方法を理解するにはかなりの知識が必要でした。この演算子は、画像(通常はクローンであり、既に透明度がある場合もあります)を取得し、それを影の画像に変換します。この影の画像は、指定されたオフセットで元の画像の下に配置できます(一般的には特別なレイヤーマージ演算子を使用して)。たとえば、このウェブページに合わせてネイビーの影の色を使用して、既存の画像に影を付ける標準的な方法を次に示します。

  magick rose: \( +clone  -background navy  -shadow 80x3+5+5 \) +swap \
          -background none   -layers merge  +repage   shadow.png
[IM Output]
影の画像が画像から正しくオフセットされていることに注意してください。ぼかしの「シグマ」値をゼロにして、ハードシャドウですが半透明のシャドウを作成することもできます。

  magick rose: \( +clone  -background navy  -shadow 60x0+4+4 \) +swap \
          -background none   -layers merge +repage  shadow_hard.png
[IM Output]
"-layers merge" を使用して影の画像と元の画像をレイヤー化すると、左上だけでなく、任意の方向からの光源からの影を簡単に生成できます。

  magick rose: \( +clone -background navy -shadow 80x3-5+5 \) +swap \
          -background none  -layers merge +repage  shadow_other.png
[IM Output]
レイヤーマージを使用するのが最も簡単ですが、結果の画像全体のオフセットがずれる傾向があります。ただし、このずれはレイヤー化方法によってではなく、"+repage" によって結果の「レイヤー」画像に存在する可能性のある負または正のオフセットが削除されるために発生します。代替手法については、影とオフセットの問題を参照してください。
レイヤーマージメソッドは、IM v6.3.6-2に追加されました。それ以前は、同様のレイヤーフラットニング演算子 "-mosaic" を代わりに使用する必要がありました。しかし、この演算子には問題があります(次を参照)。

形状のある影

さて、"-shadow" は、シェイプされた画像を念頭に置いて設計されました(これがその複雑さの理由です)。たとえば、ここに典型的な影付きフォントがあります。

  magick -background none -stroke black -fill white \
          -font Candice -pointsize 48 label:A -trim \
          \( +clone   -background navy   -shadow 80x3+3+3 \) +swap \
          -background none   -layers merge +repage  shadow_a.png
[IM Output]
元の画像にクリッピングすることなく影を含めるのに十分なスペースがある場合は、このコマンドを使用できます。これは特別な「DstOver」合成方法を使用するため、2つの画像の順序を入れ替える必要がありません。

  magick -background none -stroke black -fill white \
          -font Candice -pointsize 48 label:'A ' \
          \( +clone -background navy -shadow 80x3+3+3 \) \
          -background none -compose DstOver -flatten  shadow_a_size.png
[IM Output]
元の画像に要求された影のための十分な余分なスペースがなかったため、ここでわずかなクリッピングが見られる可能性があります。

影とオフセットの問題

影の問題は、ぼやけた影があらゆる方向に広がることです。これを補うために、"-shadow" 演算子は、指定されたぼかしの「シグマ」値の2倍のサイズのボーダーを追加することで、実際の元の画像を拡大します。つまり、「x3」を使用して影をぼかす場合、画像は12ピクセル(各辺に3ピクセルの2倍)拡大されます。この拡大を補うために、影の画像には適切な負の仮想キャンバスオフセットも与えられます。これにより、影を付ける画像に対して正しく配置されます。通常の画像の場合、生成される影の画像は負のオフセットを持つことになります。ただし、IM に "-layers" メソッドの 'merge' がない場合、問題が発生します。たとえば、ここでは、光が右上から照らされているかのように、画像の左側に影を追加しようとします。

  magick rose: \( +clone  -background navy  -shadow 60x3-5+5 \) +swap \
          -background none   -mosaic   shadow_left_clipped.png
[IM Output]
影が「-mosaic」演算子によってクリップされているのが分かると思います。これは負のオフセットが原因です。良くありません!解決策の1つは、元の画像に初期オフセットを追加して、結果として得られる影画像のオフセットが負にならないようにすることです。

  magick rose: -repage +11+0\
          \( +clone   -background navy   -shadow 80x3-5+5 \) +swap \
          -background none   -mosaic   shadow_left.png
[IM Output]
もう1つの方法は、影が生成された後に、適切な量だけ両方の画像をオフセットすることです。これにより、「-mosaic」で合成する前に、負のオフセットがなくなります。「-repage」に'!'フラグを使用して、両方の画像に指定されたオフセットを追加することに注意してください。

  magick rose: \( +clone -background navy -shadow 80x3-5-5 \) +swap \
          -repage +11+11\! -background none  -mosaic  shadow_tl.png
[IM Output]
必要なスペースの量は、少なくとも2×' *シグマ* '-' *オフセット* '、つまりこの場合は2×3-5 ⇒ 11ピクセル必要です。そうでないと、影がクリップされる危険性があります。ただし、' *シグマ* '-' *オフセット* '程度のスペースでも、許容できるレベルのクリップが通常は得られます。別の方法としては、最終的な影のための十分なスペースを作るために、元の画像を拡大することです。これは、仮想キャンバス上の画像の元の位置を維持しながら、影を処理する最良の方法です。例えば、ここでは元の画像に影のための余分なスペースを追加で埋め込み、影の画像を直接下層に配置します。最終的な画像が「埋め込まれた」画像の中心に保たれていることを確認できるように、表示された画像の結果に境界線を含めました。

  magick rose: -bordercolor None -border 11x11 \
          \( +clone -background navy -shadow 80x3+5+5 \) \
          -background none -compose DstOver -flatten \
          -compose Over  shadow_space.png
[IM Output]
必要なパディングの量は、少なくとも' *シグマ* '+abs(' *オフセット* ')、またはさらに良いのは2×' *シグマ* '+abs(' *オフセット* ')にする必要があります。これにより、影がクリップされるのを確実に防ぐことができます。スペースを削減するために非対称のパディングを使用することもできますが、通常は利便性のために対称的なパディング(上記のよう)が使用されます。
上記では「-compose Over」設定は実際には必要ありませんが、推奨されます。そうでないと、後続の処理(他の「magick」コマンド内でも)に影響し、予期しない結果になる可能性があります。つまり、非標準の合成設定は、画像の重ね合わせ、境界線やフレームの追加、または単なる他の合成など、他の処理に影響を与える可能性があります。

影と合成

フォーラムの多くの人が、影の画像を生成し、その後、下位レベルの「-composite」を使用して画像をマージしようとしています。例えば、生成された(より大きい)影の画像に元の画像を直接重ねます。

  magick rose: \( +clone  -background navy  -shadow 60x3 \) \
          +swap -composite  +repage shadow_composite.png
[IM Output]
まず覚えておくべき点は、合成演算子は非常に低レベルであり、元の画像のレイヤーや仮想キャンバスのオフセット、または影演算子が持つオフセットを読み取らないことです。実際、リページ設定を使用して追加された可能性のある負の(悪い)オフセット影を削除または調整する必要があります。これは、上記の例で見られるオフセットが、影が影にスペースを与えるために入力画像を拡大した方法によって単に生成されていることを意味します。影はその位置にあるのは、影画像がシグマの2倍に拡大されたことによるものです。さらに、「ハードシャドウ」(シグマがゼロ)を使用した場合も、影にオフセットが全くなくなり、したがって、可能性のある暗いハローエッジ効果を除いて、影は元の画像によって隠されます。影演算子が提供する組み込みのオフセット計算を事実上放棄したことになります。もちろん、適切な合成ジオメトリ/重心設定を計算して設定することもできますが、拡大された影画像はすべての方向に均等に拡大されるため、「-gravity Center」設定を使用するのが最も簡単な方法です。

  magick rose: \( +clone  -background navy  -shadow 60x3 \) +repage \
          +swap -gravity center -geometry -3-5 -composite shadow_geometry.png
[IM Output]
画像の順序が入れ替わったため、中心のジオメトリオフセットは負であることに注意してください。

影の輪郭

テキストなど、図形のぼやけた輪郭を生成するために「-shadow」を使用することもできます。レイヤーのマージを使用すると、IMは半透明のぼかしに必要な余分なスペースを自動的に追加します。

  magick -background none -fill white \
              -font Candice -pointsize 48 label:A -trim \
          \( +clone -background black  -shadow 100x3+0+0 \) +swap \
          -background none   -layers merge +repage  shadow_outline.png
[IM Output]
ここでは、ぼかしのある図形を輪郭に使用することの問題点の1つを確認できます。ぼかしの仕組みから、図形の端は常に少なくとも50%透明になります。これを補うには、影を付ける画像の図形を大きくするか(例としてより高密度なソフトアウトラインフォントを参照)、さらに良いのは、レベル調整を使用して影の画像の透明度を調整し、図形の端の50%の透明度を完全に不透明にすることができます。

  magick -background none -fill white \
          -font Candice -pointsize 48  label:A -trim \
          \( +clone -background black  -shadow 100x3+0+0 \
             -channel A -level 0,50% +channel \) +swap \
          +repage -gravity center -composite   shadow_outline_darker.png
[IM Output]
影の位置とオフセットを処理する別の方法は、基本的にすべての「-shadow」で生成されたオフセット(「+repage」を使用)を破棄し、より大きな影の画像に元の画像を中心揃えで重ね合わせることです。「-geometry」合成オフセットを追加することで、影を個別の処理としてオフセットできます。

  magick -background none -fill white -stroke black \
          -font Candice -pointsize 48  label:A -trim \
          \( +clone -background navy  -shadow 80x3 \) +swap \
          +repage -gravity center -geometry -3-3 -composite \
          shadow_geometry_offset.png
[IM Output]
ただし、オフセットが影の位置付けに通常使用するオフセットとは逆になっていることに注意してください。これは、影ではなくテキストの図形をオフセットしているため、逆方向になります。ただし、この方法では、オフセットがぼかしの'シグマ'の2倍を超えると、影の画像ではなく元のソース画像がクリップされます。そのため、「ハードシャドウ」(ぼかしの'シグマ'に'x0'を使用)には使用できません。ただし、元の画像を重ね合わせるためのスペースを影の画像に追加しない限り。ただし、ソフトなぼやけた影では、めったに問題にはなりません。影付けの実用的な例については、サムネイルの影付けより良い3Dロゴの生成を参照してください。

モンタージュコマンドにおける影

IM v6.3.1以降、「magick montage」の「-shadow」設定は、この演算子が提供するソフトな「シェイプ」の影を使用し始めました。

  montage -label Rose  rose: \
          -background none -geometry +5+5 -shadow  shadow_montage.png
[IM Output]
ただし、「magick montage」は単純なオン/オフオプションを超えたそのような制御を提供したことがないため、その影の色、ぼかし、オフセットを設定するための制御は提供されていません。

影の内部処理

内部的には、「-shadow」は非常に複雑です。基本的に、「ソフトなぼやけた影」に対応するために画像を拡大する必要があるだけでなく、画像の既存の形状をぼかしたり、色を適切に設定したり、最後に仮想ページ/キャンバスのオフセットを調整したりする必要もあります。すべてユーザーの仕様に従ってです。例えば、次の「-shadow」コマンドの場合...

    magick image_clone.png -shadow 60x4+5+5   image_shadow.png
同等のIM操作は次のようになります。

  magick image_clone.png -alpha set \
          -bordercolor none  -border 8  -repage -8-8\!  \
          -channel A -virtual-pixel transparent \
               -blur 8x4 -evaluate multiply .60 +channel
          -fill {background_color} -colorize 100% \
          -repage +5+5\!     image_shadow.png
上記の値8はぼかしシグマの2倍であるため、ぼやけた影のための十分なスペースが提供されます。ただし、これは最終的な画像がシグマの4倍のピクセル大きくなることを意味します。これを補うために、同量の負のオフセットも追加されます。シグマの2倍の負のオフセットが生成された画像に追加されるため、影がクリップされたり、元の画像に対して正しく配置されなかったりするのを避けるように注意する必要があります。これは、元の画像に初期の正のオフセット(8-5または+3+3ピクセルなど)を与えるか、負のオフセットをクリップせずに最終的な画像を理解するレイヤーのマージを使用することで実行できます。基本的に、以前の手法を使用して、影の画像に関連する可能性のある負のオフセットを正しく処理します。
PNG形式とMIFF形式は、負のオフセットと半透明のピクセルを処理できることが分かっている唯一の画像形式です。将来の使用のために、影の画像を保存する場合はPNGを使用することをお勧めします。
前述のように、「-shadow」は非常に複雑な操作です。もちろん、上記の例は「-shadow」が内部的に行うことに近いものの、全く同じではありません。「-shadow」演算子は、境界線/背景/塗りつぶしの色、現在の仮想ピクセル設定など、グローバル設定を変更しません。また、ぼかしシグマが0に設定されている場合、「-blur」演算子の使用を短絡して、ぼかし関数がゼロのシグマまたは半径に対して警告を出さないようにします。
FUTURE: overlaying multiple shadows

Overlaying two images with shadows, produces an unrealistic darkening of the
shadow where the shadow overlaps.  This darkening would be correct if each
object was lit by separate light sources, but more commonly the objects are
lit by the same light source.

The solution is to overlay the one image over the other, applying the shadow
effects to the opaque parts of each layer image in turn. That is, the
background shadow should be generated separately into each layer.  Remember
the shadow cast by the top most layer should become fuzzier than the shadow
contribution of the bottom most layer.

This complexity gets worse when you have three objects shadowing each other.
Also the offset and blurring from the shadow of each object should technically
be separate.  To generate that level of complexity, probably a 3-d ray-tracing
program should be used instead (sigh).


特殊なぼかし

IMバージョン6に追加された、非常に特殊な用途を持つ他のぼかしの種類がいくつかあります。これらは特定の方法で動作し、他のほとんどの「畳み込み」スタイルの操作のように、すべての方向で動作するとは限りません。また、より一般的なぼかしの前後に画像を変形させるなど、他の特殊なぼかし生成方法ほど効果的でない場合があります。例えば、極座標サイクルのトリック楕円(マッピング)ぼかしを参照してください。
警告:これらのぼかしはすべて実験的であり、構文が変更される可能性があります!

放射状ぼかし

-radial-blur」を使用して、まるでグルグルと回転しているかのように、円状に画像をぼかすことができます。技術的には、これは放射状のぼかしではなく、回転または角度のぼかしです。**注記:**脱分極-分極-回転ぼかしテクニックを使用すると、はるかに高品質の結果(ただし、はるかに遅い速度で)を得ることができます。ただし、「-blur」演算子と同様に、「-radial-blur」は「-channel」設定の影響を受けます。

  magick -size 70x70 xc:none \
          -stroke red    -strokewidth 15 -draw 'line 35,5 35,65' \
          -stroke yellow -strokewidth  9 -draw 'line 35,5 35,65' \
          -channel RGBA  -radial-blur 30   radial_blur.png
[IM Output]
より興味深い「-radial-blur」効果を得るために、オブジェクトを中央から外れた位置に配置することができます(画像にスペースを追加することで)。

  magick -size 70x70 xc:none \
          -stroke red    -strokewidth 15 -draw 'line 5,50 65,50' \
          -stroke yellow -strokewidth  9 -draw 'line 5,50 65,50' \
          -channel RGBA  -radial-blur 90   radial_blur_90.png
[IM Output]
ぼかし引数は、「radial-blur」がカバーする角度です。つまり、元の画像から各方向にその角度の半分です。したがって、180度の角度は半円にわたるのに対し、360度は画像を完全な円形でぼかします。

  magick -size 70x70 xc:none \
          -stroke red    -strokewidth 15 -draw 'line 5,50 65,50' \
          -stroke yellow -strokewidth  9 -draw 'line 5,50 65,50' \
          -channel RGBA  -radial-blur 180   radial_blur_180.png
[IM Output]

  magick -size 70x70 xc:none \
          -stroke red    -strokewidth 15 -draw 'line 5,50 65,50' \
          -stroke yellow -strokewidth  9 -draw 'line 5,50 65,50' \
          -channel RGBA  -radial-blur 360   radial_blur_360.png
[IM Output]
さらに少し画像のワーピングを追加して、効果をより面白くすることもできます…

  magick -size 70x70 xc:none \
          -stroke red    -strokewidth 15 -draw 'line 5,50 65,50' \
          -stroke yellow -strokewidth  9 -draw 'line 5,50 65,50' \
          -channel RGBA  -radial-blur 180 -swirl 180 radial_swirl.png
[IM Output]
完全な円形の放射状ぼかしを使用して、粗い円形のグラデーションを生成できます。ただし、正しいグラデーションを生成する正しい形状を定式化するのは非常に困難であり、おそらく努力に見合うものではありません。それでも試してみました…

  magick -size 80x80 xc:lightblue -fill red \
          -draw "path 'M 40,40   C 43,43 47,47 50,40 \
                  S 52,23 40,20   S 14,22 10,40   S 15,75 40,79 Z'" \
          radial_gradient_pre.gif
  magick radial_gradient_pre.gif  -radial-blur 360  radial_gradient.gif
[IM Output] [IM Output]

モーションブラー

-motion-blur」を使用して、一方方向に線形にフェードするぼかし(半径とシグマ、およびぼかしが発生する角度)を追加できます。これにより、画像が非常に高速で移動しているかのように見えます。

  magick -size 70x70 xc:none  -channel RGBA \
          -fill yellow  -stroke red  -strokewidth 3 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x12+45  motion_blur.png
[IM Output]
オブジェクトにトレイルが追加されるだけでなく、移動方向の端にも背景がぼかされています。この先端ぼかしは、元の画像を再描画または重ね合わせて、より小さい「-motion-blur」を複数回再適用することで改善できます。

  magick -size 70x70 xc:none -channel RGBA \
          -fill yellow  -stroke red -strokewidth 3 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x8+45 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x6+45 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x2+45 \
          motion_blur_redraw.png
[IM Output]
複数のモーションぼかしを作成して、移動オブジェクトの尾部の一部に広がりを与えることができます。まるで消える煙や炎のようです。

  magick -size 70x70 xc:none -channel RGBA \
          -fill yellow  -stroke red -strokewidth 3 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x12+25 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x12+55 \
          -draw 'circle 45,45 35,35'  -motion-blur 0x12+40 \
          motion_blur_spread.png
[IM Output]
このテクニックを使用して、地面に広がる影を生成できます。あるいは、モーションぼかしを生成し、それを少し放射状にぼかすこともできますが、中心を正しくするには画像のシフトが必要です。さらに画像のワーピングを追加して、さらに面白くすることもできます…

  magick -size 70x100 xc:none -channel RGBA \
          -fill yellow  -stroke red -strokewidth 3 \
          -draw 'circle 35,80 45,70'  -motion-blur 0x20+90 \
          -background none  -rotate 50  -wave 5x25  -rotate -50 \
          -gravity center   -crop 70x100+0+0  +repage \
          -draw 'circle 35,80 45,70'  -blur 0x2 \
          motion_wave.png
[IM Output]

-radial-blur」は両方向にぼかしをかけるのに対し、「-motion-blur」は一方向にのみぼかしをかけることに注意してください。どちらの場合も、これらの特殊なぼかしは強いエッジ効果を持つため、避けるのが最善策です。画像の周囲に余分なスペースを追加で追加することをお勧めします(一般的には「-border」を使用)。より実用的または興味深い例や上記の使用方法を見つけた場合は、コピーをメールでお送りください(ページのフッターにアドレスを記載)。

ぼかしを使ったシェイプのフェザリング

建設中
警告:このセクションは現在古くなっています。画像を正しくフェザリングしたいユーザーは、距離を使ったシェイプのフェザリングを参照してください。ここでは「ぼかしフェザリング」として知られる手法が示されていますが、後述のように「偽フェザリング手法」です。それでも、これは「凸状」の画像シェイプに対しては有用な方法です。画像からシェイプを切り抜く場合、シェイプのエッジを少しフェザリングまたはぼかすことで、より滑らかな外観を与え、誤って含まれたシェイプの外側の部分を強調しないようにしたり、画像が背景に自然に溶け込むようにすることがよくあります。基本的に、シェイプに「硬い」エッジを持たせるのではなく、それを「偽」アンチエイリアシングまたはレンズぼかしで柔らかくして、ペーストをよりシームレスにします。
たとえば、ここに明るい色の背景に重ね合わせたGIF画像があります。

  magick shape.gif -background wheat -flatten  overlaid.png
[IM Output]
しかし、ブール型の透過性を持つGIF画像を重ね合わせているため、高度にエイリアシングされた、または階段状のエッジを持つ結果、画像は背景に非常に不自然に見えます。現実の画像を扱っている場合、上記の画像は非常に人工的に見えます。
しかし、画像の透明度を少しぼかすことで、重ね合わせた画像を背景により滑らかに適合させることができます。

  magick figure.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x0.7  -level 50,100% +channel \
          -background wheat -flatten  edge_blured.png
[IM Output]
ちなみに、これはサムネイルのソフトエッジの生成に使用される手法と同じです。この他の例については、Fred Weinhausの「feather」マスキングスクリプトの結果を参照してください。ご覧のとおり、これは重ね合わせた画像と背景との間に高いコントラストがある単純なケースでは非常にうまく機能します。ただし、はるかに大きなフェザリングぼかし係数を使用する場合、または2つの画像がどちらも非常に明るい色の場合は、深刻な問題があります。
ぼかしはシェイプ領域の内側と外側に広がるため、シェイプのエッジがゼロ(完全に透明)になるようにアルファチャンネルを調整する必要がありますが、エッジから離れるにつれてすぐに完全に不透明になります。透過処理を使用したCLUTは、このようなアルファチャンネル調整の例です。この調整は非常に重要です。そうでなければ、シェイプの外側の領域を強調する代わりに、シェイプの外側の領域の半透明な影またはハローを追加することになります。基本的に、画像の透明性によって以前に隠されていた半透明の「未定義の色」です。しかし、ぼかしはシェイプの輪郭も滑らかにするという特に厄介な問題があります。たとえば…

  magick -size 100x60 xc: -draw 'polygon 5,5 50,30 5,55 95,30' \
          sharp_angles.gif
[IM Output]
この特定のシェイプをぼかすと…

  magick sharp_angles.gif -blur 0x5  feather_blurred.gif
[IM Output]
マスクのポイントはエッジよりも強調されていないこと、内部角度が「塗りつぶされた」ように見えることに注目してください。透過性がある場合、完全に透明なピクセルが半透明になる可能性があります。つまり、未定義の色を持つピクセルが実際に見える可能性があります!画像を閾値処理すれば、より明確に見ることができます。

  magick feather_blurred.gif  -threshold 50%  feather_blur_thres.gif
[IM Output]
これが、画像のフェザリング手法として「ぼかし」を使用することの問題です。指や耳、脚の間の領域などを扱う場合は特に懸念されます。つまり、付属肢自体の形状とそれらの間のスペースへの影響です。画像にカートゥーンのような境界線がある場合、「1ピクセル」のフェザーではそれほど大きな問題ではありません。しかし、現実の画像(明確な境界線がない)では、これは実際の問題です。適切な解決策は、シェイプのエッジからある点がどれだけ離れているかを測定する方法を見つけることですが、2つの近いエッジがそれらの効果を合計しないようにする必要があります。この距離測定操作は、現在IMに追加されており、距離形態学として知られています。フェザリングへの使用方法の詳細については、距離を使ったシェイプのフェザリングを参照してください。

関連オペレーター

Basic image modifications
  -despeckle -enhance
  -noise  -spread -displace

  -median
    Set each channel color of the pixel to the median value of all all pixels
    within a given radius. (median = center most value of all values found,
    half on one side, half on the other).  This is a way of "de-speckling" an
    image  (such a dust in a scan).  But could distort edges, cause some color
    channel aburation, and remove thin lines.

    This filter is the best technique to use for removing Salt & Pepper
    noise, especially on gray scale images.

    It is suggested that a trim for a scan use a median filtered image for
    attempting to find the appropriate bounding box.

  -adaptive-sharpen  radius x sigma
    Adjust sharpening so that it is restricted to close to image edges
    as defined by edge detection.

    See forum discussion
      https://magick.imagemagick.org/viewtopic.php?f=1&t=10266

  -adaptive-blur   radius x sigma
    Blur images, except close to the edges as defined by an edge detection
    on the image.  Eg make the colors smoother, but don't destroy any
    sharp edges the image may have.

  -adaptive-resize
    Resize but attempt not to blur across sharp color changes