ImageMagick の例 --
イメージマッピング効果

索引
ImageMagick の例 序文と索引
イメージマッピング入門
イメージマッピングを使用した画像の歪み
絶対歪みルックアップマップ
相対変位ルックアップマップ
可変ブラーマッピング
何らかの二次的な「マッピング」画像を使用して、画像を歪ませたり変更したりします。これは、色の置換、画像の可変ブラー、またはソース座標を絶対的または相対的に指定することによる画像の歪みのいずれかです。

はじめに

これまでのセクションで見たように、合成単純なワーピング歪みでは、さまざまな方法で画像を変更できます。しかし、それらはすべて、ImageMagickに組み込まれている特定の方法に限定されています。'FX' DIY演算子を使用して独自の画像歪みを「作成」したり、評価関数などの演算子、あるいはさまざまなレベル演算子を使用して画像の値を直接変更することもできます。しかし、歪みはタスクを実行するために多くの計算(と時間)を必要とし、同じタスクを複数の画像に対して行う予定の場合、IMがそれらの計算をすべて繰り返すことは時間の無駄になります。もう一つの側面は、歪みの効果を自由な形で制限することが非常に難しいことです。適用したい歪みを簡単に編集したり変更したりすることはできません。制御が制限されています。イメージマッピングは異なります。余分な「マッピング」画像を使用して、画像のどの部分がどのように変更されるかを制御します。画像全体を変更する必要はなく、事前に定義された方法やプログラムされた方法で画像を変更する必要もありません。制限なく、あらゆる可能な方法で画像を変更できる「マップ」を作成できます。また、マッピングを編集したりさらに変更したりして、その効果を調整したり制限したり、複数のマップをマージしたり、効果をスムーズにしたりぼかしたりすることでより複雑にすることができます。そして最後に、後で再度使用するためにマッピングを保存することもできます。「マップ」画像が結果を制御します。変更は「マップ」によって制御されるため、通常、ImageMagickによって実行する必要がある計算はほとんどなく、「イメージマッピング」は一般的に非常に高速です。また、非常に複雑なマップを任意の数の画像に適用して、まったく同じ変更を得ることができるため、繰り返し可能です。つまり、ディレクトリのすべての画像に非常に迅速に適用できます。本質的に、イメージマッピングは、特定の効果の遅く複雑な数学を特定の画像からより一般的な「マップ」画像に移動します。「マップ」が生成されると、多くの実際の画像に非常に迅速に適用できます。

イメージマップとは何か

マッピング画像は基本的に、「ルックアップテーブル」またはLUTであり、特定の効果を画像に個々のピクセル単位でどのように適用するかを定義します。つまり、効果が適用されるかどうかも、適用される程度も、イメージマップによって完全に制御されます。本質的に、画像は値の配列であり、それらの値の意味は、適用されているマッピングプロセスによって異なります。それらは次のように示すことができます。
  • 直接置換値(カラールックアップ)、
  • 色がどの画像から来るべきか(画像マスク)、
  • ピクセルをどれだけ明るくするか暗くするか(ハイライト)、
  • ソース座標を指定する(歪み)、
  • または現在の位置に対する相対位置(変位)。
  • この位置でピクセルをどれだけぼかすか
これらの多くは、画像合成ですでに見てきたものであり、ある意味では、イメージマッピングは複数の画像をマージするもう一つの方法です。実際、多くのイメージマッピング技術は、特殊化された合成方法として実装されています!真の画像合成は、実際にはさまざまな方法で2つの実際のカラー画像を重ね合わせるだけであることを覚えておいてください(特にDuff-Porter アルファ合成方法)。イメージマッピングは、より一般的に、特別な方法で1つの画像を変更する特殊な画像を使用することを含みます。イメージマッピングで最も難しいのは、特定の効果のための特定の「マップ」を生成することです。そして、このページにある多くの作業、努力、技術が関与しているのはここです。しかし、マップが作成されると、それを何度も何度も、多くの異なる画像で非常に迅速に使用できます。

イメージマッピングを使用した画像の歪み

IM Examplesの前のセクションで説明されているさまざまな歪み演算子(単純な画像ワーピング一般的な画像歪みなど)を使用すると、IMグラフィックスライブラリにプログラムされているさまざまなタイプの歪みに限定されます。一般的には、特定の数学的方程式と式を使用します。ただし、より自由形式で、数学的な方法が少ない独自の歪みを設計したい場合があります。たとえば、画像を特定の形状にマッピングしたり、数学的に定義するよりも描画が容易な特定の複雑なレンズ効果でより複雑な歪みを生成したりする場合です。場合によっては、多くの画像に対して歪みを繰り返し適用し、歪みを何度も再計算するのを避けたい場合もあります。解決策は、歪みを事前に計算し、グレースケール画像の形で特別なルックアップテーブル(LUT)として保存することです。つまり、各出力ピクセルに対して、LUTを調べ、その値を使用してソース画像から色を調べます。つまり、3つの手順が必要です。
  1. LUTで各宛先ピクセルを調べる
  2. LUT値をソース画像の位置にマッピングする(2つの方法)
  3. ソース画像から色を調べる
画像は歪みの「ルックアップテーブル」として使用されるため、'Gimp'や'PhotoShop'などの画像エディターを使用して歪みマップを作成または変更し、本当に高度で複雑な歪みを行うことができます。ただし、これまでに見た他のすべての歪み方法と同様に、ルックアップは逆ピクセルマッピングとして適用されることを覚えておく必要があります。つまり、宛先画像の各ピクセルについて、適用されている歪み方法を使用して、ソース画像からピクセルの色を調べます。この場合、方法は、提供されたルックアップテーブル画像からソース座標を調べることです。
ソース画像のどこで色を調べるかを決定するためにイメージマップを使用するには、2つの方法があります...絶対または相対絶対座標ルックアップでは、歪みマップはLUTの色値を直接ソース画像の座標に変換し、そこから使用する色を調べます。LUTの色がどこにあるかは関係ありません。各色は、使用する正確なルックアップポイントを参照します。歪みLUT画像は色のグラデーションになりますが、そのグラデーションのワーピングや歪みは、マップが適用されるときに同じ効果になります。相対座標ルックアップでは、変位マップは色値を使用して現在の座標をオフセットし、ソース画像の場所を調べて色を調べます。これは、マップの位置に関係なく、明るい領域と暗い領域がマップによってピクセルがどのようにシフトまたは変位されるかを定義する、純粋なグレースケールLUT画像が使用されることを意味します。後ほど説明するように、両方の方法には長所と短所があります。

絶対歪みルックアップマップ

絶対歪みLUTマップを作成することは、理解し、歪みLUTマップを作成し、適用する2つの方法のうち、より簡単な方法です。ただし、後ほど説明するように、相対変位マップよりも実用的ではない、非常に深刻な欠点があります。「歪みマップ」の特定のポイントの色は、ソース画像の場所を直接参照します。つまり、マップ全体のグレースケールグラデーションによって、その場所に配置される「テクスチャ」が定義されます。マップ画像は、複雑な折り目や波紋のあるTシャツなどの複雑なオブジェクトの画像であることを考慮してください。そのシャツにグラデーションがある場合、任意のフラット画像をそのシャツにマッピングできます。つまり、絶対歪みマップの威力です。LUT画像の「黒」ピクセル(色値0)は、ソース画像の左端のピクセルまたは'0' X座標として認識され、「白」のものはLUT(値1)は、右端のピクセル(ソース画像の幅)として認識されます。このLUTは、ソース画像の色をX座標または水平位置のみ調べます。色の高さやY位置は変更されません。では、LUTに単純なプレーングレースケールの水平グラデーションを使用して試してみましょう。

  magick koala.gif \( -size 75x75 gradient: -rotate 90 \) \
          -fx 'p{v*w,j}'      distort_noop.gif
[IM Output]  + [IM Output] ==> [IM Output]
これは、ソース画像を宛先画像にマッピングする際に実際には何も変更しなかったことに注意してください。つまり、歪みマップから調べたX座標は、色を調べていた位置と同じ位置であったためです。グラデーションを反転するだけで、ピクセルのルックアップも反転し、鏡像が作成されます。つまり、白は左に、「黒」は右に、そして画像全体に水平グラデーションが表示されます。

    magick koala.gif \( -size 75x75 gradient: -rotate -90 \) \
          -fx 'p{v*w,j}'      distort_mirror_x.gif
[IM Output]  + [IM Output] ==> [IM Output]
元の勾配をコントラスト強調演算子を使用して圧縮すると、はるかに有用な歪みを得ることができます。

  magick -size 75x75 gradient: -rotate 90 \
          -sigmoidal-contrast 8,50%      map_compress.gif
  magick koala.gif  map_compress.gif -fx 'p{v*w,j}'  distort_compress.gif
[IM Output]  + [IM Output] ==> [IM Output]
歪みの側面は伸び、中心は圧縮されていることに注意してください。X座標を調整する1つの歪みマップとY座標を調整するもう1つの歪みマップを使用することで、これを2次元まで拡張できます。

  magick map_compress.gif -rotate 90 map_compress_y.gif
  magick koala.gif  map_compress.gif map_compress_y.gif \
          -fx 'p{u[1]*w,u[2]*h}'   distort_compress_2D.gif
[IM Output]  + [IM Output] [IM Output] ==> [IM Output]
上記のように、インプロージョン方式のバリエーションが再作成されましたが、インプロード演算子のように放射状ではなく、X軸とY軸に沿って(同時に)画像を圧縮するだけです。重要なのは、絶対歪みマップに対して行った操作は、適用する画像の最終画像にも行われるということです。それが、歪みマップの力です。

合成「歪み」方式

これまで、FX、汎用DIY演算子を使用して絶対歪みマップを適用してきました。これにより、行っている操作を正確に調整できますが、非常に遅くなります。合成演算子Distort」は、上記で使用してきた非常に類似した式をエンコードしています。ただし、これは、「相対変位マップ」で後ほど検討する「Displace」合成演算子とも互換性が高くなるように実装されています。

そこで、最後の「インプロード」の例を「Distort」合成を使用して繰り返してみましょう。


  magick koala.gif  map_compress.gif map_compress_y.gif \
          -compose Distort  -define compose:args=37.5x37.5 -composite \
          distort_compose.gif
[IM Output]  + [IM Output] [IM Output] ==> [IM Output]
上記では、「定義設定」の「compose:args」の使用に注意してください。この値は、使用されるLUT勾配(完全なグレーを中心とした)に対する乗数です。使用されている値「37.5」は、画像の幅と高さの半分(75ピクセル)です。この乗数を変更して、歪みの全体的なスケールを拡大または縮小できます。「compose:args」値が定義されていない場合、正しい値がデフォルトで設定されます。値が0に設定されている場合、その方向には歪みが適用されません。合成引数を自動的に設定する場合は、次の同等の「option:」の設定方法を使用して計算できます…

  magick koala.gif  map_compress.gif map_compress_y.gif \
          -set option:compose:args '%[fx:w/2]x%[fx:h/2]' \
          -compose Distort  -composite \
          distort_compose_set.gif
[IM Output]
または、IMが正しい値(2D歪み用)を計算できるように、それを未定義にします…

  magick koala.gif  map_compress.gif map_compress_y.gif \
          -compose Distort -define compose:args='' -composite \
          distort_compose_default.gif
[IM Output]

無効な歪みマップ

さらに進む前に、少し戻って、上記の「無効」な例をもう一度見てみましょう。これは実際には画像をわずかにぼかします。なぜなら、私が概説した式は実際には完全に正確ではないからです。元の「無効」のコピーを取得することは、歪みの数学が正しいことを確認するための良いテストです。

つまり、完全な勾配が与えられた場合、ソース画像の各ピクセルを宛先画像にマッピングできます。つまり、LUTの「白」(または1.0)の値は、宛先の右端(または下端)のピクセルに正確にマッピングされます。

無効な歪みのテストには、「ピクセルチェック画像」(例:「pattern:gray50」)を使用します。これにより、歪み、つまり適用された数学のあらゆる問題が表示されます。そこで、これまで使用してきた方法に無効な歪みを適用してみましょう…

  magick -size 75x75 pattern:gray50 \
          \( gradient: -rotate 90 \) \( gradient: -flip \) \
          -fx 'p{u[1]*w,u[2]*h}'    distort_fx_check.gif
[IM Output]

  magick -size 75x75 pattern:gray50 \
          \( gradient: -rotate 90 \) \( gradient: -flip \) \
          -set option:compose:args '%[fx:w/2] x %[fx:h/2]' \
          -compose Distort  -composite  distort_compose_check.gif
[IM Output]
ご覧のとおり、どちらの方法も「ピクセルチェック」画像を再現できませんでした。座標の計算方法が異なるため、わずかに異なる方法で失敗しました。何が起こったかというと、カラー参照からピクセル座標へのスケーリング係数が1ピクセルずれていました。これが発生した理由の詳細については、「歪み、画像座標とピクセル座標」を参照してください。
FX歪みは右上の隅(ピクセル位置0,0)を中心としており、下端と右端の沿いに重複する仮想ピクセルを生成します。つまり、参照カラーから、実際の参照に使用される画像座標へのスケーリングの中心を変更しようとしていないためです。そのため、スケーリングが間違っていても、黒ピクセルはピクセル0,0を中心に残ります。

合成「Distort」演算子は、スケーリングが適用される前に、画像の中心にゼロがあるように座標を変換します。これは、「変位マップ」(後述)のスケーリングの一部として行われます。そのため、不正確なスケーリングにより、画像のエッジが各エッジに沿って1/2ピクセル内側に引っ張られ、画像の中央は正しく残ります。
スケーリング係数を計算するときに、画像座標(幅と高さが1減算された)を使用する、絶対歪みマップの修正された「完全無効」バージョンを次に示します。

  magick -size 75x75 pattern:gray50 \
          \( gradient: -rotate 90 \) \( gradient: -flip \) \
          -fx 'p{u[1]*(w-1),u[2]*(h-1)}'    distort_fx_check_correct.gif
[IM Output]

  magick -size 75x75 pattern:gray50 \
          \( gradient: -rotate 90 \) \( gradient: -flip \) \
          -set option:compose:args '%[fx:(w-1)/2] x %[fx:(h-1)/2]' \
          -compose Distort  -composite  distort_compose_check_correct.gif
[IM Output]
実際、「compose:args」のデフォルト値は、未定義の場合、正しいスケーリング値を使用します。

  magick -size 75x75 pattern:gray50 \
          \( gradient: -rotate 90 \) \( gradient: -flip \) \
          -compose Distort -define compose:args='' -composite \
          distort_compose_default_check.gif
[IM Output]
ただし、これらのわずかな不正確さは、通常、歪みを使用する際にはそれほど重要ではないため、わずかな違いは一般的に無視されます。それが実際に重要な場合に備えて、覚えておいてください。

歪みマップの問題点

回転を試みることで、画像の歪みを続けます。この場合、回転マップの生成は少し難しい場合がありますが、可能です…

  magick -size 75x75 gradient: -background black -rotate 45 \
          -gravity center -crop 75x75+0+0 +repage  map_rot45_x.png
  magick map_rot45_x.png  -rotate 90              map_rot45_y.png
  magick koala.gif  map_rot45_x.png   map_rot45_y.png \
          -compose Distort  -composite    distort_rot45.gif
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
そして、これで画像を回転させる別の方法ができました。この手法の最大の課題は、回転を使用して歪みマップを作成することにより、対角線エッジの側面に奇妙な色のピクセルがいくつか導入されたことです。最後の例では、これにより、画像の右下隅に沿ってランダムなピクセルが追加されました。これらの「ランダム」な色は、より良い画像を作成するために回転によって導入されたアンチエイリアシング値です。ただし、歪みマップの場合、アンチエイリアシングされたエッジピクセルは大きな問題を引き起こす可能性があります。これで、回転されたLUT画像のエッジの色をより正確に定義してみましょう。この場合、より大きな勾配画像を生成してから、回転を正しいサイズにクロップできます。

  magick -size 100x20 xc:white xc:black -size 115x75 gradient: \
          +swap -append   -rotate 45 \
          -gravity center -crop 75x75+0+0 +repage   map_rot45b_x.png
  magick map_rot45b_x.png  -rotate 90              map_rot45b_y.png
  magick koala.gif  map_rot45b_x.png   map_rot45b_y.png \
          -compose Distort  -composite     distort_rot45_better.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
このようにして、LUT内のすべてのピクセルがアンチエイリアシングなしで正しく定義されるようになりました。これで、少し異なる問題が表示されます。最終画像のすべてのピクセルは適切に定義されていますが、一部のピクセルは最終画像の一部であってはなりません。それらは結果の画像に実際の意味を持ちません。これは、ソース画像から取得する絶対座標を指定するためにLUTを使用することの最大の課題を表しています。これらの未定義の領域でIMが何を行うべきかを指定する方法がありません。

マスクを使用した未定義ピクセルの設定

「未定義のピクセル」の問題を解決するより一般的な方法は、歪みで実際に有効な定義済みの結果であるピクセルのマップ、つまりマスキング画像を定義することです。たとえば…

  magick -size 75x75 xc:white -background black -rotate 45 \
          -gravity center -crop 75x75+0+0 +repage  map_rot45b_m.png
  magick distort_rot45_better.png map_rot45b_m.png \
          -alpha off -compose CopyOpacity -composite   distort_rot45_masked.png
[IM Output]  + [IM Output] ==> [IM Output]
これで、歪みマップに関連する画像が3つになり、結果は非常に複雑になっています。もちろん、典型的な状況では、そこまで行う必要はないでしょうが、一般的なケースではそうする必要があります。

統合歪みイメージ

ただし、3つのマップすべてがグレースケール画像であることに気づいたかもしれません。つまり、すべてのマップを単一の歪みマップ画像にマージすることは非常に妥当です。たとえば、「X歪みマップ」を「red」チャネルに、「Yマップ」を「green」に、「マスク」を「alpha」または透明度チャネルにマッピングして、処理を容易にします。

  magick map_rot45b_x.png map_rot45b_y.png \( map_rot45b_m.png -negate \) \
          -alpha off -channel RGA -background black -combine  map_rot45u.png
[IM Output] [IM Output] [IM Output] ==> [IM Output]
結合チャネル画像の「blue」チャネルは定義されていないため、現在の-backgroundの色(上記では「black」または値0にプリセット)の値を取ります。
次に、この統合された歪みマップをコアラ画像に適用してみましょう。残念ながら、これは画像を歪める処理と結果をマスクする処理の2つの画像処理手順が必要です。

  magick koala.gif -alpha set   map_rot45u.png \
          \( -clone 0,1  -fx 'p{v.r*w,v.g*h}' \
             +clone -compose Dst_In -composite \) -delete 0,1 \
          distort_rot45_unified.png
[IM Output] [IM Output] ==> [IM Output]
統合された歪みマップ画像を使用して、Distort合成方法を直接使用することもできます…

  magick koala.gif -alpha set   map_rot45u.png \
          -compose Distort -define compose:args='' -composite \
          distort_rot45_compose.gif
[IM Output]
「統合された歪みマップ」画像には、まだ使用されていないチャネル(blue)があります。その論理的な使用方法の1つは、歪んだ画像にハイライトとシャドウを追加することです。(ハイライトのオーバーレイを参照)。この手法が、下記の球面歪みマップの例でさらに一歩進められていることがわかります。

砂時計歪みマップ

今度は、画像の各行の高さを基に各行を異なるスケールでスケーリングする、1次元の歪みマップが必要でした。まるで、太った人を非常に細く見せる、本物のカーニバルの面白くて歪んだ鏡のような歪みです。つまり、砂時計のような歪みです。これは非常に複雑なLUT画像であり、多くの試行錯誤の後、高さ変数を生成するための次の式を考案しましたが、水平方向に線形な勾配マップです。

  magick -size 100x100 xc:  -channel G \
          -fx 'sc=.15; (i/w-.5)/(1+sc*cos(j*pi*2/h)-sc)+.5' \
          -separate  map_hourglass.png
[IM Output]
グレースケール勾配を生成する際には、上記のように単一のカラーチャネル(「G」または緑のチャネルなど)のみを生成するように要求するだけで、-fx演算子を3倍高速化できます。このチャネルは、その後分離して、必要なグレースケール画像を形成できます。これは、特に非常に複雑な「-fx」式を使用する場合、非常に大きな速度向上を表す可能性があります。
sc」は砂時計のスケーリング係数(値の範囲は0〜0.5)であり、歪みの大きさを調整できます。次に、このマップを組み込みの「rose:」画像に適用してみましょう。100x100ピクセルのマップは70x46ピクセルの画像と一致しません。これは、提供する歪みマップと一致するように、ソース画像の現在のピクセルを適切な量でスケーリングする必要があるため、物事を複雑にします。そのピクセルの色の場所を参照します。

  magick rose:  map_hourglass.png \
          -fx 'p{ v.p{i*v.w/w,j*v.h/h}*w,  j}'  distort_hourglass.png
[IM Output]
注意深く見ると、ピクセルのX座標「i」は歪みマップ画像の幅「v.w」に掛けられ、元の画像の幅「w」で割られて「i*v.w/w」が生成されます。ピクセルのY座標「j*v.h/h」についても同様です。これにより、宛先画像のピクセル座標が歪みLUT画像と一致するように再スケーリングされます。参照された座標は、LUT値にソース画像の幅を掛けて、カラー参照のX座標になります。XとYの両方の歪みマップがある場合は、Yマップについてもスケーリングされた参照を繰り返す必要があります。もちろん、前に見たのと同じ「エッジ」の歪みがあるので、仮想ピクセル設定を透明に変更してみましょう。

  magick rose: -alpha set  -virtual-pixel transparent -channel RGBA \
          map_hourglass.png  -fx 'p{ v.p{i*v.w/w,j*v.h/h}.g*w, j}' \
          distort_hourglass2.png
[IM Output]
-channel」設定の使用に注意してください。これにより、「-fx」がソース画像からアルファチャネル(透明)の値、特に透明な仮想ピクセルを処理して返すことが保証されます。また、歪みマップを参照する際に、グリーンチャネルのみを参照した点にも注意してください('v.p{}.g'を使用)。これが行われない場合、ソース画像から処理されるものと同じチャネルが使用され、マップの「アルファ」は定義されません。この歪みマップは、非線形勾配を使用することでさらに改善できます。これにより、画像が長方形のままになり、中央よりも端でより大きな歪みが生じ、「丸み」または「円筒形」の外観が得られます。どなたか挑戦してみませんか?メールください

球面歪みマップ

前のHourglass Distortion Mapの例では、コサインカーブによって水平方向にスケールされたグラデーションを生成しました。もう少し工夫すれば、代わりに球形を作成できます…

  magick -size 100x100 xc:  -channel R \
          -fx 'yy=(j+.5)/h-.5; (i/w-.5)/(sqrt(1-4*yy^2))+.5' \
          -separate  +channel     sphere_lut.png
[IM Output]
ただし、上記は厳密には正確ではありません。圧縮されたグラデーションは線形グラデーションのままであり、円の中に収まるように圧縮されているだけです。より正確な表現には、おそらく非線形グラデーションの作成が必要になります。絶対位置の観点から見ると、それは 'arccos()' 関数になります。このマッピングには、無効と分類される大きな領域もいくつかあるため、最終的な画像で有効なピクセルと無効なピクセルを定義するための何らかのマスキングが必要です。この場合は、単純な円形を使用します。

  magick -size 100x100 xc:black -fill white \
          -draw 'circle 49.5,49.5 49.5,0'    sphere_mask.png
[IM Output]
そして、最後に、Overlay Highlightsで開発されたようなシェーディングハイライトも必要です。OverlayまたはHardlight合成で使用します…

  magick sphere_mask.png \
          \( +clone -blur 0x20 -shade 110x21.7 -contrast-stretch 0% \
             +sigmoidal-contrast 6x50% -fill grey50 -colorize 10%  \) \
          -composite sphere_overlay.png
[IM Output]
上記のシェーディングは、球状オブジェクトの境界内でのみ重要であることを覚えておいてください。そのため、シェードがその境界を超えているという事実は重要ではありません。実際、より良い球状シェーディングを考案して、さらに優れたボールのような画像を作成したい場合は、ぜひ見てみたいと思います。そこで、X座標LUT、オーバーレイシェーディング、透明度マスクの3つの画像をすべて、適切なサイズの実際の画像(簡略化のため)に適用してみましょう。

  magick lena_orig.png -resize 100x100   sphere_lut.png   -fx 'p{ v*w, j }' \
          sphere_overlay.png   -compose HardLight  -composite \
          sphere_mask.png -alpha off -compose CopyOpacity -composite \
          sphere_lena.png
[IM Output] ==> [IM Output]
絶対歪みマップの最も強力な側面を示すこの特定の例では、任意の自由形状オブジェクト(必ずしも数学的ではない)にグラデーションを定義できるため、曲線、しわ、折り目など、どのような画像でもそのオブジェクトにマッピングできます。簡単に言えば、オブジェクトマッピングが完了したら、任意の画像をその表面にマッピングできます。そして、よりリアルに見せるために、2番目のマッピングを重ねて、ハイライト、影、エッジ、その他の機能を追加できます。もちろん、3つの画像すべてがグレースケールであるため、それらを単一の統合歪みマップ画像に結合して、簡単に保存できます。この場合は、X座標歪みLUTをY座標にも再利用することで、より球状の歪みを作成します。

  magick sphere_lut.png   \( +clone -transpose \) \
          sphere_overlay.png   \( sphere_mask.png -negate \) \
          -channel RGBA  -combine    spherical_unified.png
[IM Output]
それはかなり美しいマップです。ただし、解釈しようとする場合は、「赤」と「緑」のチャネルはXとY座標LUTであり、「青」はハイライトと影の効果のオーバーレイであり、透明度チャネルは最終画像の無効なピクセルマスクを保持していることを覚えておいてください。Distort合成メソッドを使用して適用してみましょう。

  magick mandrill_grid_sm.jpg   spherical_unified.png  \
          \( -clone 0,1 -alpha set -compose Distort -composite \) \
          \( -clone 1   -channel B -separate +channel \) \
          \( -clone 2,3 -compose HardLight -composite \) \
          \( -clone 4,1 -compose DstIn -composite \) \
          -delete 0--2  spherical_mandrill.png
[IM Output] ==> [IM Output]
順に…
  • 歪みマップ(マスクを含む)を適用します
  • 統合画像マップからシェーディングマップを抽出します
  • 歪んだ画像にシェーディングマップを適用します
  • シェーディング操作で失われたマスクを復元します
  • 最終画像以外のすべてを削除して保存します
この複雑さは、シェーディングマスクを抽出してシェーディングによって削除されたアルファマスクを復元する必要があるためです。

円弧歪みマップ

位置歪みマップを使用することで実際に何が可能になるかを示すために、上記の'Arc' Distortion Methodによって提供されるものと同様の絶対歪みLUTをここに示します。基本的に、歪められる各画像のすべてのピクセルについて座標マッピングを計算する代わりに、計算された座標を2つのX座標とY座標のグレースケールLUTマップに保存します。つまり、歪みをより単純なルックアップテーブル画像に事前に計算することで、平方根や三角関数を使用せずに、何度も何度も適用できます。

  magick -pointsize 30 -font Candice label:Anthony -trim +repage \
          -gravity center -resize 95x95 -crop 100x100+0+0\! \
          -flatten text_image.jpg
  magick -size 100x100 xc: -channel G  -fx 'atan(j/(i+.5))*2/pi' \
          -separate   -flip -flop       map_p_angle.png
  magick -size 100x100 xc: -channel G  -fx '1-hypot(i,j)/(w*1.6)' \
          -separate   -transverse       map_p_radius.png
  magick text_image.jpg   map_p_angle.png map_p_radius.png \
              -fx 'p{u[1]*w,u[2]*h}'    distort_p_curved.jpg
[IM Output]
カラーソース
 +
 
[IM Output]
角度 - Xマップ
 +
 
[IM Output]
半径 - Yマップ
==>
 
[IM Output]
湾曲したテキスト
もちろん、その歪みマップの生成は困難でしたが、一度完了したら、好きな方法(「Gimp」のような画像エディターを使用して芸術的にでも)で、それを膨大な数の画像に再利用できます。

極座標歪みマップ

場合によっては、処理を正しく行うために、ソース画像ではなく、歪みマップによって宛先画像を定義する必要がある場合があります。たとえば、テキストを円にマッピングする場合(極座標変換とも呼ばれます)、実際には、高さが高さの3〜4倍の長さ(縦横比が高い)の画像を使用する必要があります。そうでないと、結果は読みづらくなります。そのため、最初の(Xマップ)画像がソース入力画像ではなく、最終結果のサイズを設定するために使用されるように、歪みマップ画像をカラーソース画像の前に配置します。

  magick -size 100x100 xc:  -channel G \
          -fx 'atan2(i-w/2,h/2-j)/pi/2 + .5' \
          -separate  map_p_angular.png
  magick -size 100x100 xc:  -channel G \
          -fx 'rr=hypot(i-w/2,j-h/2); (.5-rr/70)*1.2+.5' \
          -separate  map_p_radial.png
  magick -font Candice -gravity center -size 200x50 \
                                label:'Around  the  World'    text.jpg
  magick map_p_angular.png map_p_radial.png text.jpg \
                 -fx 'u[2].p{ u*u[2].w, v*u[2].h }' distort_p_circle.jpg
[IM Output]
角度 - Xマップ
 +
 
[IM Output]
放射状 - Yマップ
 +
 
[IM Output]
カラーソース
==>
 
[IM Output]
円形テキスト
基本的に、カラーソース画像は任意のサイズまたは縦横比にすることができ、処理は正しく行われます。ただし、ソース画像の縦横比を正しく処理するように歪みマップの生成を調整する必要がある場合があります。上記のマップの生成では、値 '70' は、中線が配置される円の最終サイズを制御します。一方、'1.2' の値は、画像を円に垂直方向にスケーリングして、歪んだテキストの高さを調整できます。
この「-fx」式では、最初に歪みマップを指定し、カラーソースを3番目(インデックス2)の画像として指定する必要があることに注意してください。ただし、これにより、ソース画像に保存されているメタデータも失われます。
この歪みマップの問題は、「Xマップ」の色に非常に鋭い不連続があることです(数学における漸近線によって引き起こされます)。この線は、より大きな画像を作成するためにマップのカラー参照やサイズ変更を行う場合、鋭いままである必要があります。つまり、このマップのサイズ変更や補間された参照によって、その漸近線に沿ってグレーの参照色が生成されないようにする必要があります。

この線に沿ってグレーの参照色が生成されると、最終結果に色付きピクセルの線(画像の中央から参照されたもの)が表示されます。

このため、常に必要な最終画像のサイズでこの歪みマップを生成し、以前に示したスケーリング技術を決して使用しないことをお勧めします。
これは、円形の市松模様などの他の効果にも使用できます…

  magick map_p_angular.png map_p_radial.png \
          -size 150x90 pattern:checkerboard \
          -fx 'u[2].p{ u*u[2].w, v*u[2].h }'   distort_check_circle.gif
[IM Output]
他の興味深い効果を得るために、上記のIMが提供する組み込みパターンをいくつか試してください。
上記は、「-fx」を使用した画像の歪みの限界を明確に示しています。画像の中心付近では、大きな領域の単一ピクセルへのマージが行われないため、放射状の線がエイリアシングされるようになっています。一方、画像の端、特にコーナーでは、放射状の線が適切にぼやけています。

原因は、「-fx」(およびほとんどの古い歪みメソッド)がソース画像の色について非常に単純な非スケール補間ルックアップしか行わないことです。これは、画像が縮小されるにつれて、ソース画像のピクセルがマージされて宛先ピクセルの正しい色が生成されないことを意味します。

これは、拡大領域(コーナーなど)の問題ではなく、極端な圧縮(中央)の問題です。そのため、解決策の1つはスーパーサンプリングの使用ですが、これを行うことで、問題はより高い圧縮レベルに延期されるだけです。
歪みマップの同じ漸近線(急激な変化)(画像の中央から下部)も、上記の例ではその線に沿って鋭い色の変化を生み出します。その線と、補間されたルックアップで以前に示したように、画像の端に向かって非常にぼやける他の放射状の線(画像の中央から上部への線など)を比較してください。

これは、タイル可能な画像(上記など)を使用して円形パターンを生成する場合に問題となる可能性があり、画像のその部分の違いを回避するために特別な処理が必要になる場合があります。

これを回避するには、漸近領域を回避するために、画像の上半分と下半分を別々に歪ませる方が良いでしょう。

行のシャッフル

この例では、少し変わったことを行います…画像の行をランダムにシャッフルします。まず、X(赤チャネル)にグラデーション、Y(緑チャネル)にランダムノイズ画像があるマップを作成します。

  magick rose: \
          \( -size 46x70 gradient: -rotate -90 \) \
          \( -size 1x46 gradient: -spread 23 -scale 70x46\! \) \
          -compose Distort -define compose:args='' -composite \
          rose_row_shuffle.png
[IM Output] ==> [IM Output]
残念ながら、「-spread」は仮想ピクセルをピクセルの交換の選択に含むようで、いくつかの行が重複する一方、他の行が完全に失われることを意味します。つまり、「シャッフル」イメージマップはあまり正確ではありません。ピクセルのシャッフルに優れたソリューションはありますか?

相対ルックアップ変位マップ

絶対歪みマップの作成と使用は比較的簡単ですが、歪みに「未定義」の領域がある場合、または歪みがソース画像の通常の境界外に「はみ出す」領域がある場合、深刻な問題があります。さらに深刻な問題は、常にグラデーションを扱っていることです。グラデーションは、カラー参照の絶対座標を定義します。マッピング画像のどの部分も単純ではなく、クリーンでもなく、手動で修正したり編集したりするのは容易ではありません。作成と使用には特殊なテクニックと数学が必要です。つまり、一般的に「芸術的」な開発はほとんどありません。ただし、最終的な色を取得する座標を指定するためのルックアップテーブルを使用する別の方法があります。相対変位マップを使用します。「マップ」がソース画像から各ピクセルの色を参照する正確な座標を定義するのではなく、現在の位置に対するオフセットまたは変位を定義します。オフセットは正または負の値にすることができ、負の値をカラー値にエンコードするには少し工夫が必要です。そこで、彼らは「純粋なグレイ」を座標の変位0(変更なし)として定義します。次に、「黒」を最大の負の変位、「白」を最大の正の変位を意味するようにします。説明するのは難しいので、例を見てみましょう。まず、「変位」するテスト画像を作成します。

  magick -font Candice -gravity center -size 150x50 \
                                           label:'Anthony'    label.jpg
[IM Output]
さて、「マジック」を使用して、「純粋な白」と「純粋な黒」の領域を持つ「純粋なグレイ」画像を作成します。

  echo "P2 5 1 255\n 127 0 127 255 127" |\
                magick - -scale 150x50\! -alpha off   displace_map.jpg
[IM Output]
この画像を変位マップとして使用するには、変位マップから「グレイ値」を取得し、X座標とY座標のいずれか(または両方)に追加します。つまり、変位マップの「グレーさ」に応じて、現在の位置から相対的な量だけルックアップを変位させます。「値」は特別な方法で処理されるため、「純粋なグレイ」はルックアップポイントの変位0(Y座標のみの場合)を意味しますが、「最大変位」は「白」(正)または「黒」(負)の値に使用されます。たとえば、変位マップを「ラベル」画像に適用してみましょう。

  magick label.jpg  displace_map.jpg  -virtual-pixel Gray \
          -fx 'dy=10*(2*v-1); p{i,j+dy}'   displaced.jpg
[IM Output]
ご覧のように、画像の様々なセクションは、ディスプレイスメントマップの色に応じて「移動」しているように見えます。「白」の領域は、指定された「ディスプレイスメント値」をルックアップポイントに加算するため、その領域では各ピクセルがソース画像を「10」ピクセル「南方向」(Y方向正)にルックアップします。その結果、ソース画像が上方向に移動したように見えます。これはルックアップがずれているだけで、実際の画像自体は移動していないことを覚えておいてください。そのため、白の場合、上方向、つまり負の方向に移動しているように見えます。「黒」のディスプレイスメントの領域でも同様の効果が見られました。ルックアップのディスプレイスメントが負の方向で行われたため、ソース画像が下方向に移動しているように見えます。よく考えてみてください。また、「ずれたルックアップ」は実際の画像の境界を超えて参照することもでき、仮想ピクセル設定を使用して、これらの境界外のピクセルを制御できることに気付くでしょう。上記の例では、グレーのピクセルを返すように要求しました。上記の例における「最大ディスプレイスメント」値「10」は非常に重要であり、マッピング画像における「純粋な白」または「純粋な黒」のディスプレイスメント値に対して、ソース画像のどの部分も移動する最大相対距離です。この値を超えてルックアップ、したがって入力画像をずらすことはできません。最大白または黒の値と中央の非ディスプレイスメント50%グレー値の間の他のグレーシェードは、適切な量だけルックアップをずらすことになります。そのため、25%グレー値はルックアップを負の方向にディスプレイスメント値の1/2だけずらし、75%グレー値は正の方向にその値の1/2だけずらすことになります。この値は、絶対歪みマップ相対ディスプレイスメントマップの重要な違いです。ディスプレイスメントマップを全く変更することなく、ディスプレイスメント値を変更するだけで、相対ディスプレイスメントを増減させ、画像の歪みをより大きくしたり小さくしたりすることができます。また、「ゼロディスプレイスメント」マップは単なる均一な50%または純粋なグレーであり、複雑なグラデーションではないため、単純なグレー画像から始めて、領域を芸術的に明るくしたり暗くしたりすることで、目的のディスプレイスメントを生成できます。これは、複雑で正確な数学的公式を必要とするのではなく、単に図形や領域を描くことで実行できます。そして最後に、すべてのディスプレイスメントは相対的であるため、エッジ効果によって生成されるような極端な値でも、極端なランダムなピクセルカラーが生成されることはありません。実際、後ほど説明するように、ディスプレイスメントマップをスムーズにしたりぼかしたりすることは、上記の例で見られる不連続な「切断」効果を除去するため、実際には良いことです。要約するとディスプレイスメントマップは、はるかに制御しやすく、芸術的で、複雑で正確な数学を必要とせずに局所的なディスプレイスメントを提供し、ミス、エッジ効果、ディスプレイスメントマップのぼかしに対しても非常に寛容です。水、波、歪んだ鏡、光の屈折、レンズのような効果、またはフロストガラスや泡ガラスの効果などを生成する場合のような、単純な「ディスプレイスメント」タイプの歪みに最適です。「極座標」、「回転」、「透視」などの高度な数学的歪み、またはその他の現実世界の3次元タイプのマッピングは、容易に実現できません。つまり、不可能だと言っているわけではなく、後ほど2種類のマップ間で実際には魔法をかけることができることを示しますが、より困難です。

合成ディスプレイスメント方法

ディスプレイスメントマッピングの実行にはDIY FXオペレーターを使用したので、実際に行われていることを確認できます。しかし、これは遅い手法です。しかし、同等の組み込みコンポジションオペレーターDisplace」があります。使用方法を次に示します…

    magick {image} {displacement_map} \
            -compose Displace   -define compose:args={X}x{Y} \
            -composite   {result+}

    magick {image} {displacement_map} \
            -compose Displace   -set option:compose:args {X}x{Y} \
            -composite   {result+}

    magick composite {displacement_map} {image} \
              -displace {X}x{Y}    {result+}

特に「magick composite」コマンドでの順序に注意してください。

-setの代わりにdefineを使用することで、引数にパーセントエスケープを使用することもできます。'X'と'Y'の値は、指定されたディスプレイスメントマップで「白」と「黒」の色に使用される方向と「最大ディスプレイスメント」を定義します。一方または両方の値を定義して、特定の方向にずらすことができます。つまり、通常、ディスプレイスメントマップは、'X'と'Y'の値によって制御される最大強度を持つ、あるランダムな方向への線形ディスプレイスメントを提供します。次に、「マップ画像」は、負の最大値(黒)から正の最大値(白)まで、その最大値のどのくらいが適用されるかを設定し、完全なグレーは、そのピクセルのルックアップをずらすことを意味しません。たとえば、上記の同じYディスプレイスメントの例を次に示します…

  magick label.jpg  displace_map.jpg  -virtual-pixel Gray \
          -compose Displace -define compose:args=0x10 -composite \
          displaced_y.jpg
[IM Output]
-geometry 」や「-gravity 」などの他の設定を使用して、ディスプレイスメントマップが画像にオーバーレイされる領域を調整することもできます。ディスプレイスメントマップによって生成されるピクセルのルックアップは、画像のオーバーレイされた部分の外側の領域を参照し、それらをオーバーレイされた領域に複製することができます。

単純な変位例

スムーズな遷移のない生の色の領域のディスプレイスメントマップは、結果の画像内の異なる領域間で、上記で見たように、一般的に不連続な(不連続な)ディスプレイスメントを生成します。実際、この手法を使用して、割れた鏡の中を見ているかのように「割れる」ディスプレイスメントマップを作成できます。たとえば、下の割れた鏡を参照してください。色が領域間でスムーズに流れるようにすることで、より美しく滑らかな結果を得ることができます。たとえば、ディスプレイスメントマップをぼかすことで、ずれた領域間に波のような遷移を生成できます…

  magick displace_map.jpg  -blur 0x10   dismap_wave.jpg
  magick label.jpg  dismap_wave.jpg  -virtual-pixel Gray \
          -compose Displace -define compose:args=0x10 -composite \
          displaced_wave_y.jpg
[IM Output]
[IM Output]
Y方向に画像をずらすのではなく、マップを使用してX方向に画像をずらすことで、一種の圧縮波を生成することもできます。

  magick label.jpg  dismap_wave.jpg  -virtual-pixel Gray \
          -compose Displace -define compose:args=10x0 -composite \
          displaced_wave_x.jpg
[IM Output]
X方向とY方向の両方に同じディスプレイスメントマップを使用することで、圧縮波と振幅波の両方を追加できます。

  magick label.jpg  dismap_wave.jpg  -virtual-pixel Gray \
          -compose Displace -define compose:args=10x10 -composite \
          displaced_wave_xy.jpg
[IM Output]
画像は依然として単一の線形方向にずれていることに注意してください。その結果、上記の画像は下りの斜面で伸び、上りの斜面で圧縮されます。つまり、歪みは角度または「ベクトル」で実行され、水平方向と垂直方向の両方の成分があります。この効果は、水面に穏やかな波紋によって画像が歪められているかのように、水中にいることに非常によく似ていることがわかります。しかし、歪みマップには、反射または屈折された画像のように、元の画像の複数の複製を含めることができます…

  echo "P2 3 1 255\n 255 127 0 " | magick - -scale 150x50\! dismap_copy.jpg
  magick label.jpg  dismap_copy.jpg \
          -compose Displace -define compose:args=66x0 -composite \
          displaced_copy.jpg
[IM Output]
[IM Output]
グラデーションを使用して、画像の一部をミラー反転または反転することもできます。たとえば、線形ディスプレイスメントマップを使用して、画像の一方の端から他方の端へピクセルをコピーできます。

  magick -size 50x150 gradient: -rotate -90  -alpha off  dismap_mirror.png
  magick label.jpg  dismap_mirror.png \
          -compose Displace -define compose:args=150x0 -composite \
          displaced_mirror.jpg
[IM Output]
[IM Output]
このディスプレイスメントマップの動作方法はわかりますか?ヒントとして、左端と右端のディスプレイスメントを調べ、残りの画像がどのように適合するかを確認してください。ただし、グラデーション画像を使用しているため、ディスプレイスメントマップのシンプルさが失われます。そのため、鏡は、画像への直接的な反転操作を使用するか、代わりに絶対歪みマップを使用する方が優れています。グラデーションを反転させると、画像が縮小されることに注意してください。

  magick -size 50x150 gradient: -rotate 90  -alpha off  dismap_shrink.png
  magick label.jpg  dismap_shrink.png \
          -compose Displace -define compose:args=150x0 -composite \
          displaced_shrink.jpg
[IM Output]
[IM Output]
上記は、ディスプレイスメントマップが持つ特定の問題も示しています。画像の領域(またはすべて)が50%以上圧縮されると、エイリアシングアーティファクトが生成され始めます。これは、はっきりと見える階段状の「エイリアシング」エッジに特に顕著です。前述のように、これに対する1つの解決策は、出力ピクセルごとに使用されるピクセル数をスーパーサンプリングすることです。そのためには、画像とディスプレイスメントマップの両方を拡大してから、結果の画像を通常のサイズにリサイズします。これにより、より多くのピクセルが結果の特定のピクセルの設定に関与し、より良い画像を生成できます。たとえば…

  magick label.jpg  dismap_shrink.png  -resize 200% \
          -compose Displace -define compose:args=400x0 -composite \
          -resize 50%    displaced_resize.jpg
[IM Output]
はるかに良く、滑らかな結果ですが、少しぼやけているかもしれません。 グラデーションのグラフ化上記の例から直接得られたアイデアは、単純な線のYディスプレイスメントを使用することで、ディスプレイスメントマップの色のグラフを生成できるというものです。たとえば、ここでは、数学的なsinc()関数('sin(x)/x'として定義される)を生成し、それをディスプレイスメントマップとして使用することでそのグラデーションをグラフ化します…

  magick -size 121x100 xc: -fx 'sin(i*24/w-12)/(i*24/w-12)/1.3+.2' \
                                                      gradient_sinc.gif
  magick -size 121x100 xc: -draw 'line 0,50 120,50'     graph_source.gif
  magick graph_source.gif gradient_sinc.gif \
          -compose Displace -define compose:args=0x49 -composite \
          displace_graph.gif
[IM Output]  + [IM Output] ==> [IM Output]
ご覧のように機能しますが、数学的プロットには使用したくありません。適切なグラフ化パッケージを使用する方が良いでしょう。ただし、この手法は、画像の行または列のピクセルの強度をプロットする汚い方法として役立ちます。「グラフソース」の個々のピクセルは一度に1つずつしか見られないため、平均化されず、ずれたルックアップのピクセル間の大きな違いにより、結果の色が大きく変わる可能性があります。要点は、ディスプレイスメントは、スムーズなディスプレイスメントマップだけでなく、大きな色の領域やシェードを含む画像をずらす場合にも最適に機能することです。シャープな細い線にはあまり適していません。もちろん、再びスーパーサンプリングして歪みマップを改善できます…

  magick graph_source.gif gradient_sinc.gif  -resize 400% \
          -compose Displace -define compose:args=0x196 -composite \
          -resize 25%   displace_graph_2.gif
[IM Output]
結果ははるかに優れていますが、グラフ化パッケージを使用して達成できるものほど良くはありません。それでも、その作成にはImageMagickのみが使用されています。同じグラフの別のバージョンですが、今回は単色を使用しており、細い線をずらすよりもはるかにうまく機能します。

  magick -size 121x50 xc:white xc:black -append \
          gradient_sinc.gif  -resize 400% \
          -compose Displace -define compose:args=0x196 -composite \
          -resize 25%   displace_graph_3.gif
[IM Output]

エリアディスプレイスメント(線形)

より論理的なディスプレイスメントの問題を試してみましょう。画像の領域をある場所から別の場所へ直線で移動します。これまで見てきたように、「純粋なグレー」の画像はディスプレイスメントを引き起こしませんが、「白」の色はソース画像からの正のルックアップディスプレイスメントを引き起こします。たとえば、そのような画像を作成してみましょう…

  magick -size 75x75 xc:gray50 -fill white \
          -draw 'circle 37,37 37,20'  dismap_spot.jpg
[IM Output]
この画像を適用すると、マークされた領域の内容に、指定されたディスプレイスメント値の方向に表示されるもののコピーが含まれるはずです。そのため、X+10とY+10または'10x10'のディスプレイスメント値を試してみましょう…

  magick koala.gif dismap_spot.jpg \
          -compose Displace -define compose:args=10x10 -composite \
          displace_spot.png
[IM Output]  + [IM Output] ==> [IM Output]
ご覧のように、マークされた領域の内容には、+10,+10ピクセル南東に位置する画像のコピーが含まれています。つまり、コアラの「尻尾」の画像です。言い換えると、円内では画像が北西に、または-10,-10ピクセル移動しています。反転ピクセルマッピングにより、ルックアップの変位は負の値になるため、ソース画像は負の量だけシフトされます。画像は逆方向に移動します!また、移動するのはマークされた領域内の画像であることに注意してください。マークされた画像を移動しているのではなく、マークされた領域に画像を移動させています。そして最後に、円の縁における急激な不連続性にも注意してください。マークされた領域内の領域は移動しますが、領域の外側はまったく変更されません。これらの事実は重要なので、繰り返しておきます。
変位は、値とは逆方向に画像を移動させます。
グレーではないマークされた領域のみが変位します。
色の急激な変化は、画像の急激な不連続性を引き起こします。
では、より実用的なことを試してみましょう。コアラの鼻と目の間のセンター('32,22')を、白い円(完全な正の変位)のセンター('37,37')に移動してみましょう。そのためには、'-5,-15'の変位値が必要です(逆方向であることを覚えておいてください)…

  magick koala.gif dismap_spot.jpg \
          -compose Displace -define compose:args=-5x-15 -composite \
          displace_head.png
[IM Output]
これで、コアラの頭の真ん中の部分が綺麗に中心にコピーされました。しかし、画像はまだ「不連続」で、負の値を使用するのはあまり良くありません。解決策としては、代わりに黒い点を使用し、その点の端をぼかすことです。また、コアラの頭部をもっと含むように大きくしましょう。これが私たちの「正の移動スポット」画像です…

  magick -size 75x75 xc:gray50 -fill black \
          -draw 'circle 37,37 37,17'  -blur 0x5  dismap_area.jpg
[IM Output]
画像をぼかしすぎると、スポットの中心がフラットな黒色ではなくなります。あるいは、正規化レベル反転調整して、描画領域が黒で、周囲の部分が完璧なグレーになるようにすることもできます。これは後の例で何度も行われます。では、この黒い「ぼやけたスポット」変位マップを使用して、最後の「頭部」の変位を繰り返してみましょう。

  magick koala.gif dismap_area.jpg \
          -compose Displace -define compose:args=5x15 -composite \
          displace_area.png
[IM Output]
ご覧のように、画像は+5,+15だけ「ぼやけた」領域に移動しますが、今回は領域の境界が滑らかになり、画像の残りの部分とつながっています。もちろん、円の端にある耳はぼやけた端によって歪んでおり、コアラの体も圧縮されていますが、以前のものよりははるかに優れています。画像の「裂け目」を防ぎ、変位部分のコピーを残さないためには、そのスポットを拡大するか、より複雑なグラデーションタイプの変位画像を作成する必要があります。たとえば、コアラの頭を初期位置('32,22')から画像の中心('37,37')、つまり+5,+15ピクセルの移動に移動したいとします。しかし、画像全体をこの変更に調整して、より滑らかな効果を得たいとします。そのためには、'37,37'で黒の最大変位(正の画像変位)を行い、+5,+15の値で変位させる必要があります。しかし、50%グレーでコーナーを「固定」することによって、画像の残りの部分がそのまま残るようにする必要があります。これは、シェパード補間スパース勾配に最適です。

  magick -size 75x75 xc:  -sparse-color  Shepards \
          '37,37 black   0,0 gray50  74,74 gray50  0,74 gray50  74,0 gray50' \
          dismap_move.jpg
  magick koala.gif dismap_move.jpg \
          -compose Displace -define compose:args=5x15 -composite \
          displace_move.png
[IM Output]  + [IM Output] ==> [IM Output]
ご覧のように、より広い変位領域が画像全体に広がっています。その結果、以前の狭い「スポット」方式よりも、はるかに滑らかに変化する画像になります。これは実際にはシェパードの歪みと全く同じですが、移動する制御点が1つだけです。これは、Fred Weinhausのスクリプト 'shapemorph'で使用されている方法と全く同じですが、アニメーションが追加されています。要約すると、小さな局所的な変位には「ぼやけたスポット」変位を使用できます。しかし、より長い距離にわたる大きな変位には、ソース画像の裂け目や複製を防ぐために、より大きく滑らかな勾配変位マップを使用する必要があります。
建設中

単純な変位モーフィング

Modifying the Size of Displacement Vectors
Two Image Morphing
Random 1D Displacements

波打つ水の反射

前述のように、変位マップは、水やガラスのような歪みを生成するのに特に役立ちます。[IM Output]この例では、切り抜きを使って花の画像から小さな画像を生成しました。今度は、それが波打つ水面に置かれているように見せたいと思います。波紋を生成するには、評価Sin関数を使用して生成できる、同じサイズの正弦波勾配が必要です。「8」は、勾配に追加される「波」の数です。

  magick -size 150x80 gradient:  -evaluate sin 8  wave_gradient.png
[IM Output]
では、単純な垂直または水平方向の歪みだけでなく、角度付きの変位ベクトルを使用して、その画像を歪めて、より強調してみましょう。

  magick composite wave_gradient.png  flower.jpg -displace 5x5 flower_waves.png
[IM Output]
これはあまり面白く見えませんが、その画像を反転して垂直方向に圧縮し、元の画像に追加したらどうなるでしょうか…

  magick flower_waves.png -flip \
          flower.jpg  +swap -append  flower_waves_2.png
[IM Output]
残念ながら、まだかなり不自然に見えます。理由は、反射が画像の上部と下部で同じように見えることです。「奥行き」がありません。反射は元の画像と同じ明るさで、これはめったにありません。よりリアルにするには、強度が変化する波紋パターンを使用する必要があります。以下は、いくつかの高度な勾配数学を使用して、上記の波紋勾配を「減衰」させています。つまり、波紋パターンが上から下に向かって線形に小さくなっています。このトリックによって、波紋は画像の下部(後で反転されます)で純粋なグレー、つまり「変位なし」の色で終了します。

  magick -size 150x80 gradient: \
          \( wave_gradient.png \
             +clone -compose multiply -composite \) \
          \( -clone 0 -negate -evaluate divide 2 \
             -clone 1 -compose plus -composite \) \
          -delete 0-1      waves_decreasing.png
[IM Output]
では、この勾配を適用して、花の新しい反射を形成しましょう。また、水自体に光が失われることを表すために、反射画像を少し暗くしました。これにより、水の反射のように見えます。

  magick flower.jpg  waves_decreasing.png  \
          -compose Displace -define compose:args=8x8 -composite \
          -flip   +level 0,80% \
          flower.jpg  +swap -append   flower_in_water.png
[IM Output]
歪んだ画像は反転して反射を形成することに注意してください。また、元の画像に最も近い「水」の上部では、下部よりも「波紋」が少なくなります。これにより、歪みに視聴者からの距離感が生まれます。わずかな回転、円弧、または単なる「ランダム」な変位で波紋変位マップを歪めることで、さらにリアルにすることができます。これにより、波紋がより自然な外観になります。「減衰」する前にこれを行う方が良いので、後で「奥行き」を追加できます。試してみて、実験して、結果を教えてください。
Future Animated Ripples -
  Using -function Sinusoid with phase changing

2次元変位マッピング

これまでのところ、すべての相対変位マップは、画像を1方向にしか変位させていません。ただし、適切な 'XxY' 変位値または「ベクトル」を設定することで、その方向を任意の角度に設定できます。ただし、2つの異なる変位を使用して、画像が任意の方向に任意の量だけ変位する、はるかに複雑な変位を作成できます。そのためには、X方向とY方向のそれぞれについて2つの変位マップを作成する必要があります。使用できるコマンドを次に示します…

magick {image} {X displacement} {Y displacement} \
        -compose Displace   -define compose:args={X}x{Y} \
        -composite   {result+}

magick {image} {X displacement} {Y displacement} \
        -compose Displace   -set option:compose:args {X}x{Y} \
        -composite   {result+}

composite {X displacement} {image} {Y displacement} \
          -displace {X}x{Y}    {result+}
"magick composite"コマンドの入力画像の順序に注意してください。「magick composite」オプションの処理を悪用する必要があること、および歴史的な理由から、順番が奇妙です。これを正しくすることは非常に重要です。そのため、「magick composite」ではなく「magick」コマンドを使用することをお勧めします。
IM v6.4.4より前のバージョンでは、別々のXとYの変位に対して2つの別々の変位マップを使用することは、成功するか失敗するかの問題でした。このバージョンより古いIMで試みることさえお勧めしません。
また、統合変位マップと同様に、「統合変位マップ」を使用できます。変位画像が1つだけ提供されている場合、X変位は「赤」チャンネルから、Y変位は「緑」チャンネルからルックアップされ、アルファマスクも変位マップから最終画像に転送されます。「青」チャンネルは無視されます。
内部的には、「magick」と「magick composite」の両方で、実際には2つの画像(提供されている場合)をマージして「統合変位マップ」を生成してから、それを内部APIに渡します。

これは、以前見てきた「線形変位」には影響しません。提供された変位マップはグレースケール画像であるため、「赤」チャンネルと「緑」チャンネルは同じでした。

円柱変位

IMフォーラムで何度も取り上げられてきたのは、コーヒーカップや清涼飲料水の缶などに重ねるように、画像を円柱にマッピングする方法です。これがその解決策です…

  magick rose: -background black -gravity south -splice 0x8 \
          \( +clone -sparse-color barycentric '0,0 black 69,0 white' \) \
          \( -clone 1 -function arcsin 0.5 \) \
          \( -clone 1 -level 25%,75% \
                 -function polynomial -4,4,0 -gamma 2 \
                 +level 50%,0 \) \
          -delete 1 \
          -virtual-pixel black  -define compose:args=17x7 \
          -compose Displace  -composite   rose_cylinder.png
[IM Output]
上記は非常に複雑ですが、本質的には2つの別々の変位を同時に使用しています。X方向のarcsin()圧縮と、Y方向の円弧変位です。コマンドの動作は次のとおりです…
  • "rose"画像を読み込み、垂直変位のためのスペースを追加します
  • 後の数学関数のために、水平な数学的勾配を作成します
  • 勾配のコピーを作成して、圧縮変位マップを生成します
  • 別のコピーを垂直楕円円弧変位にします
  • 線形勾配を削除します
  • 変位を準備して実行します
結果…バラが円柱の30度等角図に正しく巻き付けられています。上記のコマンドを分割して、個々の変位マップを保存して表示します。覚えておくべき重要なのは、2つのマップ変位がX値とY値の両方のルックアップを実行して、どのピクセルがルックアップの位置に最終的に配置されるかを計算することです。変位は、ソース画像の実際の変位ではなく、ソース画像へのルックアップの変位であることを覚えておいてください。この変位歪み方法は、Fred Wienhausによって作成された「cylinderize」スクリプトに組み込まれています。

割れた鏡

XとYの変位をランダムに生成することで、画像に「割れた鏡」のような外観を作成できます。

  magick dragon_sm.gif -sparse-color voronoi '  \
                  %[fx:rand()*w],%[fx:rand()*h]  red
                  %[fx:rand()*w],%[fx:rand()*h]  lime
                  %[fx:rand()*w],%[fx:rand()*h]  black
                  %[fx:rand()*w],%[fx:rand()*h]  yellow
               ' -interpolate integer -implode 1     mirror_areas.gif
  magick  mirror_areas.gif -channel R  -separate   mirror_dismap_x.gif
  magick  mirror_areas.gif -channel G  -separate   mirror_dismap_y.gif

  magick composite mirror_dismap_x.gif  dragon_sm.gif  mirror_dismap_y.gif -alpha off \
            -background white -virtual-pixel background -displace 7 \
                                                        mirror_displaced.gif

  magick  mirror_areas.gif -edge 1 -threshold 20% \
            -evaluate multiply .7 -negate               mirror_cracks.gif
  magick composite mirror_displaced.gif  mirror_cracks.gif -compose multiply \
                                                        mirror_cracked.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] ==>  
  [IM Output] [IM Output] ==> [IM Output]
ランダム化されたVoronoiスパースカラー画像を使用して、4つのランダムに配置された領域が生成されます。次に、これらに内破歪みを適用して、画像の中心に領域を歪めます。4つの色の領域はそれぞれ単色を維持するため、各領域には元の画像の歪みのない、しかし変位したコピーが含まれます。ただし、各領域は元の画像を異なる方法で変位させます。まるで割れた鏡の破片のように。鏡を完成させるために、エッジ検出を使用して領域のエッジ、つまり結果画像の破壊された性質を輪郭を描きます。つまり、亀裂も可視化されます。
技術的には、生成されたランダムな色付き変位マップで「赤」と「緑」のチャンネルを分離する必要はありませんでした。「赤」チャンネルからX変位を、「緑」チャンネルからY変位を検索するため、それらを直接使用できました。つまり、「mirror_areas.gif」画像を「統一された変位マップ」として直接使用できました。
建設中

シェパーズ変位

ランダム変位

レンズ効果

フロストガラス効果

分散効果(回転変位)

ランダム変位による分散効果

将来:その他の可能な歪み/変位マッピングの例
  • 3Dオブジェクトにグラデーションをレイトレースし、後で任意の画像をそれらのオブジェクトにマッピングできるようにします。
    • XとYのグラデーションマッピング画像
    • 色、ハイライト、シェーディングのための純粋なグレイ画像

可変ブラーマッピング

ImageMagickバージョン6.5.4-0に追加された "-compose" メソッド 'Blur' は、マッピング画像に従って、各ピクセルを隣接するピクセルの楕円ガウス平均(ブラー)で置き換える方法を提供します。

    magick composite -blur {Xscale}[x{Yscale}[+{angle}]]          blur_map  image   result

    magick image  blur_map \
        -define compose:args='{Xscale}[x{Yscale}[+{angle}]]' \
        -compose blur -composite   result

    magick image  blur_map \
        -set option:compose:args '{Xscale}[x{Yscale}[+{angle}]]' \
        -compose blur  -composite   result

この画像合成には、運用引数の使用が必要であることに注意してください。これはいくつかの方法で設定できます。詳細については、グローバルに定義されたアーティファクトを参照してください。可変マップを使用してブラーを制御することで、画像の一部をブラー処理しながら、他の部分を完全にそのまま残すことができます。また、チルトシフト効果などの効果を生み出すことができ、現実世界の画像が小さな人工モデルのように見えます。

たとえば、ここではコアラの画像の半分をぼかし、もう半分は完全にぼかさないようにしています...

  magick -size 37x75 xc:black -size 38x75 xc:white +append  blur_map_bool.gif
  magick koala.gif blur_map_bool.gif \
          -compose blur -define compose:args=3 -composite \
          blur_koala_bool.gif
[IM Output]  + [IM Output] ==> [IM Output]
ご覧のとおり、「blur_map」画像で「白」だったピクセルは、指定された最大値の 'sigma' を使用してぼかされ、「黒」だったピクセルはまったくぼかされませんでした。つまり、非常に単純なマスクされたブラーがあります。もちろん、これは他の多くの方法で実現できたでしょうが、それはブラーマッピングの力の説明にはなりません。このブラーマッピングを多用途にするのは、画像全体で可変であることです。つまり、ブラーマッピングの色がグレーの場合、そのピクセルに対して、より小さな「近傍」を使用して、それに対応する小さなぼかしの結果が得られます。ただし、黒はぼかされず、白は指定された値で最大限にぼかされます。1つの注意点として、ぼかしが適用される領域のみが追加の時間を必要とすることです。ぼかされていないピクセルは、この追加の処理を必要としません。これにより、上記の方法は、画像全体をぼかして結果をマージするのと同じであるマスクされた合成を使用するよりもはるかに高速になります。この時間節約は、画像の非常に小さな領域を大きくぼかす場合にさらに重要になる可能性があります。たとえば、コアラの足に向かって徐々にぼかしを増していきます...

  magick -size 75x75 gradient:black-white blur_map_gradient.gif
  magick koala.gif blur_map_gradient.gif \
          -compose blur -define compose:args=3 -composite \
          blur_koala_gradient.gif
[IM Output]  + [IM Output] ==> [IM Output]
そして、同じブラーをもう一度表示しますが、ブラーの高さがどのように変化するかを示します。

  magick blur_map_bool.gif blur_map_gradient.gif \
          -compose blur -define compose:args=15 -composite \
         blur_edge_gradient.gif
[IM Output]  + [IM Output] ==> [IM Output]
可変マッピングブラーの実用的な例として、写真チルトシフト効果距離ぼかし影フォントをご覧ください。個々のピクセルの周りの近傍を使用して、そのピクセルの「ぼかし色」が生成されることに注意してください。つまり、画像の一部をぼかさないように指定した場合でも、そのぼかされていない領域の色が周囲のピクセルのぼかしの一部として使用される可能性があります。つまり、領域がぼかされていないからといって、その領域の色が他のぼかしピクセルの結果の一部として使用されないという意味ではありません。つまり、ぼかされていない領域の色は、周囲のぼかし領域に「漏れる」可能性があります。前景ピクセルを含めずに背景をぼかすには、読み取りマスク手法を使用して、ブラー操作の一部として読み取られないようにする必要があります。

楕円形ブラー

'Blur' コンポーズ設定は、通常のブラーまたはガウスブラー演算子とは異なる手法を使用します。これは、一般化された歪み演算子の一部として、スケールされた画像のリサンプリングのために開発されたガウス楕円領域リサンプリングアルゴリズムを使用して実装されているためです。近傍リサンプリングに使用される楕円領域も、演算子 "-blur" と "-gaussian-blur" が提供する通常の均一な「円形」ブラーよりも、このブラー方法をより多用途にします。楕円自体は、ぼかし領域のシグマの ''、'高さ' によって定義されます。楕円は、指定された '角度'(時計回り)によって直交アライメントから回転させることもできます。たとえば、次の図では、単一ピクセルのぼかし色が、指定されたシグマ値に基づいて回転楕円領域から色を取得する方法を示します。この領域のピクセルは、ガウスフィルタ(楕円距離公式を使用してぼかし色を生成するために使用)に従って重み付け平均されます。

  magick koala.gif -compose blur -define compose:args=5x1-30 -composite \) \
             elliptical_blur.gif
  # ... other commands to create diagram of blur effect ...
[IM Output]
前述のように、これは一般化された歪み演算子が歪んだ画像の色を生成するために使用する色ルックアップ方法とまったく同じです。これは、特に遠くの水平線を見るで例示されているような極端な歪みにおいて、ソース画像の領域を1ピクセルにスケールされた(そしてフィルタリングされた)マージを可能にするためです。このプロセスの詳細については、領域リサンプリングリサンプリングフィルタを参照してください。

可変ブラーマッピングで使用可能な楕円制御の例として、前に使用したのと同じグラデーションブラーマップを使用して黒い点を使用してみましょう。ただし、今回は円ではなく、長い細い水平楕円 '30x0' をスケールします。'x0' は奇妙に見えるかもしれませんが、基本的に垂直方向のぼかしは見られず、良好な結果を得るために必要な最小の高さを持つ楕円を意味します。


  magick -size 75x75 xc: -draw 'circle 36,36 36,8'  black_circle.gif
  magick black_circle.gif blur_map_gradient.gif \
          -compose blur -define compose:args=15x0 -composite \
          blur_horizontal.gif
[IM Output]  + [IM Output] ==> [IM Output]
ご覧のとおり、ブラーの量は提供されたマップ画像で依然として変化しており、画像の上部では非常に小さなブラーを生成し、下部では大きなブラーを生成します。しかし、下端は水平方向に両方向に均等にぼかされていますが、垂直方向にはぼかされておらず、垂直方向にシャープなカットオフが生成されています。3番目の角度引数を指定して長い細い楕円を回転させるか、垂直楕円を直接定義することで、画像を垂直方向のみにぼかすことができます...

  magick black_circle.gif blur_map_gradient.gif \
          -compose blur -define compose:args=0x15 -composite \
          blur_vertical.gif
[IM Output]
ただし、ブラーは均等に適用されませんでした!上半分は下半分よりもぼやけて見えるのは、「マッピング画像」がそうするように指示したためです。これは、画像を歪めて、ブラー効果によって少し切り詰められたように見せます。最後に、これをもう1回行いますが、45度の角度で回転した水平楕円を使用します。

  magick black_circle.gif blur_map_gradient.gif \
          -compose blur -define compose:args=15x0+45 -composite \
          blur_angle.gif
[IM Output]
画像は非常に奇妙に見えるかもしれませんが、それは可変ブラーマップが垂直であるのにブラー自体が角度付きであるため、楕円の角度とブラーマップの角度が一致しないため、奇妙に見える効果が生成されるためです。
ただし、このような長い細い楕円を使用する方が、単一の大きな円を使用するよりもはるかに高速です。「-blur」演算子は、2つの独立した水平ブラーと垂直ブラーを使用して速度を取得しますが、「-gaussian」ブラー演算子は、まさに説明した'Blur'合成方法よりも単純な方法で、2次元畳み込みを実行します。

可変アスペクト比によるブラー

これまでのところ、ブラーに使用される楕円領域のサイズを「ブラーマップ」を使用して変えてきました。ただし、楕円のサイズや角度を回転させることはできますが、その形状と角度は固定されたままです。「ブラーマップ」は、赤、緑、青の3つのカラーチャンネルで構成される画像です。グレースケール画像を使用したため、3つのカラーチャンネルすべてに同じ値がありました。ただし、内部的には、楕円の幅は赤チャンネル値だけでスケールされ、高さは緑チャンネル値でスケールされます。青チャンネル値の効果は、後で詳しく説明する特別なケースを除いて、通常は無視されます。つまり、個々の赤と緑のチャンネルに異なるマップを使用することで、楕円形またはその「アスペクト比」を変えることができます。通常のブラーマップと同様に、ゼロ(またはそのチャンネルの「黒」)値は最小の幅または高さを生成し、最大値(または「白」)は指定されたブラー量を生成します。たとえば、ここでは、画像の4分の2を水平方向にぼかす(赤チャンネルが最大)一方、他の領域を垂直方向にぼかす(緑チャンネルが最大)ように画像を分割できます。結合する前に、個別に幅と高さのマップを生成しました。単一の、そして今ではカラフルな「ブラーマップ」にします。通常の作業では、好きな方法でマップを作成したり、特定のブラー効果のために事前に準備されたマップを使用したりできます。

  magick -size 2x2 pattern:gray50 -sample 75x75! blur_map_r.gif
  magick blur_map_r.gif -negate blur_map_g.gif
  magick blur_map_r.gif blur_map_g.gif -background black \
          -channel RG -combine blur_map_aspect.gif
  magick black_circle.gif blur_map_aspect.gif \
          -compose blur -define compose:args=10x10 -composite \
          blur_aspect.gif
[IM Output]  + [IM Output] ==> [IM Output]
[IM Output]  + [IM Output] ==> [IM Output]
もちろん、楕円に固定角度を設定することもできます。

  magick black_circle.gif blur_map_aspect.gif \
          -compose blur -define compose:args=15x15+45 -composite \
          blur_aspect_angle.gif
[IM Output]
IMバージョン6.5.8-8より前には、角度付きの垂直楕円ブラーの処理にバグが見つかりました。

可変角度によるブラー

これまでのところ、画像をぼかすために使用される楕円の角度は、画像全体で一定の角度でした。つまり、ブラーに使用される楕円の角度は常に同じでしたが、ブラーマップの赤と緑のチャンネルを変更することで楕円のアスペクト比を変えることができました。IM v6.5.8-8以降、ブラーマッピング画像の青チャンネルを使用して、ブラーに可変角度を指定できます。これは、ブラー引数に2つの角度を与えることで行われます。最初の角度引数は、青チャンネルのゼロ('0'または'黒')値の角度を定義するために使用され、2番目の角度は、青チャンネルの最大('QuantumRange'または'白')値を定義するために使用されます。角度値を1つだけ指定した場合、その角度を使用して、青チャンネルの「ブラーマップ」画像に存在する値に関係なく、ゼロと最大値の両方の角度が設定されます。これが、以前の例で角度が一定であった理由です。たとえば、ここでは水平方向にぼかす楕円を使用しますが、画像の中心を中心にして'+0'から'+360'の角度範囲で青チャンネルを使用して楕円の角度を変化させます。マップの生成には極座標グラデーションを使用しますが、その詳細は歪んだグラデーションにあります。そのグラデーションを青チャンネルに配置する場合、結合演算子を使用して "-background" カラー設定を使用し、赤と緑のチャンネルが最大値('白')に設定されていることを確認して、角度付きの楕円をスケールしないようにします。もちろん、これは最終的なマッピング画像では白が最大角度を意味し、黄色(または青チャンネル値がゼロ)が最小角度を意味することを意味します。

  magick -size 100x300 gradient: -rotate 90 \
          +distort Polar '36.5,0,.5,.5' +repage -flop gradient_polar.jpg
  magick gradient_polar.jpg -background white \
          -channel B -combine blur_map_angle.jpg
  magick koala.gif blur_map_angle.jpg \
          -compose blur -define compose:args=5x0+0+360 -composite \
          blur_rotated.jpg
[IM Output] ==> [IM Output]
[IM Output]  + [IM Output] ==> [IM Output]
結果はご覧の通り、回転ぼかしがかかった画像です。この結果を、使用されたぼかしマッピングと比較してください。画像の上部では、角度(勾配)が白または黒になっており、使用された引数から楕円が0度または360度に傾いていることを意味し、楕円は水平を保っています。下部では勾配が純粋な灰色であるため、指定された範囲の中間の角度、つまり180度が使用されています。これは、楕円が再び水平であることを意味します。しかし、画像のサイズでは、勾配が25%または75%の灰色でした。したがって、角度は90度または270度であり、楕円は垂直に回転します。他のすべての角度も同様に作用し、楕円は画像上で滑らかに回転します。しかし、結果画像の中央は非常に奇妙にぼやけています!これは、楕円のサイズが一定のままであり、画像の中央に向かって適切に小さくなっていないためです。解決策としては、赤と緑のチャンネルを使用して楕円のサイズも設定することです。例えば、

  magick -size 106x106 radial-gradient: -negate \
          -gravity center -crop 75x75+0+0 +repage gradient_radial.jpg
  magick gradient_radial.jpg gradient_radial.jpg gradient_polar.jpg \
          -channel RGB -combine blur_map_polar.jpg
  magick koala.gif blur_map_polar.jpg \
          -compose blur -define compose:args=10x0+0+360 -composite \
          blur_polar.jpg
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
[IM Output]  + [IM Output] ==> [IM Output]
はるかに良い結果が得られます。しかし、結果は良好に見えますが、真の回転ぼかし画像の場合のように、ぼかし楕円が適切に円弧状にカーブしていないことに注意してください。そのため、上記は真の回転ぼかしの近似値に過ぎません。しかし、ぼかし距離(ぼかし角度に相当)が小さい場合は、かなり良好です。回転ぼかしを行うより良い方法は、特別な極座標変換・逆変換歪み技法、または現在誤って名付けられている放射状ぼかし演算子を使用することです。楕円の角度(青チャンネル)に使用される角度範囲を変更することで、上記を容易に放射状ぼかしに変換でき、中心からの距離が大きくなるにつれてぼかしが強くなります。

  magick koala.gif blur_map_polar.jpg \
          -compose blur -define compose:args=5x0+90+450 -composite \
          blur_radial.jpg
[IM Output]
しかし、これらの放射状/回転ぼかし以外にも、画像全体で任意の量だけぼかしを回転およびスケーリングできます。完全に制御できます。たとえば、ぼかし楕円の角度と画像中心の周りの角度を一致させない異なる角度範囲を使用することで、非常に奇妙な2つの混合物を生成できます。

  magick koala.gif blur_map_polar.jpg \
          -compose blur -define compose:args=10x0+0+180 -composite \
          blur_weird.jpg
[IM Output]
基本的に、画像のどの部分をどのようにぼかすかを完全に制御できるようになりました。そして、テンプレートを使用することで、ぼかし効果のライブラリ全体を作成できます。