ImageMagick の例 --
画像変換

索引
ImageMagick の例 序文と索引
アート風の変換
コンピュータビジョン変換
シェーディングによる 3D ハイライト
FX(DIY 画像演算子)の使用
Evaluate と Function、高速 FX 演算子
グラデーションに対する数学演算
これらの操作は、視覚効果またはアート風の効果のために、画像全体の外観に大きな変化をもたらします。しかし、画像全体の見た目が劇的に変化したとしても、元の画像自体は通常、結果に依然として見えます。

アート風の変換

盛り上がった境界線または凹んだ境界線

-raise」演算子は、非常に単純な画像変換であるため、ほとんどそうではありません。これは、既存の画像に長方形のベベルハイライトを追加するだけです。

  magick rose: -raise 5  rose_raise.gif
[IM Output]
反転した凹んだ効果は、演算子の「プラス」形式を使用して生成できます…

  magick rose: +raise 5  rose_sunken.gif
[IM Output]
この演算子は、フレーミングのようなものですが、「-raise」演算子は、境界線として余分なピクセルを追加する代わりに、画像のエッジピクセルを再着色します。これにより、画像変換になります。
実際には、画像のフレーミングは、境界線を追加してから、それを盛り上げることで実現されます!
この演算子は長方形の画像でのみ機能し、透明な背景を持つ画像では失敗します。なぜなら、色の変更も透明になるからです。基本的に、これはかなり単純な演算子です!

内側の境界線を追加する

ユーザーは、画像の外側に境界線を追加するのではなく、画像のエッジにオーバーレイする境界線を追加したいと考えていました。解決策は、画像の周りに長方形を描画することでした。組み込みの rose in は 70x46 ピクセルであるため、これが結果です。

  magick rose: -fill none -stroke navy -strokewidth 11  \
          -draw 'rectangle 0,0 69,45'   inside_border.jpg
[IM Output]
追加される境界線の幅は、長方形の「-strokewidth」によって制御されます。つまり
{stroke width}  =  {border width} * 2 - 1
そのため、上記の 6 ピクセルの境界線には「-strokewidth」11 が必要です。画像のサイズがわからない場合は、画像をシェイブしてから、通常どおり境界線を追加できます。これはおそらくより簡単ですが、それほど多用途ではないかもしれません。

  magick rose: -bordercolor green -shave 6x6 -border 6x6 inside_border2.jpg
[IM Output]

ランダムなピクセル拡散

-spread」は、各ピクセルをソース画像からのランダムな近くの色の色で置き換えます。ピクセル補間仮想ピクセル設定の使用に従って、このランダムな選択が行われました。
例えば…

  magick -size 80x40 xc:red xc:blue -append -spread 5 spread_interpolated.png
[IM Output]
画像のピクセルを調べると、一部のピクセルに赤と青の色が混ざっていることがわかります。つまり、単純に拡散または交換されるのではなく、補間されています。これは、距離値が小さいほど顕著です。
また、「-spread」も仮想ピクセル設定を使用することに注意してください。

  magick -size 80x80 xc: -virtual-pixel black -spread 10 spread_virtual.png
[IM Output]
ご覧のとおり、主に純粋な黒の仮想ピクセルのランダムな境界線が得られます。ただし、画像の実際のピクセルと仮想ピクセルの間の境界から補間されたいくつかのグレーのピクセルもあります。より伝統的なピクセル拡散効果を得るには、「-interpolate Nearest」を使用して、特定のピクセルの色ルックアップを強制することで、この色の混合を防ぐことができます。仮想ピクセルと可能性のある「エッジカラーバイアス」の問題を回避するには、「-virtual-pixel Mirror」を使用することをお勧めします。そのため、これはより伝統的なランダムなピクセルの「拡散」です…

  magick rose: -interpolate nearest -virtual-pixel mirror \
                -spread 5   spread_rose.png
[IM Output]

建設中
上記の問題点は、画像から一部のピクセルデータが失われる可能性があることです。つまり、ピクセルは「交換」されるのではなくランダムにコピーされるため、画像内の特定のピクセルが複製または失われる可能性があります。IM v6.9.2-2 以降は、「+spread」を使用して画像内のピクセルを実際に交換できるため、画像内のピクセルは複製または失われません。元の画像のすべてのピクセルはまだ存在しますが、新しい位置に移動されています。ただし、ピクセルの処理方法により、ピクセルが「二重交換」される可能性があります。つまり、特定のピクセルが交換される可能性がありますが、後で別のピクセルと再度交換するように選択される可能性があります。つまり、特定のピクセルは、spread 引数によって要求されたよりもさらにドリフトする可能性があります。この二重交換は、ピクセルが右下隅に向かってさらに広がる可能性が高いことも意味します。もちろん、その動きはバランスが取れていますが、多数のピクセルが左上隅に向かってわずかにドリフトします。
たとえば、ここでは、参照として元の画像を先頭に付けてピクセルを拡散します。

  magick -size 40x40 xc:red xc:blue -append \
          \( +clone +spread 5 \) +append spread_bias.png
[IM Output]
一部の赤いピクセルは下方にさらに拡散していることに注意してください。ただし、予想以上に上方に拡散している青いピクセルもいくつかあります(ただし、画像の左側に向かって)。この問題は、拡散に小さい距離引数を使用する場合により顕著になります。この二重交換の問題に対する解決策は容易ではなく、「限定領域シャッフル」アルゴリズムを探しています。しかし、その間、少なくともトランスバース(左上から右下への対角線ミラー)歪みを使用して拡散を2回実行することで、方向バイアスを軽減できます。

  magick -size 40x40 xc:red xc:blue -append \
          \( +clone +spread 5 -transverse -spread 5 -transverse \) \
          +append spread_no_bias.png
[IM Output]
もちろん、これは拡散をより顕著にし、線形性を低下させますが、少なくとも方向バイアスやピクセルの複製/損失はありません。上記の追加は、フォーラムのディスカッションから開発されました:t=28043 IM フォーラムのディスカッション rearrange vertical pixel row

ヴィネット写真の変換

画像を柔らかなぼやけた輪郭を持つ円形にする特別な演算子。

  magick rose: -background black -vignette 0x5  rose_vignette.gif
[IM Output]
シグマをゼロ(または非常に小さい値)を使用することで、ぼかしを取り除き、楕円形または卵形のフレームを生成できます。ただし、可能な限り最大の楕円形は実際には使用されないため、DIYする必要がある場合があります。

  magick rose: -background black -vignette 0x0  rose_vignette_0.gif
[IM Output]
透過性(および PNG 形式)で使用できます…

  magick rose: -alpha Set -background none -vignette 0x3  rose_vignette.png
[IM Output]
別の引数方法は、2 番目のシグマコンポーネントに非常に大きな数値を使用し、最初の半径を使用してぼかしの広がりを定義することです。これは、より一般的なガウス分布ではなく、「線形」分布をヴィネットぼかしに生成します。

  magick rose: -background black -vignette 5x65000  rose_vignette_linear.gif
[IM Output]
画像にソフトエッジを生成する、より長方形のヴィネットのための別のテクニックは、ソフトエッジのサムネイルで示されています。

複雑なポラロイド変換

Timothy Hunter(RMagick の名声)が行った作業のおかげで、「-polaroid」変換演算子が IM v6.3.2 に追加されました。
Polaroid® は、Polaroid Corporation の登録商標です。
たとえば、ここでは、写真のサムネイルにポラロイドのような外観を与えています。この画像は、凱旋門内にあるらせん階段(下向き)、パリを見ています。非常に長い階段です!

  magick spiral_stairs_sm.jpg -thumbnail 120x120 \
          -bordercolor white -background black  +polaroid  poloroid.png
[IM Output]
結果の画像には半透明の影があるため、PNG 形式の画像を使用するか、GIF または JPG 形式で固定背景色に「-flatten」する必要があります。
この演算子は非常に複雑です。なぜなら、「-bordercolor」設定に従って境界線を追加し、紙を「カール」させ、影に逆カールを追加するからです。影の色は、「-background」色の設定で制御できます。上記のように、演算子のプラス形式は結果をランダムな量だけ回転させます。この演算子は、写真の索引を、そうでなければ得られるものよりもはるかに面白く、静的でないものにします。
演算子のマイナス形式を使用すると、画像の回転角度を制御できます。

  magick spiral_stairs_sm.jpg -thumbnail 120x120 \
          -bordercolor AliceBlue -background SteelBlue4 -polaroid 5 \
          poloroid_5.png
[IM Output]
画像に「-caption」メタデータがある場合、そのテキストも「caption:」画像作成演算子を介してポラロイドフレームの下部に追加されます。つまり、写真の幅に折り返されます。

  magick -caption '%c %f\n%wx%h' spiral_stairs_sm.jpg -thumbnail 120x120 \
          -bordercolor Lavender  -background gray40  +polaroid \
          poloroid_captioned.png
[IM Output]
他の標準的なテキスト設定(「caption:」に従って)を使用すると、追加されたキャプションの外観を制御できます。

  magick spiral_stairs_sm.jpg -thumbnail 120x120 -font Candice -pointsize 18 \
          -bordercolor Snow -background black -fill dodgerblue -stroke navy \
          -gravity center  -set caption "Spiral Stairs\!"  -polaroid 10 \
          poloroid_controls.png
[IM Output]
画像メタデータ属性「-caption」は、「caption:」テキストから画像へのジェネレータの内部使用のために使用されました。

一方、IM コマンド「montage」は「-label」を使用します。なぜなら、単語の折り返しを行わない「label:」テキストから画像へのジェネレータを使用するからです。
変換による回転せん断歪みの使用は、生成された画像のテキストに水平方向のぼやけた線を生じさせる傾向があります。これはよく知られた画像歪みの問題(細い線の回転を参照)であり、スーパーサンプリング技術を使用して解決できます。基本的に、実際には必要のない2倍の大きさでポラロイドを生成し、画像を最終的な通常のサイズにリサイズするだけです。画像サイズの縮小により、結果の画像、そしてより重要なことにキャプションテキストが効果的にシャープになります。ただし、これを機能させるには、最終サイズの少なくとも2倍の画像だけでなく、画像に大きな境界線が必要になる場合もあり、テキストを通常の「-density」の2倍で描画する必要があります。「-pointsize」を大きくしないでください。テキストはまったく同じ方法で拡大されません。

  magick -caption 'Spiral Staircase, Arc de Triumph, Paris, April 2006' \
          spiral_stairs_sm.jpg  -thumbnail 240x240 \
          -bordercolor Lavender -border 5x5   -density 144  \
          -gravity center  -pointsize 8   -background black \
          -polaroid -15     -resize 50%     poloroid_modified.png
[IM Output]
ご覧の通り、フォントサイズをはるかに小さくしても、キャプションテキストは非常にシャープでクリアで読みやすいです。元の画像にあったその他の細かいディテールについても同様です。唯一の欠点は、結果画像の影が小さくなり、ぼやけが少なくなることです。ポラロイド変換を完全に制御するには、すべてのステップを自分で実行できます。Tim Hunterのページに記載されている元のテクニック、RMagick Polaroid Effect。手順は次のとおりです。キャプションの作成と追加、ボーダーの追加、波状の画像のカーリング、反転したカーリングシャドウの追加、最後に画像の回転。その他の例やDIY方法については、Polaroid Thumbnail ExamplesおよびA Montage of Polaroid Photosを参照してください。RubbleWeb IM Examples, Otherにあるポラロイドの例にも興味があるかもしれません。

油絵、色の塊

"-paint" オペレーターは、キャンバスに厚い「ブロブ」状のペイントを適用することで、画像を絵画に変換するように設計されています。その結果、近隣のカラーがより大きな単色領域にマージされます。

  magick rose: -paint 1   rose_paint_1.gif
  magick rose: -paint 3   rose_paint_3.gif
  magick rose: -paint 5   rose_paint_5.gif
  magick rose: -paint 10  rose_paint_10.gif
  magick rose: -blur 0x3 -paint 10  rose_blur_paint_10.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] ==> [IM Output]
ペイントブロブの半径が大きいと、ブロブが四角く見え始めることに注意してください。この効果は、上記最後の画像に示すように、事前に画像をわずかにぼかすことで、ある程度スムーズにすることができます。これは興味深い効果であり、奇妙で素晴らしい背景画像を作成するために使用できます。例として、Background Examplesでの使用を参照してください。最後に警告します。"-paint"は単色の領域を生成することになっていますが、半径値が大きいと、一部の領域で垂直方向のグラデーションが発生する傾向があります。これは非常に厄介で、バグの可能性があります。ご存知の方はいませんか?"-paint"を使用する代替手段があります。1つは"-statistic Mode"を使用する方法です。これは、指定された長方形の近傍内の「主要な色」で各ピクセルを割り当て、より良い結果を得ることができます。

  magick rose: -statistic Mode 10 rose_paint_mode.gif
[IM Output]
もう1つの方法は、Morphology Methods、特にIntensity Variant for Color Imagesを使用することです。たとえば、バラに対する「OpenIntensity」モフォロジーを以下に示します。

  magick rose: -morphology OpenI Disk rose_paint_open.gif
[IM Output]
ここでは、「CloseIntensity」をわずかに小さい「ディスク」で使用しています。

  magick rose: -morphology CloseI Disk:2.5 rose_paint_close.gif
[IM Output]
「ディスク」を使用する必要はなく、作成されるブロブの独自の「ブラシ」形状のカーネルを設計できます。たとえば、対角線のブラシを使用してみましょう。

木炭画、シーンのアーティストスケッチ

チャコール効果は、指定された画像のアーティストによるチャコールスケッチをシミュレートすることを目的としています。"-charcoal"オペレーターは、Computer Visionで使用されるエッジ検出変換と、いくつかの点で似ています。基本的に、画像内のオブジェクトの主要な境界線とエッジを鉛筆とチャコールのシェードに変換しようとします。1つの引数は、エッジ線の太さを表すものとされています。

  magick rose: -charcoal 1   rose_charcoal_1.gif
  magick rose: -charcoal 3   rose_charcoal_3.gif
  magick rose: -charcoal 5   rose_charcoal_5.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
実際の画像に対するチャコール変換の使用例については、Charcoal Sketch of a Photoを参照してください。
技術的には"-charcoal"オペレーターは、元の画像のグレースケール変換に適用されたしきい値処理を含む"-edge"オペレーターです。

鉛筆スケッチ変換

"-sketch"オペレーターは、基本的に画像に線ストロークのパターンを適用して、芸術的な鉛筆スケッチのように見えるものを生成します。引数は、ストロークの長さと角度を制御します。ただし、明確な陰影のある大きな画像に適用するのが最適です。このオペレーターとその内部の動作方法の完全な例については、Pencil Sketchを参照してください。

エンボス加工、金属的な印象の作成

"-emboss"オペレーターは、金属シート上のグレースケール画像の酸による印象の効果を生成しようとします。下記で説明する"-shade"オペレーターと多くの点で非常に似ていますが、3Dに見えるエッジはありません。その引数は半径/シグマであり、シグマのみが重要です。引数はあまり役に立たず、実際にはバグがある可能性があります。また、最近のIMバージョンで引数が変更されました。何が起こっているのかわかりません。お分かりになる方がいらっしゃいましたら、ご教示ください。

  magick rose: -emboss 0x.5  rose_emboss_0x05.gif
  magick rose: -emboss 0x.9  rose_emboss_0x09.gif
  magick rose: -emboss 0x1   rose_emboss_0x10.gif
  magick rose: -emboss 0x1.1 rose_emboss_0x11.gif
  magick rose: -emboss 0x1.2 rose_emboss_0x12.gif
  magick rose: -emboss 0x2   rose_emboss_0x20.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
このオペレーターはグレースケールオペレーターであるため、3つのカラーチャネルに個別に適用されます。そのため、グレースケール画像にのみ適用する必要があります。上記のように、カラー画像では奇妙な効果が発生する可能性があります。

  magick rose: -colorspace Gray  -emboss 0x.5  rose_g_emboss_0x05.gif
  magick rose: -colorspace Gray  -emboss 0x.9  rose_g_emboss_0x09.gif
  magick rose: -colorspace Gray  -emboss 0x1   rose_g_emboss_0x10.gif
  magick rose: -colorspace Gray  -emboss 0x1.1 rose_g_emboss_0x11.gif
  magick rose: -colorspace Gray  -emboss 0x1.2 rose_g_emboss_0x12.gif
  magick rose: -colorspace Gray  -emboss 0x2   rose_g_emboss_0x20.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
 If anyone knows exactly what the emboss algorithm is supposed to do,
please let me know.

ステガノグラフィ:画像の中に秘密の画像を隠す

"-stegano"オペレーターは、実際にはどちらかというと「楽しい」オペレーターです。たとえば、スパイがランダムな画像の「カオス」の中に情報を隠すために使用できます。まず警告を…
JPEG、GIF、またはその他の「可逆圧縮ではない」画像エンコーディングをステガノグラフィで使用しないでください。
例として、仲間のスパイに送信したい暗号化されたメッセージ(画像)を生成してみましょう…

  magick -gravity center -size 50x40 label:"Watch\nthe\nPidgeon" message.gif
  magick identify message.gif
[IM Output]
[IM Text]
メッセージ画像のサイズ(36x43ピクセル)も必要になるため、上記で識別します。次に、オフセットのある画像に配置します。使用されるオフセット(およびメッセージサイズ)は、隠されたメッセージの暗号化「キー」です。

  magick composite message.gif rose: -stegano +15+2  rose_message.png
[IM Output]
これで、その画像を仲間のスパイに送信できます。仲間のスパイは、メッセージのサイズとオフセットを既に知っているはずです。画像に隠されたメッセージを復元できます…

  magick -size 50x40+15+2 stegano:rose_message.png message_recovered.gif
[IM Output]
コンテナ画像が大きいほど、復元された画像が良くなります。そのため、小さな画像を大きな画像に隠す方が、上記で示した例よりも優れています。隠されたメッセージがコンテナ画像全体にどのように分散されているかを示すために、組み合わせた画像と元の画像を比較してみましょう。

  magick compare -metric PAE rose: rose_message.png   rose_difference.png
[IM Output]
[IM Text]
これにより、メッセージ画像がどのように暗号化され、コンテナ画像全体に分散されて隠されたかがわかります。また、上記で返された「PAE」メトリックは、最大の差が、この画像で使用されている8ビットカラー値のうち1つのカラー値のみであったことを示しています。つまり、非常に小さいです。画像の小さな変更や修正で、内部に隠されたメッセージが破壊されるほど小さいです。違いが小さいため、可逆圧縮ではない圧縮(GIFを含む)を使用するJPEGを画像形式として使用することはできません。また、「オフセットキー」が間違っていると、メッセージを取得できません…

  magick -size 50x40+14+2 stegano:rose_message.png message_bad.gif
[IM Output]
Region設定を使用して、メッセージを隠す画像の領域を制限することもできます。メッセージの復元を試行する場合にも、同じ設定が必要になります。これにより、特に「混雑した」領域に制限されている場合、大きな画像内の隠されたメッセージの検索と復号が、はるかに困難になる可能性があります。ただし、これは暗号学的に非常に安全な手法ではないことに注意してください。特に、元のソース画像も利用可能な場合。画像の周波数分析により、攻撃者は通常、隠されたメッセージがあることを知ることができます。Stegano Operatorは、画像のわずかな変更でメッセージが破壊され、その有効性が失われるため、画像の著作権保護の方法としても役に立ちません。スパイツールとしても、妥当なサイズの画像に対して「組み合わせ」の数が非常に少ないため、あまり優れていません。何をしようとしているのかおおよそ知っている人は、おそらくすぐに解読できるでしょう。よく知られ、時間をかけてテストされた暗号化方法を使用する方が良いでしょう。唯一の実用的な用途は、楽しいツールとして、または既存の画像に非常に少量のノイズを追加する方法としてです。

画像データの暗号化

"-encipher"および"-decipher"オペレーターは、基本的に画像データを解読できない状態に暗号化します。つまり、画像の内容自体は、後で復号されるまでまったく認識できなくなります。これは、たとえば、公開サービス上の機密画像を保護するために使用できます。機密のパスフレーズを持つ他のユーザーのみが後で表示できるようになります。しかし、まず警告を…
JPEG、GIF、またはその他の「可逆圧縮ではない」画像エンコーディングを暗号化で使用しないでください。
例として、上記で作成した秘密のメッセージ画像を、それほど「秘密」ではないファイル"pass_phrase.txt"に保存したパスフレーズを使用して暗号化してみましょう。

  magick message.gif    -encipher pass_phrase.txt  \
          -depth 8 png24:message_hidden.png
[IM Output] ==> [IM Output]
暗号化された画像は、8ビット画像ファイル形式を使用して保存されていると想定しています。そのため、出力ファイルへの最終的な保存の前に"-depth 8"を設定して、その制限を適用することをお勧めします。

"png24"も上記で必要であり、出力ファイルがパレットまたはカラーマップされた"png8:"画像にならないようにします。これも正しく動作しません。
ご覧の通り、結果の画像は、画像の実際の内容を示すことなく、完全に無意味に見えます。これで、その画像をWeb上に公開でき、正確な元のパスフレーズを知っているユーザーだけが画像データを復元できます…

  magick message_hidden.png -decipher pass_phrase.txt message_restored.gif
[IM Output]
ただし、画像データが何らかの方法で破損している場合、復元できないことに注意してください。グレースケール画像形式タイプを使用して保存されたPNGも含まれます。そのため、PNG、MIFF、TIFF、またはPixel Enumeration Textなど、可逆圧縮の画像形式のみを使用できます。ただし、JPEG、PNG8、GIFなどの可逆圧縮ではない画像形式を使用すると、画像データが破損し、暗号化の結果が破壊されます。画像を記述している可能性のあるメタデータは、引き続きクリアな状態であることに注意してください。つまり、画像自身の「コメント」文字列をパスフレーズとして使用したり、より小さなパスワードを使用して暗号化されたコメントを使用したりできます。これは、パスフレーズをより多様化できる簡単なアイデアです。画像の暗号化は、単なる1つのステップです。結果をもう少し進めると、追加の処理を行わないと復号できない画像を作成できます。たとえば、ここではSimple Non-Destructive Distortsを使用して、通常の方法で画像を復号しようとする人を混乱させます。

  echo "password" | magick message.gif -encipher - \
                      -transpose  -depth 8   png24:message_obfuscate.png
  echo "password" | magick message_obfuscate.png -transpose \
                      -decipher -  message_restored_2.png
[IM Output] ==> [IM Output] ==> [IM Output]
上記の復号化コマンドに"-transpose"を含めていない場合、画像は正しく復号されません。また、使用されているストリーム暗号(以下の専門家のメモを参照)のために、何らかの"-roll"を使用しても、少なくとも部分的には画像の復号化を防ぐことはできません。上記では、パスフレーズを保持するファイルを使用せず、標準入力を使用して"magick"コマンドにフレーズを入力しました。これにより、テキストファイルにパスフレーズをクリアに書き込む代わりに、別のプログラムまたはコマンドを使用してユーザーからフレーズを取得したり、生成したり、その他の方法を使用したりできます。パスフレーズは、他の自由にダウンロードできるファイルや画像からも生成できます。たとえば、よく知られており、自由にダウンロードできる参照画像の署名またはコメント文字列を使用して画像を復号化できます。たとえば、ここでは"rose.gif"画像の署名を使用して"message.gif"画像を暗号化し、後で復号化します。

  magick identify -format %# rose.gif |\
    magick message.gif  -encipher - -depth 8    png24:message_signed.png
  magick identify -format %# rose.gif |\
    magick message_signed.png   -decipher -   message_restored_3.png
[IM Output]  + [IM Output] ==> [IM Output]  + [IM Output] ==> [IM Output]
IM v6.4.8-0以降、"-encipher"および"-decipher"で使用されるファイルはバイナリファイルにすることができます。そのため、画像自体をパスフレーズとして直接使用することもできます。

  magick message.gif   -encipher rose.gif  -depth 8  png24:message_binary.png
  magick message_binary.png   -decipher rose.gif   message_restored_4.png
[IM Output]  + [IM Output] ==> [IM Output]  + [IM Output] ==> [IM Output]
IM v6.4.8-0より前は、バイナリファイルは最初に見つかった「NULL」文字で停止していました。PNG画像を使用した場合、これはかなり早く発生します。
このテクニックは正確です(伝送中にデータの一部が破損していない限り)。そのため、ステガノ画像などの他の隠された情報を含む画像を暗号化するために使用できます。つまり、当局が画像を復号化したり、パスワードの開示を強制したりしても、実際の画像が表示されますが、その画像は最終的な隠された画像ではない可能性があります。
"-encipher"および"-decipher"演算子はIM v6.3.8-6に追加されましたが、ビルド構成に"--enable-cipher"オプションを含める必要がありました。しかし、IM v6.4.6(いつ変更されましたか?)では、この構成項目は不要になり、標準の構成設定になりました。そのため、おそらくすぐに使用できます。
暗号化は、ブロック暗号から実装された自己同期ストリーム暗号を使用して実装されました。

これは、画像の一部が破損していても、伝送エラーによって破損した画像の部分的なダウンロードでも復号化できることを意味します。また、復号化して正常にダウンロードされた部分を確認するために、画像全体をダウンロードする必要もありません。

しかし、非常に強力な暗号化であるため、画像を正常に復号化する可能性があるには、パスフレーズが必要です。

画像のピクセル化

画像のピクセル化は、基本的に画像を大きな色の「ピクセル」の集合に変換して、元の画像のぼんやりとした輪郭のみを表示するために使用されます。どちらの手法も、画像の縮小(ピクセルの数を減らすため)、次に「ピクセルブロック」を作成するように拡大するという手順を伴います。スケーリング演算子またはサンプリング演算子のいずれかを使用して色のブロックを生成します。色の決定方法は、画像の縮小方法によって異なります。単一ピクセルサンプリング、またはマージされた平均色です。

  magick rose: -sample 25%  -scale 70x46\!  rose_pixelate_sampled.gif
  magick rose: -scale  25%  -scale 70x46\!  rose_pixelate_scaled.gif
  magick rose: -resize 25%  -scale 70x46\!  rose_pixelate_resized.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
ご覧のとおり、「サンプリングされた」領域ははるかに明確な(エイリアシングされた)「ピクセル」を持ちますが、他の2つの手法はマージまたは平均化された色を使用するため、より落ち着いた、より正確な色の表現が各「ピクセル」で生成されます。人の顔など、画像の小さなマスクされた領域にこれを使用する例については、個人の匿名性を保護するも参照してください。

ピクセルのグリッド

グリッド化された画像は、ピクセル化された画像と非常に似ています。この場合、画像を拡大して、画像の詳細の明確なピクセルレベルのビューを生成したいと考えています。通常は非常に小さな画像です。最も簡単な方法は、前の例のように、小さな画像を拡大縮小してピクセルを拡大することです。

  magick rose: -crop 10x10+12+20 +resize  grid_input.png
  magick grid_input.png  -scale  1000%  grid_scale.png
[IM Output] ==> [IM Output]
単純なスケーリングの問題は、ピクセルが似た色である領域では、個々の「ピクセルブロック」を見ることが困難になる可能性があることです。ピクセルを分離するために、ピクセルの周りに境界線を追加する必要があります。そのためには、生成されたタイルマスクを重ね合わせる必要があります。生成されたタイリング画像を1つのコマンドで使用する方法については、メモリ内にある画像を使用したタイリングを参照してください。
ここでは、スクリーン合成(白を重ね合わせ、黒い領域はそのままにする)を使用して重ね合わせた白黒の「グリッド」を生成します。

  magick -size 10x10 xc: -draw 'rectangle 1,1 9,9' -write mpr:block +delete \
          grid_input.png -scale 1000% -size 101x101 tile:mpr:block \
          +swap -compose screen -composite grid_blocks.png
[IM Output]
タイルを生成するために使用されるサイズはscale*image_size+gap_size(この場合は10*10+1 => 101)であることに注意してください。また、最終的な画像サイズが縮小された画像(サイズが1ピクセル小さい)ではなく、タイル画像から取得されるように、2つの画像を入れ替えました。ただし、タイル画像を宛先として使用したため、元の画像にあった画像メタデータが失われる可能性があります。
ここでは、円形の色の「スポット」を生成しますが、今回は乗算合成(黒を重ね合わせ、白い領域はそのままにする)を使用しました。

  magick -size 10x10 xc: -draw 'circle 5,5 1,3' -negate \
               -write mpr:spot +delete \
          grid_input.png -scale 1000% -size 101x101 tile:mpr:spot \
          +swap -compose multiply -composite grid_spots.png
[IM Output]
タイルオーバーレイを反転させて(黒い領域が透明になる)CopyOpacity合成乗算の代わりに使用することで、グリッドの境界線を透明にすることができます。他の色も追加できますが、これを実現するには、実際に本当の透明度を含むタイル画像を使用する必要があります。そのためには、白黒のタイル画像をシェイプマスクに変換する必要があります。
たとえば、ここでは基本的な形態演算子を使用して、色のオーバーレイにひし形の形をした「穴」を生成します。そのためには、ダイヤモンド形態カーネルを使用して、単一の「シード」ピクセルを描画して展開します。

  magick -size 10x10 xc: -draw 'point 5,5' -morphology Erode:4 Diamond \
          -background Navy -alpha shape -write mpr:diamond +delete \
          grid_input.png -scale 1000% -splice 1x1+0+0 \
          -size 101x101 -background none tile:mpr:diamond \
          -alpha set -compose Over -composite grid_diamonds.png
[IM Output]
"tile:"コーダーは、画像内の透明度を現在の背景色で置き換えることに注意してください。タイリング画像の透明度を保持する場合は、「-background none」または「-compose Src」を設定します。前者の方が簡単です。
技術的には、アルファシェーピングは、タイル画像の保存前でも、タイル画像のタイリング後、オーバーレイ前にでも実行できます。選択はあなた次第です。最終的な手法の1つは、悪いリサンプリングフィルタを使用してリサンプリングエラーを生成し、各ピクセルのエイリアシングされた円を生成することです。これは優れた手法ではありません(画像処理エラーの誤用)が、ピクセルのグリッドを形成します。

タイルの間隔をあける

同様の問題として、画像内のタイルグリッドの間隔があります。これは、個々のピクセルを「ピクセルブロック」に単純に拡大縮小するのではなく、画像の矩形領域の間にスペースを挿入することです。つまり、画像に一定の間隔で余分なピクセルを挿入することです。現在、最適な解決策は、画像を行と列に分割し、各タイルに余分な間隔を挿入してから、タイルを連結することです。例を以下に示します。

  magick rose: -background SkyBlue \
          -crop 10x0 +repage -splice 3x0 +append \
          -crop 0x10 +repage -splice 0x3 -append \
          grid_tile.png
[IM Output] ==> [IM Output]
これは、元の画像をタイルに分割する別の方法でもありますが、タイルの新しい位置を古い位置から計算するDIY FX式を使用します。

  magick rose: -crop 10x10 \
          -set page '+%[fx:page.x+3*page.x/10]+%[fx:page.y+3*page.y/10]' \
          -background skyblue -layers merge +repage  grid_tile_fx.png
[IM Output]
上記の「3」は追加するギャップ幅、「10」はタイルサイズです。必要なのは、結果に境界線またはその他のエッジを追加することだけです。もう少し工夫すれば、上記のグリッド内の各タイルの位置にランダムな「ジッター」を追加して、規則性のない効果を得ることもできます。これらの手法の問題点は、大量の小さな画像を生成して、それらを再び結合すると、多くの作業が発生することです。特に、非常に小さなタイルサイズの場合。提案されているより良い方法は、IMフォーラムのディスカッションSplice (adding tile gridding gaps)Splice演算子への特別な拡張です。

コンピュータビジョン変換

エッジ検出

"-edge"演算子は、画像内の色のグラデーション領域を強調表示します。グレースケール演算子であるため、3つのカラーチャネルそれぞれに個別に適用されます。

  magick mask.gif -edge 1   mask_edge_1.gif
  magick mask.gif -edge 2   mask_edge_2.gif
  magick mask.gif -edge 3   mask_edge_3.gif
  magick mask.gif -edge 10  mask_edge_10.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
ご覧のとおり、エッジは、50%以上の白の色のグラデーション領域のみに追加されます!これはバグなのか意図的なものなのかわかりませんが、上記のエッジが元のマスク画像の白い部分にほぼ完全に位置していることを意味します。"-edge"演算子の結果を使用する場合、この事実は非常に重要になる可能性があります。たとえば、黒い輪郭を含む画像のエッジ検出を行っている場合、「-edge」演算子は黒い線を「二重化」して、奇妙な結果を生成します。

  magick piglet.gif  -colorspace Gray  -edge 1 -negate  piglet_edge.gif
[IM Output] ==> [IM Output]
ただし、エッジ検出を行う前に画像を反転させると、二重化された線は内側に移動して結合され、「二重線」効果が除去されます。

  magick piglet.gif -colorspace Gray \
                 -negate -edge 1 -negate    piglet_edge_neg.gif
[IM Output]
エッジは鋭すぎる傾向があり、結果の画像に滑らかではないエッジが生成されることがわかりました。そのため、結果に非常にわずかなぼかしを適用すると、見た目がかなり向上することがわかりました。

  magick piglet_edge_neg.gif  -blur 0x.5  piglet_edge_blur.gif
[IM Output]
ここでは、カラー画像とグレースケールバージョンにエッジ検出を適用して、写真のような画像への効果を示しています。

  magick rose:                  -edge 1  rose_edge.gif
  magick rose: -colorspace Gray  -edge 1  rose_edge_grey.gif
[IM Output] [IM Output]
ご覧のとおり、画像をグレースケールに変換しないと、異なるカラーチャネルのエッジは互いに完全に独立して生成されます。

Canny エッジ検出器

IM v6.8.9-0では、IMはCannyエッジ検出器をサポートするようになりました。(IMフォーラムの発表例を参照)。これは非常に高度なエッジ検出アルゴリズムであり、ノイズ干渉が非常に少ない、非常に強力な(バイナリ)1ピクセル幅の線をすべての鋭いエッジに生成します。たとえば、ここでは、上記で使用したテスト画像に適用します。

  magick mask.gif           -canny 0x1+10%+30%  mask_canny.gif
  magick piglet.gif         -canny 0x1+10%+30%  piglet_canny.gif
  magick piglet.gif -negate -canny 0x1+10%+30%  piglet_canny_neg.gif
  magick rose:             -canny 0x1+10%+30%  rose_canny.gif
[IM Output] ==> [IM Output]
[IM Output] [IM Output] [IM Output]
ご覧のとおり、上記のエッジ演算子よりもはるかに鮮明な結果が生成されます。ファジーなアンチエイリアシングされたエッジは、薄いビットマップ線を生み出す結果にほとんど影響を与えません。また、子豚の画像が示すように、以前のエッジ演算子が行ったように、特定の側に配置されているわけではありません。その結果、入力画像を反転させても効果はありません。しかし、すべてのエッジ検出器と同様に、組み込みのローズ画像など、「忙しい」背景を持つ現実世界の画像では問題が発生する可能性があります。このクリーンな結果は、後のハフ線検出で非常に重要です。

アンチエイリアシングされた形状からのエッジ輪郭

通常のエッジ検出方法の最大の課題は、結果が非常にエイリアシングされていることです。つまり、形状が滑らか(アンチエイリアシング)であるかエイリアシングされているかに関係なく、非常に階段状のピクセル効果を生成します。たとえば、ここでは、滑らかなアンチエイリアシングされた吹き出し(「WebDings」フォントの文字「(」)を示します。

  magick -size 80x80 -gravity center -font WebDings label:')' voice.gif
[IM Output]
そして、これがそのエッジ検出された画像です…

  magick voice.gif -edge 1 -negate   voice_edge.gif
[IM Output]
ご覧のとおり、エッジの外側にわずかなアンチエイリアシングがあり、線の内側に完全なエイリアシング(階段状)の外観があるため、ひどいように見えます。画像を反転させると、画像の外側に似た輪郭が生成されましたが、線よりも外側に強いエイリアシングがあります。

  magick voice.gif -negate -edge 1 -negate   voice_edge_negate.gif
[IM Output]
アンチエイリアシングされたエッジのある画像を既に持っている場合の代替手段は、元の形状の「ジッター」クローンとの差分画像を生成することです。たとえば、ここでは、元の画像と、右に1ピクセルオフセット(またはジッター)された画像との差分画像を探します。

  magick voice.gif \( +clone -roll +1+0 \) -compose difference -composite \
          -negate   voice_jitter_horiz.gif
[IM Output]
これにより、水平傾斜のエッジには良いエッジが生成されないことに注意してください。ただし、水平方向と垂直方向の両方のジッター差分画像を組み合わせることで、形状の非常に優れたアンチエイリアシングされた輪郭を取得できます。

  magick voice.gif \
          \( -clone 0 -roll +1+0 -clone 0 -compose difference -composite \) \
          \( -clone 0 -roll +0+1 -clone 0 -compose difference -composite \) \
          -delete 0  -compose screen -composite -negate  voice_jitter_edge.gif
[IM Output]
この手法には、マスクが反転されているかどうかに関係なく機能するという利点もあります。ただし、結果は元の画像に対して1/2ピクセルのオフセットがあるため、目的の結果を得るために元の形状または輪郭のいずれかを再調整するには、さらに「歪み」処理が必要になる場合があります。

ビットマップ形状からのエッジ輪郭

ビットマップ画像は、滑らかな輪郭を作成するために使用できるアンチエイリアシングされたピクセルがないため、はるかに困難です。たとえば、ここでは、「WebDings」フォント(文字「Y」)から抽出された凝った「ハート」の形状を示します。ただし、ネットワークからダウンロードされたひどいビットマップ画像をシミュレートするために、意図的にエイリアシングされたビットマップとして生成しました。透明度を含むGIF画像の輪郭などです。

  magick +antialias -size 80x80 -gravity center \
          -font WebDings label:Y   heart.gif
[IM Output]
ひどい画像がありますが、形状ではなく輪郭を見つけたいと考えています。エッジ検出を直接使用すると、ビットマップ形状の外側に純粋なビットマップエッジのみが生成されます。

  magick heart.gif -edge 1 -negate   heart_edge.gif
[IM Output]
エッジを反転させると、黒い領域の内側のエッジ画像が生成されます。

  magick heart.gif -negate -edge 1 -negate   heart_edge_negate.gif
[IM Output]
上記2つを組み合わせると、ビットマップ形状のエッジを中心とした2ピクセルのエッジが得られます。

  magick heart.gif \( +clone -negate \) -edge 1 \
          -compose add -composite  -negate  heart_edge_double.gif
[IM Output]
ご覧のように、結果の画像は、元の画像自体はこの点でそれほど悪くないにもかかわらず、輪郭に「階段状」の効果のある高度にエイリアシングされたものになっています。これは良い解決策ではありません。「EdgeIn」形態学的方法、または同様のものを用いることで、わずかに優れたエッジを作成できます。

  magick heart.gif  -negate -morphology EdgeIn Diamond -negate heart_edgein.gif
[IM Output]
また、適切な方法でエッジをぼかすためにリサイズを使用し、次にSolarizeを使用してエッジを形成する中間グレーのピクセルを抽出することで、同様の効果を得ることができます。「-filter Cubic」設定、またはその他のリサンプリングフィルターを追加することで、より太いエッジを生成できます。

  magick heart.gif -resize 400% -resize 25% \
          -solarize 50% -evaluate multiply 2 -negate heart_resize.gif
[IM Output]
より制御されたぼやけた効果を得るには、形状をぼかして同様の方法でエッジを抽出するだけです。「0.7」のぼかしが最適であり、処理速度を上げるために3ピクセルの制限を設定しています。

  magick heart.gif -blur 3x.7 -solarize 50% -level 50%,0 heart_blur.gif
[IM Output]
レベル演算子の使用に注意してください。これは、前の例で使用されている「-evaluate multiply 2 -negate」と同等です。アンチエイリアシングされた境界線を使用すると、元の形状を滑らかにしたいだけであれば、元の形状を再追加できます。輪郭は元の画像のエッジに正確に位置しているため、前の例よりも0.5ピクセル大きくなることに注意してください。形状(アンチエイリアシングまたはビットマップ)からアンチエイリアシングされた輪郭を生成する他の方法をご存知でしたら、メールまたはIMフォーラムでお知らせください。クレジットいたします。

ラスタからベクターへのコンバーターを使用したエッジ処理

最も理想的な解決策の1つは、非IMの「ラスタからベクターへの」変換プログラムを使用して、このビットマップ形状をベクター輪郭に変換することです。これを実行できるプログラムには、「ScanFont」、「CorelTrace」、「AbobeのStreamline」、および「Vector Magic」などがあります。ただし、これらのほとんどは、少なくともいくらかのお金がかかります。「VectorMagick」および別のトレースプログラム「AutoTracer」には、無料で使用できるオンライン画像コンバーターがあります。その他の無料の解決策としては、「AutoTrace」または「PoTrace」などがあります。さらにご提案いただければ幸いです。これらのトレースプログラムは使い方は簡単ですが、通常はなんらかの前処理と後処理が必要です。入力形式は限られており、ベクター画像を出力するため、入力画像の「スムージングされた」形式が作成されます。「AutoTrace」の方が、結果のSVGデータをスケーリングしないため、標準的な線幅が生成されますが、「パイプライン」で使用することはできません。最適な結果を得るには、しきい値処理によって入力画像を基本的なビットマップ画像にして、Autotraceが認識する画像形式に変換することをお勧めします。その後、その画像をSVGベクター画像に変換できます。

  magick heart.gif -colorspace gray -threshold 50% heart_tmp.pbm
  autotrace -output-format svg -output-file heart.svg heart_tmp.pbm
  magick heart.svg heart_svg.gif
  rm -f heart_tmp.pbm
[IM Output] ==>
[IM Text]
==> [IM Output]
IM v6.4.2-6以降、「autotrace:」画像入力デリゲートを使用して、上記のシーケンスを直接実行できます。これには、「autotrace」コマンドがインストールされている必要があります。たとえば

  magick autotrace:heart.gif  heart_traced.gif
[IM Output]
IMが「AutoTrace」デリゲートライブラリを使用してビルドされている場合、IMはメモリ内の画像からSVG画像を直接生成することもできます。これの詳細については、SVG出力処理を参照してください。例として...

  magick heart.gif  heart_2.svg
[IM Text]
SVG出力は、もちろん元の画像のスムージングされたバージョンを表しており、この例では実際に必要なものではありません。しかし、これでビットマップの形状がベクター形式で得られたため、SVGの「style」属性を調整して、形状を「fill」するのではなく、輪郭を「stroke」するだけで済みます。修正されたSVGをImageMagickに再度入力して、クリーンな輪郭ラスタ画像を再作成できます。例として...

  cat heart.svg |
    sed 's/"fill:#000000[^"]*"/"fill:none; stroke:black;"/' |
      magick svg:- heart_outline.gif
[IM Output]
少し面倒ですが、滑らかなアンチエイリアシングされた結果は努力に見合う価値があります。「autotrace」コマンド自体にオプションとして輪郭またはその他の修正を指定できれば理想的ですが、現時点では機能していません。SVG出力をさらに変更してエッジを太くしたり、その他のストロークや背景色を指定したり、ベクターエッジ形状の塗りつぶしの色を変更したりすることもできます。たとえば、ここでは、すべてきれいにアンチエイリアシングされた、形状のより太い輪郭を赤い塗りつぶしで生成します。

  cat heart.svg |
    sed 's/"fill:#000000;[^"]*"/"fill:red; stroke:black; stroke-width:5;"/' |
        magick svg:- heart_outline_thick.gif
[IM Output]
これほど完璧なハートは、他の方法ではビットマップ形状から生成できません。「d="..."」パス要素を抽出して、SVGパス文字列として描画コマンドで直接使用することもできます。これにより、そのベクター輪郭で他のIM描画設定を使用できるようになり、最終結果を完全に制御できます。「AutoTrace」プログラムの別の例については、Autotraceを使用したスケルトンを参照してください。

ハフ直線検出器

ハフ線検出器(IM v6.8.9-1に追加された「-hough-lines」)は、多くの段階を含む非常に複雑な変換です(詳細については、Wikipedia、ハフ変換を参照)。基本的に、画像を調べ、黒い背景上の白い線を検出し、画像に存在する線分(線形シーケンスピクセル)の正確な位置を返すように設計されています。これは、画像の回転の削除や、画像の透視変換の決定(繰り返したり削除したりできる)などにとって非常に重要になる可能性があります。演算子のオプションの完全なセットを以下に示します。

  -background {background} -stroke {line_color} -hough-lines {W}x{H}+{threshold}
色(背景線の色)は、結果画像の線の色を設定するために使用されます(実際に線を描画する場合)。ハフ演算子の引数(W}x{H}+{しきい値)は、中間「検索画像」で「ピーク」を見つけるために使用されるフィルターのサイズとしきい値を定義するために使用されます。つまり、実際に検出しようとしている線をどの程度うまく「検出」するかを制御します(下記を参照)。これらを調整して、線検出を支援します。たとえば、長方形の画像の線を検出してみましょう。まず、線を強調するために画像を簡素化し、明確な結果を得るためにCannyエッジ検出器をお勧めします。

  magick shape_rectangle.gif -canny 0x1+10%+30% rectangle.gif
[IM Output] ==> [IM Output]
では、この画像にハフ線検出器を適用してみましょう。

  magick rectangle.gif -background black -stroke red \
          -hough-lines 5x5+20   rectangle_lines.gif
[IM Output]
ご覧のように、5本の線が検出され、そのうち2本は非常に接近しています。余分な線がある理由は、画像の長方形が完璧ではないためです。ラスタ(GIF)画像の結果を表示していますが、ハフ演算子は実際にはMagickベクターグラフィックス形式でベクター画像を生成します。つまり、さらなる処理のために線情報を一覧表示できます。

  magick rectangle.gif -background black -stroke red \
          -hough-lines 5x5+20   rectangle_lines.mvg
[IM Text]
線は、(浮動小数点値で)画像の一方のエッジからもう一方のエッジまで描画されます。これにより、2番目と3番目の線が接近していることがわかります。MVG出力のコメントには、線が画像で「ヒット」する累積ピクセル数が示されており、画像内の線の強さを示す良い指標となります。この値は、常に「-hough-line」演算子に指定したしきい値よりも大きくなります。これにより、最初と最後の線(非常に近い一致)はどちらも強さがほぼ等しいことがわかるため、一方を他方よりも選択することは困難です。このような状況が発生した場合は、エッジ検出ステップを改善することをお勧めします。MVG画像は、定義された色がありません。この例の色設定は実際には使用されませんでした。色は、前の例のように結果を「ラスタ」画像に変換するときにベクトルを実際に「描画」する場合にのみ使用されます。
特殊なdefineを使用して、中間「検索画像」または「アキュムレータ」も表示できます。これは、すべての向きで白いピクセルを探しています。

  magick rectangle.gif \
          -define hough-lines:accumulator=true -hough-lines 5x5+20 \
          -delete 0 -contrast-stretch 0.1% rectangle_accumulator.gif
[IM Output]
defineは、「検索画像」を画像結果に追加するだけで、この場合は削除します。また、「累積値」にコントラストを適用して、より見やすくしました。これは、ハフ検出器の引数が検索している画像です。この画像は常に幅180ピクセル(線の角度ごとに1ピクセル)であり、高さは画像の対角線の長さの2倍です。したがって、ピークの位置は、線の角度と、入力画像の中心点に対する線の垂直距離を直接定義します。つまり、X座標は角度(度)、Y座標は対角線距離から+対角線距離までの中心からの距離です。右下のピークをよく見ると、1本の線ではなく2本の線になった理由がわかります。ここでのピークは、わずかな隙間で「絡み合っています」。このアルゴリズムは、Fred Wienhausによるスクリプト「houghlines」に基づいていますが、「垂直距離」の累積処理は異なります。

局所適応しきい値処理

建設中
-lat」演算子は、周囲のウィンドウ内のピクセルの値に基づいて、各ピクセルのしきい値を適応的に設定しようとします。これは、背景が不均一(つまり、照明が不均一)な画像のしきい値処理によく使用されます。これは、小さなウィンドウ内のピクセルは、ほぼ同じ背景色とほぼ同じ前景色を持つという仮定に基づいています。
For example.
   magick input.png -lat 17 output.png
上記では、17ピクセルの正方形の「ウィンドウ」を使用して、各点での画像の平均色を決定しています。ピクセルがこの平均よりも暗い場合は黒になり、この平均よりも明るい場合は白になります。ウィンドウサイズが小さいほど、しきい値は照明の小さな変化により敏感になり、計算速度が速くなりますが、画像のノイズの影響を受けやすくなります。
Example
ウィンドウサイズが大きいほど、しきい値は照明の小さな変化により敏感ではなくなり、計算速度が遅くなり、画像のノイズの影響を受けにくくなります。これにより、しきい値の選択がピクセル値の小さな変化により敏感になったり、敏感でなくなったりします。
Example
The window does not need to be square.  for example...
  magick input.png -lat 15x25 output.png
計算された平均色に追加されるオフセットを提供することもできます。これにより、各ピクセルの局所的なしきい値が明るくなったり暗くなったりします。これは、たとえば、ノイズの影響やピクセル値の小さな変化の影響を軽減するために使用できます。
  magick input.png -lat 15x25+2%
これらの小さな変化は通常、スキャナーまたはデジタルカメラを使用して画像を取得するときに発生します。正のオフセット値を使用して、適応しきい値処理をピクセル値の小さな変化により敏感にしないようにします。負のしきい値を使用して、適応しきい値処理をピクセル値の小さな変化により敏感にします。あるいは、「-lat」で処理する前に画像のノイズを低減することもできます。
In summary, each pixel is thresholded using the following logic:
  AVG = average value of each pixel in the window
  IF (input pixel is > AVG + OFFSET)
     Output pixel is BLACK
  else
     Output pixel is WHITE

---

An alternative is to subtract a blurred copy of the original image
using (Modulus) Subtraction, then thresholding.

   magick rose: -colorspace gray -lat 10x10+0% x:

is roughly equivalent to...

   magick rose: -colorspace gray \( +clone -blur 10x65535 \) \
           -compose subtract -composite -threshold 50%  x:

The special "-blur 10x65535"  is a linear averaging blur limiting itself to a
10x10 window.

The 'Subtract' composition being a mathematical modulus type of operation will
wrap the values that goes negative back round to a value greater than 50%.

If you want to include an offset you can do so by also subtracting a solid
color background image by using a -flatten...  for example

   magick rose: -colorspace gray -lat 10x10+10% x:

is roughly equivalent to...

   magick rose: -colorspace gray \( +clone -blur 10x65535 \) \
           -compose subtract -background gray10 -flatten -threshold 50%  x:

上記は、D Hobson によって提供された初期のメモから修正されました。
   -adaptive-sharpen
        Sharpen images only around the edges of the images

   -segment cluster-threshold x smoothing-threshold
         Segmentation of the color space (not image objects)
         This can produce very verbose output.
         This applies the "fuzzy c-means algorithm" if you want to know more.

Also related is -despeckle. to remove single off color pixels.

Generate a 3d stereogram of two images (one for each eye)
This is also known as an anaglyph
  magick composite left.jpg right.jpg -stereo anaglyph.jpg


3Dハイライトのシェード

シェードの使用

-shade」演算子は、ImageMagickが提供する最も興味深い演算子の1つであると考えてきました。この演算子のドキュメントでは、その機能について大まかなヒントしか示されていませんでした。演算子を理解し、IMユーザーに提供できるパワーをどのように活用するかを理解するまでに、多くの個人的な研究が必要でした。基本的に、この演算子は、指定された画像が「高さ場」と呼ばれるものであると仮定します。つまり、オブジェクトまたは地形の表面を表すグレースケール画像です。「」は画像の最高点を表し、「」は最低点を表します。この表現は1980年代のコンピュータービジョン研究から生まれ、強い「カメラの光」を持つ写真が使用され、近くの点は明るく、遠くの点は暗くなっています。
-shade」はグレースケール画像を必要とするため、オペレーターは入力画像から自動的に色を除去します。同様に、画像に存在する可能性のある透明度は完全に無効になり、オペレーターによって無視されます。
次に、「-shade」はこのグレースケールの高さ場(height field)に光を当てます。その結果、生成される光の陰影が表現されます。出力の意味を理解するためには、入力画像を「表面」として考える必要があります。デモでは「高さ場」画像が必要となるため、1つ作成しましょう。

  magick -font Candice -pointsize 64 -background black -fill white \
          label:A  -trim +repage -bordercolor black -border 10x5 \
          shade_a_mask.gif
[IM Output]
この画像は形状の「マスク」にも相当し、「-shade」への入力としてのみならず、画像のマスキングで、陰影付きの結果から同じ形状を切り抜くためにもよく使用されます。下記の陰影画像のマスキングを参照してください。「-shade」オペレーターにとって、この画像は平らな黒の平原に、垂直に上方に伸びる平らな白い高原のように見えます。したがって、この画像の端のみが興味深い効果を生み出します。この効果において、2つの引数は光が当たる方向を定義します。最初の引数は光が当たる *方向* です。そのため、「`0`」度は東(左)から、「`90`」度は北(上)から反時計回りなどとなります。例えば…

  magick shade_a_mask.gif   -shade    0x45   shade_direction_0.gif
  magick shade_a_mask.gif   -shade   45x45   shade_direction_45.gif
  magick shade_a_mask.gif   -shade   90x45   shade_direction_90.gif
  magick shade_a_mask.gif   -shade  135x45   shade_direction_135.gif
  magick shade_a_mask.gif   -shade  180x45   shade_direction_180.gif
お分かりいただけたかと思います。光はあらゆる方向から照射できます。もう一つの引数は*仰角*(elevation)で、光源が地面となす角度を表します。「0」は夜明け、「90」は真上を意味します。太陽の高度と考えてください。
[diagram]

  magick shade_a_mask.gif   -shade  90x0    shade_elevation_0.gif
  magick shade_a_mask.gif   -shade  90x15   shade_elevation_15.gif
  magick shade_a_mask.gif   -shade  90x30   shade_elevation_30.gif
  magick shade_a_mask.gif   -shade  90x45   shade_elevation_45.gif
  magick shade_a_mask.gif   -shade  90x60   shade_elevation_60.gif
  magick shade_a_mask.gif   -shade  90x75   shade_elevation_75.gif
  magick shade_a_mask.gif   -shade  90x90   shade_elevation_90.gif
ご覧のように、仰角「`0`」では、光が当たる側のみが強調表示されます。他の部分は、光が当たらないため黒くなります。これを「夜明けのハイライト」と呼び、独自の用途があります。これが最初の注目点です。「-shade」で処理された画像は、ハイライトされた領域よりも暗い、影の部分が多いことがよくあります。陰影は均一ではありません。光が「高さ場」画像の上方に高くなるにつれて、画像全体の明るさは白くなり、「正午」または仰角「`90`」では、平らな領域はまばゆいばかりの白になり、傾斜とエッジのみが灰色になり、最大値(または「崖のような」急な傾斜の変化)は中間灰色になります。この「正午」の画像は、エッジ検出システムのようなもので、鮮明なエッジでは2〜4ピクセルの幅になります。私は過去に、平らな領域を透明にするために、「-shade」画像の面取りされたエッジのマスクを生成するためにこの画像を使用しました。仰角が「`90`」度を超えると、光が反対方向から当たった場合と同じ結果になります。そのため、「`0x135`」は「`180x45`」とまったく同じ結果になります。負の仰角も、光が下から「半透明」のような表面に当たった場合と同じ結果になります。そのため、「`0x-45`」は「`0x45`」と同じになります。つまり、特定の陰影に対して、同じ結果を生み出す他の引数が通常4つあります。上記から、「`120x45`」という引数は、陰影出力の直接使用に最適であると考えます。例えば、ここでは面取りされたテキストを作成します…

  magick -size 320x100 xc:black \
          -font Candice -pointsize 72 -fill white \
          -draw "text 25,65 'Anthony'" \
          -shade 120x45  shade_anthony.jpg
[IM Output]
-shade」の大きな問題の1つは、実際に生成される面取りの厚さです。上記で使用したようなシャープなエッジは、常にマスク領域の内外に約4ピクセルの幅の面取りを生成します。「-shade」オペレーターを使用する前後の画像のサイズ変更以外に、この厚さを調整する方法はありません。特定の仰角照明角度で「平らな領域」がどの程度明るくなるかを確認したい場合は、次のコマンドを使用して、平らな単色の表面に陰影を付けることができます。

  magick -size 50x50 xc:white -draw 'circle 25,25 20,10' \
          -blur 0x2  -shade 0x45   -gravity center -crop 1x1+0+0 txt:-
[IM Text]
ご覧のように、仰角「`45`」度は約70%灰色のかなり明るい単色を生成します。これは一般的な視聴のための妥当な灰色レベルです。ただし、さまざまな形状の3Dハイライトを生成するために陰影を使用する予定がある場合は、実際の灰色レベルが非常に重要になります。これは、オーバーレイハイライトの作成で後ほど詳しく説明します。「-shade」オペレーターについては、基本的に以上です。ただし、効果的に使用するには、さまざまなテクニックと可能性があり、次にそれらを見ていきます。

陰影付き形状のマスキング

上記で述べたように、単純な「マスク」形状は、「-shade」と共に使用して、単純な形状から複雑な3D効果を生成することがよくあります。たとえば、直接陰影を付けたマスク画像に対してこれを行いましょう。

  magick shade_direction_135.gif  shade_a_mask.gif \
          -alpha Off -compose CopyOpacity -composite   shade_beveled.png
[IM Output]  + [IM Output] ==> [IM Output]
-shade」オペレーターによって生成された面取りの約半分が、実際にはマスク領域の外側に落ちていることに注意してください。つまり、直線的な面取りはマスクされると半分になります。一方、垂直または「正午」の陰影画像(仰角「`90`」度を使用)を使用して、面取りされたエッジのみを抽出し、画像の中央を空にすることができます。

  magick shade_direction_135.gif \
          \( shade_elevation_90.gif -normalize -negate \) \
          -alpha Off -compose CopyOpacity -composite   shade_beveled_edge.png
[IM Output]  + [IM Output] ==> [IM Output]
ただし、「正午」の陰影画像は、「-shade」オペレーターの効果の位置(と強度)をマスクする方法を提供しますが、実際にはそれらの効果を完全にカバーするわけではありません。「正午」の陰影画像と元のマスクを組み合わせることで、マスクのサイズをわずかに大きくして、より優れたマスクされた面取り画像を作成できます。
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

  magick shade_direction_135.gif \
          \( shade_elevation_90.gif -normalize -negate \
             shade_a_mask.gif -compose screen -composite \) \
          -alpha Off -compose CopyOpacity -composite   shade_beveled_plus.png
[IM Output]
IM v6では、以前に生成した「陰影」画像をすべて同じコマンドで生成できることに注意してください。したがって、上記はすべて最初から完全に生成できたはずです。例えば。

  magick -font Candice -pointsize 72 -background black -fill white \
          label:X  -trim +repage -bordercolor black -border 10x5 \
          \( -clone 0 -shade  135x45 \) \
          \( -clone 0 -shade  0x90  -normalize -negate \
             -clone 0 -compose screen -composite \) \
          -delete 0 -alpha Off -compose CopyOpacity -composite \
          shade_beveled_X.png
[IM Output]

シェーディングされた形状画像

アルファ抽出オペレーターは、形状のある画像からアルファチャンネルをグレースケールマスクとして抽出するだけでなく、オフになっているアルファチャンネルに形状を保持するという副作用もあります。オフになっているため、「-shade」を含む多くの画像処理オペレーターの影響を受けず、詳細が保持されます。これは、形状のある画像の場合、形状を抽出し、作業を行い、すべての画像処理が完了した後に、アルファオンを再度オンにするだけで、簡単に透明性を復元できることを意味します。たとえば、ここでは透明な背景に「ハート」を描画し、画像のぼかしと陰影処理を行い、画像の元の形状の輪郭を復元します。

  magick -size 100x100 -gravity center -background None \
          -font WebDings label:Y \
          -alpha Extract -blur 0x6 -shade 120x21 -alpha On \
          -normalize +level 15%  -fill Red -tint 100%    shade_heart.png
[IM Output]
本当に素晴らしい時間節約です!以前のコマンドよりもはるかに簡単で、余分な処理や画像のクローン作成は必要ありません。

シェーディングエッジの丸め

最後の例で見たように、画像形状マスクをぼかすことで、エッジの「崖」の傾斜が滑らかになり、時間の経過とともに摩耗したようになります。これにより、陰影画像に美しい丸みを帯びた効果が得られます。

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          shade_circle_mask.gif
  magick shade_circle_mask.gif            -shade 120x45  shade_blur_0.gif
  magick shade_circle_mask.gif -blur 0x1  -shade 120x45  shade_blur_1.gif
  magick shade_circle_mask.gif -blur 0x2  -shade 120x45  shade_blur_2.gif
  magick shade_circle_mask.gif -blur 0x3  -shade 120x45  shade_blur_3.gif
  magick shade_circle_mask.gif -blur 0x4  -shade 120x45  shade_blur_4.gif
  magick shade_circle_mask.gif -blur 0x5  -shade 120x45  shade_blur_5.gif
ご覧のように、ぼかしはエッジを丸めるだけでなく、照明効果を暗くします。最も明るく暗い点をそれぞれ純粋な白と黒の色に戻すことで、結果のコントラストを最大化できます。

  magick shade_blur_3.gif   -normalize  shade_blur_3n.gif
[IM Output] ==> [IM Output]
唯一の欠点は、これにより陰影付きの画像が一般的に暗くなることです。これはオーバーレイハイライトの作成で考慮する必要があることです。この陰影画像を直接マスクして終了しましょう。

  magick shade_blur_3n.gif shade_circle_mask.gif \
          -alpha Off -compose CopyOpacity -composite   shade_blur_3n_mask.png
[IM Output] ==> [IM Output]
ご覧のように、マスク画像をぼかすと、結果の形状のエッジが非常にきれいに丸くなります。

オーバーレイハイライトの作成

-shade」オペレーターからの出力は非常に優れていますが、形状の単純なグレースケール画像を実際に必要とすることはめったにありません。必要なのは色です。ただし、2つの主な方法で色を追加することはそれほど簡単ではありません。中間色を色付けするはグレースケールを単に再着色するだけであり、「オーバーレイ」アルファ合成は、灰色の領域を画像で置き換えます。どちらも特殊な形式のグレースケール画像に依存しています。つまり、完璧な中間調の灰色(「`grey50`」)が色または画像で置き換えられ、白または暗い灰色は、必要に応じて色または画像を白くまたは暗くします。変更されていない領域に完璧な中間調の灰色を持つ、これらの特別なグレースケール「オーバーレイハイライト」画像は、「-shade」を使用して作成するのはそれほど簡単ではありません。ただし、私が発見したより簡単な方法をいくつか紹介します。「-shade」で30度の仰角照明角度を使用すると、形状の平らな領域に完璧な中間調の灰色を生成する1つの方法です。たとえば、ここでは画像に陰影を付け、左上のピクセルを抽出して、「平らな」画像部分の結果の色を確認します。
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          -blur 0x2  -shade 120x30           shade_30.png
  magick shade_30.png   -gravity center -crop 1x1+0+0 txt:-
[IM Image]
[IM Text]
残念ながら、上記のコマンドの「-blur」の丸み効果を変更すると、陰影画像のハイライト強度も変化する傾向があります。つまり、大きなぼかしを使用すると、見栄えの良い丸みを帯びたエッジが生成されるだけでなく、ハイライトが非常に暗くなり、ほとんど目に見えなくなります。これは、ハイライトをオーバーレイ画像として効果的にするために、「-shade」によって生成された出力のコントラストを大幅に追加する必要があることを意味します。これを修正するには、丸み調整からこのコントラスト効果を除去する方法が必要です。これを行う典型的な方法は、画像を「-normalize」することですが、30度の陰影画像に対してこれを行うと、「平らな」領域はもはや完璧な灰色ではなくなります。例えば…

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          -blur 0x2  -shade 120x30 -normalize   shade_30_norm.png
  magick shade_30_norm.png   -gravity center -crop 1x1+0+0 txt:-
[IM Image]
[IM Text]
ただし、さらに実験を行った結果、21.78度の陰影仰角を使用すると、正規化後、目的の完璧な中間調の灰色レベルと良好なハイライト効果が得られることがわかりました。

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          -blur 0x2  -shade 120x21.78 -normalize   shade_21_norm.png
  magick shade_21_norm.png   -gravity center -crop 1x1+0+0 txt:-
[IM Image]
[IM Text]
陰影画像は現在「-normalize」オペレーターを実行しているため、「-blur」の値を使用して「エッジを丸める」ことは、結果の最終的な強度には影響しなくなります。はるかに優れた方法です。要約すると、正規化された陰影画像は、中間調を完璧な灰色からずらします。これで、生成されるハイライトの出力強度を他の調整とは完全に独立して調整できます。正規化された結果は極端であるため、通常、ハイライトを目的のレベルに減らすために、制御された脱正規化またはアンチコントラスト制御が必要です。結果のハイライトを調整するための最も簡単な方法は、完璧な灰色で画像を色付けすることです。これにより、画像内のすべてのカラーレベルが中心の純粋な中間調の灰色にシフトします。例えば…

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          \( +clone -blur 0x2 -shade 120x21.78 -normalize  \) \
          +swap -alpha Off -compose CopyOpacity -composite  shade_tint_0.png
  magick shade_tint_0.png -fill grey50  -colorize 10%  shade_tint_10.png
  magick shade_tint_0.png -fill grey50  -colorize 30%  shade_tint_30.png
  magick shade_tint_0.png -fill grey50  -colorize 50%  shade_tint_50.png
  magick shade_tint_0.png -fill grey50  -colorize 80%  shade_tint_80.png
ハイライトを単に線形に色付けする代わりに、シグモイド非線形コントラスト を使用して、極端な明暗部分を維持しながら全体的な効果を弱めることができます。これにより、ハイライト効果がより「自然」な見た目になり、表面の反射率が高くなったかのようにハイライトを明るくすることができます。ただし、この手法をより効果的にするには、シェード結果に純粋な白と黒の色が含まれていないことを確認する必要があります。「-contrast-stretch」を「0%」ではなく「-normalize」を使用し、上記のように結果を少量デノーマライズすることで実現できます。これはハイライトオーバーレイ画像の生成に複雑さを追加しているように見えるかもしれませんが、ハイライトの明るい部分を強調することで、追加の処理がその労に値するようになります。例えば…

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          \( +clone -blur 0x2 -shade 120x21.78 -contrast-stretch 0% \) \
          +swap -alpha Off -compose CopyOpacity -composite shade_sig_0.png

  magick shade_sig_0.png  -sigmoidal-contrast 10x50%  shade_sig-10.png
  magick shade_sig_0.png  -sigmoidal-contrast  5x50%  shade_sig-5.png
  magick shade_sig_0.png  -sigmoidal-contrast  2x50%  shade_sig-2.png

  magick shade_sig_0.png  +sigmoidal-contrast  2x50%  shade_sig+2.png
  magick shade_sig_0.png  +sigmoidal-contrast  5x50%  shade_sig+5.png
  magick shade_sig_0.png  +sigmoidal-contrast 10x50%  shade_sig+10.png
ご覧のとおり、全体的なハイライトの強度は減少していますが、反射光による明るいスポットはこれまでと同じように明るく、サイズは小さくなっています。その結果、形状にずっと自然な「光沢のある」外観が得られます。この手法の唯一の欠点は、シャドウの「スポット」も生成されることですが、これは多くの場合、それほど目立ちません。最後に、「ハイライトスポット」と一般的なハイライトの低減を組み合わせることで、高度に構成可能なハイライトオーバーレイジェネレーターコントロールを作成できます…
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output] <== [IM Output] ==> [IM Output] [IM Output] [IM Output]

  magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \
          \( +clone -blur 0x4 -shade 120x21.78 -contrast-stretch 0% \
             +sigmoidal-contrast 7x50% -fill grey50 -colorize 10%  \) \
          +swap -alpha Off -compose CopyOpacity -composite shade_overlay.png
[IM Output]
要約すると、上記の例には4つの別々のコントロールがあります…
"blur":形状のエッジを丸める (0.001=面取り 2=滑らか 10=丸み)
"shade":光源の方向 (120=左上 60=右上)
"sigmoidal":表面反射制御ハイライトスポット (1=フラット 5=良好 10=反射性)
"colorize":ハイライトの全体的なコントラスト (0%=明るい 10%=良好 50%=暗い)
上記の例は元の「円」の形に整形されていますが、透明度は「オーバーレイ」合成が適用された後、適用前ではありません。また、同じ形状にハイライトを繰り返し使用する予定がある場合(回転が実行された後)、使用する各形状に対してハイライトオーバーレイを一度だけ事前に生成し、結果を複数回再利用できます。このシェーディングオーバーレイの再利用の例としては、IMディスカッションフォーラムのフラットなソース画像からの3D DVDカバーの生成があります。また、上記のテクニックを試してみることを強くお勧めします。これらは、フラットな形状の画像をよりリアルに見せるための鍵となります。ハイライトに関する他のアイデアを思いついたら、お知らせください。
FUTURE:
   Color Tinting the Overlay image
   Overlay Alpha Composition with an Image

夜明けのシェーディングハイライトの使用

上記のシェード画像のマスキングでは、「真昼」または「正午」のシェード画像(「90」の仰角を使用)が、「-shade」によって生成される効果の位置と範囲をマスキングするのに役立つことを示しました。しかし、形状の水平方向または「夜明け」のシェード画像(「0」の仰角を使用)も非常に役立ちます。たとえば、白または黒の画像のマスクとして使用して、形状に別々のハイライトとシェーディング効果を生成できます。これにより、形状にほぼ均等な量の明暗領域(または不均等な量)が得られるようにすることもできます。これは、別々に生成しますが、完全に制御された方法で行います。
FUTURE: more detail here
このテクニックの例については、最初の高度な3Dロゴを参照してください。

FX、DIY画像演算子の使用

画像リスト演算子 "-fx" は、ほぼすべての画像操作を作成するために使用できるため、IM演算子の特定のカテゴリには当てはまりません。その使用例はこれらのページで説明されていますが、ここでは、その機能と使用方法について具体的に見ていきます。このコマンドは機能が非常に汎用的であるため、
  • キャンバス、グラデーション、数学的カラーマップを作成できます。
  • 画像とチャンネル間で色値を移動できます。
  • 想像できるほぼあらゆる方法で画像の色を調整できます。
  • 画像を翻訳、反転、ミラーリング、回転、スケーリング、せん断し、一般的に歪ませることができます。
  • 複数の画像をマージまたは合成できます。
  • 画像を奇妙で素晴らしい方法でタイルできます。
  • 隣接するピクセルを畳み込みまたはマージできます。
  • 画像メトリクスまたは「フィンガープリント」を生成できます。
  • 画像を珍しい方法で比較できます。
もちろん、これらの手法の多くは既にIMに含まれており、より高速で柔軟性の高い結果が得られます。しかし、組み込まれていない場合でも、「-fx」を使用すると、目的の操作の独自のバージョンを生成できます。実際、私を含め他の人々は、これをよく使用して、後でIMのコアライブラリに組み込まれる新しい操作のプロトタイプを作成しました。例として、「-fx」を使用して-ordered-dither演算子の改訂版を開発したDIY新しい順序付けられたディザ置換を参照してください。この演算子は基本的に、1つ以上の画像に対して自由形式の数学演算を実行できます。コマンドの公式概要については、ImageMagick WebサイトFX、特殊効果画像演算子を参照してください。

FX の基本的な使用方法

このコマンドは、任意の数の入力画像の画像シーケンスを受け取ります。通常は1つまたは2つの画像で、「-fx」関数の結果によって変更された最初の画像のコピーで、すべての入力画像が置き換えられます。つまり、「-fx」演算子の結果には、最初の画像にあるメタデータがすべて保持されます。数学的な使いやすさのために、提供されるすべてのカラー値は、0.0〜1.0の値の範囲に正規化されます。結果もこの範囲内にあることが期待されます。これには、0.0(完全に透明)から1.0(完全に不透明)までの透明度またはアルファチャンネルが含まれます。値は「アルファ透明度」を表し、実際にはIMが内部的に透明度を格納する方法(マット値として)の負数です。ただし、この形式の方が数学的に正確で、使いやすくなっています。「-channel」の設定は、最初の(「ゼロ番目」または「u」とも呼ばれる)画像のどのチャンネルが「-fx」演算子の結果で置き換えられるかを定義します。これは、デフォルトでは、元の画像のカラーチャンネル(「RGB」)のみに制限されています。「-channel」の設定がアルファ(「A」)チャンネルを含むように変更されない限り、その画像の既存の透明度は変更されません。式はピクセルごとに1回、処理中のピクセルの各カラーチャンネルごとに1回実行されます。また、式は実行されるたびに再解析されるため、複雑な式は大きな画像を処理するのに時間がかかる可能性があります。たとえば、ここでは黒い画像を定義しますが、青のチャンネルを半分の明るさに設定して、「紺色」の色を作成します。

  magick -size 64x64 xc:black -channel blue -fx '1/2' fx_navy.gif
[IM Output]
ここでは、白黒のグラデーションを取り、青と緑のチャンネルをゼロに設定して、黒赤のグラデーションにします。

  magick -size 64x64 gradient:black-white \
           -channel blue,green    -fx '0'    fx_red.gif
[IM Output]
-channel」の設定を「-fx」演算子とより似せるために、演算子がその動作を制限するチャンネルを指定するために、文字「RGBA」の任意の組み合わせを受け入れます。

つまり、「-fx」の出力を青と緑のチャンネルのみに制限するには、「-channel blue,green」という長い表記の代わりに「-channel BG」と書くことができます。
-fx」を使用せずに上記の例を生成できたかもしれませんが、既存の画像に対してこれを行うことができる点が、この画像演算子を強力なものにしています。実際、この関数は、メモリ内の現在の画像シーケンスに既に存在する任意の画像の任意のピクセル、または特定の色を読み取って使用できます。最初の「ゼロ」画像は「u」という特別な名前が付けられています。2番目の画像は「v」です。メモリ内の他の画像は、インデックスで参照できます。「u[3]」は現在の画像シーケンスの4番目の画像であり、「u[-1]」はシーケンスの最後の画像です。これは、画像リスト演算子で使用されるのと同じインデックススキームであるため、すぐに使いこなせるはずです。他の修飾子が指定されていない場合、使用されるカラー値は、指定された画像で使用されるカラー値と同じです。つまり、赤の色を使用したいと具体的に指定しない限り、コマンドがその時点で処理しているカラーチャンネルのカラー値が使用されます。つまり、青のチャンネルを処理しているときは、青のカラー値に対して式が適用されます。特に指定がない限り、画像内のすべてのピクセルのRGBカラー値(デフォルトの「-channel」設定で設定)をそれぞれ処理します。つまり、3*w*hの計算が行われ、与えられた式によって画像内のすべての値が変更されます。たとえば、ここではIM組み込みの「rose:」画像を取り、すべてのピクセル値に50%を掛けます。

  magick rose: -fx 'u*1.5'    fx_rose_brighten.gif
[IM Output]
上記の例では、個々の赤、緑、青の値それぞれに1.5が掛けられました。結果の値が0〜1の範囲外の場合、ImageMagickのHDRIバージョンを使用している場合を除き、適切な境界(この場合は1.0)に制限されます。他の多くの「-fx」式による画像の再着色は、数学的カラー調整ヒストグラムカーブで説明されています。現在の画像シーケンスの任意の画像を、最初の画像を変更するための式の1部分として参照できるため、必要な方法で2つ以上の画像をマージできます。ここでは、(回転した)黒青のグラデーションから青のチャンネルをコピーして、上記で生成した黒赤のグラデーションにコピーすることで、黒赤青のカラーチャート画像を生成します。

  magick -size 64x64 gradient:black-blue -rotate -90  fx_blue.gif
  magick fx_red.gif  fx_blue.gif \
          -channel B  -fx 'v'    fx_combine.gif
[IM Output]  + [IM Output] ==> [IM Output]
もちろん、代わりにチャンネルコピー合成方法を使用することもできますが、それははるかに高速です。しかし、それがポイントではありません。

逆もまた真なり。ほぼ全てのIM画像操作は、FXの同等の関数で置き換えることができます。

さて、上記の2番目の画像はソース画像としてのみ使用されます。「-fx」はまず、最初の画像のコピーを作成します。その後、与えられた他の全ての画像を使用して、その画像を数式に従って変更します。そして最後に、全ての入力画像を破棄し、変更された最初の画像のコピーで置き換えます。画像内の各ピクセルの位置に基づいて値を計算することもできます。値「i,j」は処理中のピクセルの現在の位置を表し、「w,h」は画像のサイズ(特定の画像修飾子が指定されていない限り、最初の画像)を表します。例えば、ここではDIYグラデーション画像を生成します。

  magick rose: -channel G -fx 'sin(pi*i/w)' -separate   fx_sine_gradient.gif
[IM Output]
あるいは、「i,j」の位置値の両方を使った、より複雑な処理も可能です。

  magick -size 80x80 xc: -channel G -fx  'sin((i-w/2)*(j-h/2)/w)/2+.5'\
          -separate fx_2d_gradient.gif
[IM Output]
グレースケールグラデーションを生成する際、「-fx」演算子の処理速度を約3倍速くすることができます。その方法は、上記の例のように「G」(緑)チャンネルなど、1つのカラーチャンネルのみを処理するように指示するだけです。このチャンネルはその後分離され、最終的なグレースケール画像が生成されます。これは、特に非常に複雑な「-fx」数式を使用する場合、非常に大きな速度向上をもたらす可能性があります。FXで生成されたグラデーションの詳細は、独自のグラデーションを作成するの例を参照してください。 位置情報を使用して、「p{x,y}」構文でソース画像から特定のピクセルを参照することができます。例えば、「-flop」画像演算子のような独自の「ミラーイメージ」型関数を簡単に作成でき、各ピクセルを元のソースの「ミラー」位置のカラー値で置き換えることができます。

  magick rose: -fx  'p{w-i-1,j}'  fx_rose_mirror.gif
[IM Output]
この種の「画像歪み」は、画像歪みマッピングや、画像形式の他の種類の値参照テーブルを作成することでより強力になりました。これを行う例はDIYディザパターンと閾値マップに記載されており、FXを使用して特定の色を他の画像のパターンで置き換えています。 FX式によって生成される最終画像のサイズは、最初の画像と同じです。そのため、より大きな画像を生成するには、最初の画像を目的のサイズに設定する必要があります。この状況では、2番目の画像(または3番目の画像)をカラーソースとして使用できます(次の例でのスワップを参照)。例えば、ここでは、補間スケーリングまたはリサイズを使用してrose画像のサイズを変更して、より大きな画像を生成します。

  magick rose:  -size 120x80 xc: +swap  \
           -fx 'v.p{  (i+.5)*v.w/w-.5, (j+.5)*v.h/h-.5  }' \
           fx_scaled.png
[IM Output]
ピクセルルックアップの方法に注目してください。複雑に見えるかもしれませんが、画像をスケーリング(歪ませる)ための適切な方法です。基本的に、式に追加された余分な「0.5」の値は、入力座標「i,j」と位置ルックアップ「v.p{...}」に使用されるピクセル座標の間を正しく変換するために必要であり、より数学的に正確な画像座標は実際の数学的計算(スケーリング)に必要です。上記は実際には、あらゆる種類の画像歪みで使用される正確な方法です。詳細な歪みサマリーを有効にすることで、ほとんどの歪みに対するこのFX同等物を確認できます。これは、歪みが期待通りに機能していることを二重に確認する方法として、ほとんどの画像歪みに対するFX同等物を報告します。FX DIY演算子を画像歪みに使用することは、この演算子がいかに強力であるかを示しています。この演算子がなければ、歪み、スパースカラー、順序付きディザリングなどの新しい操作の多くがImageMagickコアライブラリに追加されたとは考えられません。ここでは、rose画像の赤と青のチャンネルを入れ替える、少し簡単な例を示します。どのように機能するかを考えてみてください。

  magick rose: \( +clone -channel R -fx B \) \
          +swap -channel B -fx v.R     fx_rb_swap.gif
[IM Output]
同じことをより高速かつ効率的に行う方法は、「-separate」と「-combine」を使用することです。RGBチャンネル画像の結合を参照してください。あるいは、「-color-matrix」を使用して、さらに高速に同じ処理を行うこともできます。

傾向が見えてきましたか?
デフォルトの「-channel」設定では、「-fx」演算子の出力が3つのカラーチャンネルに制限されます。つまり、アルファチャンネルまたは透過チャンネルに影響を与えたい場合は、チャンネル設定を変更して明示的に指定する必要があります。例えば、全てのアルファチャンネルの値を半分にすることで、半透明の「rose:」画像を作成してみましょう。

  magick rose: -alpha set  -channel A  -fx '0.5'    fx_rose_trans.png
[IM Output]
上記の処理が正しく機能するには、「-fx」が使用できるアルファチャンネルが「rose:」に実際に存在することを確認する必要がありました。アルファチャンネル制御演算子を使用してこれを行いました。「-fx」演算子は画像のRGBAチャンネルを操作できるため、チャンネルとマスクの操作に最適です。
IM 6.2.10以降、「-fx」式に変数代入を追加できるようになりました。これにより、他の方法では基本的に不可能な、いくつかの式の複雑さを軽減できます。例えば、ここでは、特定の点(変数「xx」と「yy」に割り当てられている)からの距離に基づいてグラデーションを作成します。変数を使用しない場合、この数式は非常に読みづらくなる可能性があります。

  magick -size 100x100 xc:  -channel G \
          -fx 'xx=i-w/2; yy=j-h/2; rr=hypot(xx,yy); (.5-rr/70)*1.2+.5' \
          -separate  fx_radial_gradient.png
[IM Output]
-fx」で使用されている単純なトークン化処理のため、変数名は文字のみで構成され、数字を含めることはできません。また、多くの単一文字が画像情報のアクセスのための内部変数として使用されているため、変数名は少なくとも2文字以上の長さにすることをお勧めします。そのため、「x」や「y」ではなく「xx」と「yy」を使用します。
-fx」関数「rr=hypot(xx,yy)」は、非常に一般的に使用される式「rr=sqrt(xx*xx+yy*yy)」を高速化するためにIM v6.3.6に追加されました。

もちろん、2乗距離が必要な場合は、「hypot()」関数とその意味するsqrt()関数を避ける必要があります。
本当に複雑な式の詳細な例については、より複雑なDIYグラデーションを参照してください。これは、複数文の代入がなければ不可能です。これはパースペクティブ歪みのFX形式にも当てはまります。IMバージョン6.3.0-1以降、「-fx」式の複雑さが外部ファイルが必要になり始めたため、標準の「@filename」を使用して、ファイルから式を読み取ることができるようになりました。

   echo "u*2" | magick rose: -fx "@-"  fx_file.png
[IM Output]
これは、特定のジョブに対して特定のFX式を生成するために、より複雑なスクリプトを使用できることも意味します。内部的には、ファイルは単純に文字列として読み取られ、通常どおり解釈されます。「-fx」にとって重要な他の設定は、「-virtual-pixel」と「-interpolate」です。仮想ピクセル設定により、ルックアップ座標が入力画像によってカバーされている領域の外に出た場合に、どのような色または画像結果を返すかを設定できます。これにより、ぼかしなどのエッジ効果を設定したり、より広い領域に画像をタイル状に配置したりできます。補間設定により、ルックアップ座標(浮動小数点値)が入力画像のピクセルの整数座標の間に収まる場合に、IMが隣接するピクセルの色をどのように混合するかを指定できます。詳細については、補間ピクセルルックアップを参照してください。
いくつかの関数が様々な時期に追加されました。
IM v6.3.6 : hypot()
IM v6.7.3-4 : while(), not(), guass(), squish()

FXデバッグ

debug(expr)」は、本質的に、FX式が計算されるたびに浮動小数点値を出力する方法です。これは、式のデバッグ方法を提供します。ただし、「debug()」からの出力を、三項if-else式を使用して制限できます。例えば、これは、組み込みの「rose:」画像からピクセル10,10の浮動小数点カラー値を出力します。「NULL:」画像ハンドラーを使用して、実際の画像結果は無視されます。

  magick rose: -fx 'i==10&&j==10?debug(u):1; u' null:
[IM Output]
出力は標準出力ではなく標準エラーに出力されることに注意してください。そのため、問題なくコマンドパイプラインで使用できます。FX式が3回実行されていることに注意してください。これは、その1ピクセルに対して各チャンネルで1回ずつです。ピクセル数にこれを掛け合わせると、「debug()」が、この小さな画像であっても1ピクセルに制限されていなければ、出力の長さがどれほどになるか想像できます。

FXのような組み込み操作

-fx演算子は、ImageMagickにこれまで存在しなかった新しい画像処理関数を開発する方法を表しています。ユーザーによるそのような開発の結果、カラー参照テーブル(「-clut」)など、新しい関数や方法がImageMagickに追加されました。しかし一般的に、「-fx」を使用して新しい方法が安定すると、その式はより高速な組み込み操作に変換され、通常は同様の演算子のグループの一部として追加されます。これらには、次の一般的な画像演算子とその方法が含まれます…
-evaluate 直接ピクセル、カラー値、チャンネル変更関数。
(下記Evaluateを参照)
-function より複雑なピクセル、カラー値、チャンネル変更関数。
(下記Functionを参照)
-evaluate-sequence 複数画像シーケンスの画像を数学的にマージする。
(下記Evaluate-Sequenceを参照)
-sparse-color 汎用画像再着色演算子。
(疎なカラーグラデーションを参照)
-compose 汎用的な複数画像の合成とオーバーレイの方法。
(アルファ合成を参照)
-distort ピクセルマッピングの反転を用いた、汎用的な画像歪み演算子。
(歪み演算子を参照)
-morphology 汎用的なエリア効果畳み込み/形態学関数。
(形態学演算子畳み込み演算子を参照)
人々が新しいタイプの画像操作を開発する際には、通常、「-fx」演算子を使用してプロトタイプを作成します。その「メソッド」がうまく機能することが確認されると、ImageMagick Coreライブラリに新しい超高速なビルトイン演算子として変換されます。ユーザーは独自の「-fx」式(または他の定義済みの関数)をIMへの有用な追加機能として貢献できますが、まだ他の画像演算子によってカバーされていない場合、上記の汎用演算子のいずれかによって処理できる場合は、追加が比較的容易です。例えば、私自身は2つの画像を比較するための「色が似ている場合はマスクする」タイプの操作が必要でした。これは新しい「-compose」メソッド「ChangeMask」として追加されました。これは、GIFアニメーションのためのより複雑な透明度最適化を追加することを可能にしました。「-fx」の速度と複雑さが問題になり始めたら、PerlMagickなどのAPIスクリプト言語に移行するのがおそらく良いでしょう。PerlMagick「pixel_fx.pl」を使用した例はそのAPIの配布の一部です。

FX式としてのフォーマットとアノテーションのエスケープ

IMバージョン6.2.10以降、「-format」や「-annotate」引数で使用されるような、画像プロパティエスケープ文字列内でFX式を使用できるようになりました。エスケープシーケンス「%[fx:...]」は、現在の画像シーケンス内の各画像に対して一度計算された浮動小数点値の数値に置き換えられます。ただし、FX式は処理中にわずかに変更されます。具体的には…
  • 現在のピクセル座標「i」、「j」は値0に固定されているため、画像変数単独では「p{}」インデックスを使用しない限り、ピクセル0,0からの値のみを返します。
  • カラーチャンネルを選択しない限り、赤チャンネルの値のみが返されます。
  • デフォルトの画像参照「s」は、注釈が付けられているか、識別されている現在の画像に設定されます。
  • インデックス「t」は、「s」によって参照される画像のインデックスを返します。
IM v6.6.8-6より前のバージョンでは、「t」画像インデックスと「n」画像総数の両方のFX式の値が壊れており、すべての画像に対してそれぞれ0と1の値のみを返していました。「%p」と「%n」の同等のパーセントエスケープについても同様です。
例えば、ここでは各画像に、各画像の左上の隅の色で「-annotate」を付けます。

  magick -size 150x25 xc:DarkRed xc:Green xc:Blue \
          -fill white -gravity center \
          -annotate 0 '%[fx:t] / %[fx:n] : %[fx:r],%[fx:g],%[fx:b]' \
          annotate_fx_%d.gif
[IM Output] [IM Output] [IM Output]
r」は実際には「s.p{0,0}.r」と同等であるため、書き込まれるテキストが各画像で異なることに注意してください。「g」および「b」カラーチャンネルの値についても同様です。もちろん、それぞれ0.0〜1.0の範囲で正規化された値を返します。特定のピクセルのカラー値の出力を容易にするために、「%[pixel:...]」エスケープもIM v6.3.0に追加されました。この演算子は、各画像の各チャンネルに対して指定されたFX式を1回呼び出し、返された値をIMがカラー引数として処理できるカラーにフォーマットします。

  magick -size 300x100 gradient:yellow-limegreen \
          -gravity NorthWest  -annotate 0 '%[pixel:s.p{0,0}]' \
          -gravity Center     -annotate 0 '%[pixel:s.p{0,50}]' \
          -gravity SouthEast  -annotate 0 '%[pixel:s.p{0,99}]' \
          annotate_pixel.gif
[IM Output]
identify」コマンドで「-format」を使用して、結果を直接出力できます。

  magick identify -format '%[fx:atan(1)*4]' null:
[IM Output]
これにより、πの値が数学的に計算され返されますが、この値はビルトイン変数「pi」として利用できます。乱数を生成できます。例えば、-5から10までの整数(両端を含む)を生成するには、次のようにします。「info:」は「magick identify」コマンドと同等です。

  magick xc: -format '%[fx:int(rand()*16)-5]' info:
[IM Output]
その他の方法については、識別代替:テキスト出力オプションを参照してください。また、画像の幅と高さの情報に基づいて描画文字列を生成するFX式を使用した丸みを帯びた角を持つボーダーも参照してください。FX式を使用して画像の位置を計算する、または他の画像のサイズと位置を使用して位置を指定することもできます(段階的に計算された位置を参照)。FXエスケープファイル名パーセントエスケープで使用して、計算された値に基づいて新しいファイルを作成することもできます。例として、タイルクロッピングの最後の例を参照してください。
上記のすべては、本質的に「-format」を実行し、したがって、現在の画像シーケンス内の各画像に対して1つずつFX式を含むものを実行します。「-print」演算子は「-identify」と非常によく似ていますが、現在の画像シーケンス内のすべての画像にアクセスして一度だけ実行される点が異なります。この演算子を使用すると、上記とは異なり、「u[{i}]」を使用して任意の画像から値にアクセスできます。
FX式は他の色空間の画像にも適用できるため、例えば3つの異なる色の「色相」値(「赤」チャンネル)を見つけることができます。

  magick xc:red xc:green xc:blue -colorspace HSL \
          -format '%[fx: s.r ]\n' info:
[IM Output]
gold」、「yellow」、「khaki」の平均色を見つけるなど、直接的な色の計算にもIMを使用できます。

  magick xc: -format '%[pixel:(gold+yellow+khaki)/3]' info:
[IM Output]
これは、3つのソースカラーと比較したカラーの外観を示していますが…

  magick xc:gold xc:yellow xc:khaki +append \
          \( xc: -fx '(gold+yellow+khaki)/3' \) \
          -scale 90x30\! -append fx_hues.png
[IM Output]
-print」を使用して情報を印刷することもできます。これは、画像シーケンス全体に対して一度だけ適用されます。つまり、この演算子を使用して、複数の画像を含むはるかに複雑な「%[fx:...]」式を計算できます。

他の画像からのデータへのアクセス

ただし、FXエスケープ式を使用することには1つの深刻な問題があります。画像を作成する際に、IMは現在の画像シーケンス内の他の画像に直接アクセスできません。これは、新しい画像が一般的にメモリ内の以前の画像に依存しないため、一般的な画像作成では一般的に必要ありません。基本的に、描画している画像とは異なる画像の特定のピクセルの色を収集する場合(上記のように)、または新しい画像を作成する場合は、IMコア関数には目的の情報への直接リンクがありません。たとえば、ビルトインの「rose:」画像のピクセル12,26(青みがかったピクセル)の色でラベルを作成しようとすると、直接的なアプローチは失敗します!

  magick rose: label:'%[pixel:p{12,26}]' -delete 0 label_fx_direct.gif
[IM Output]
rose画像は実際には黒ピクセルを含んでいないため、上記の結果は間違っていました。これを修正する方法は、必要な情報を抽出してグローバルIMメタデータに保存することです。これは、画像作成用のものも含め、ライブラリコアのすべてのサブルーチンに渡されます。

  magick rose: -set option:mylabel '%[pixel:u.p{12,26}]' -delete 0 \
          label:'%[mylabel]'    label_fx_indirect.gif
[IM Output]
直感的ではありませんが、これで正しい結果が得られます。「option:」という特別なタグは、「-set」オプションに、指定された設定を画像の「属性」または「プロパティ」文字列ではなく、グローバルアーティファクトとして保存する必要があることを伝えます。「-define」と同様です。ただし、「-set」形式では、アーティファクトの設定時にパーセントエスケープを展開できますが、「-define」ではできません。「label:」演算子がパーセントエスケープを展開すると、指定された「キー」は最初に画像ごとの「属性」または「プロパティ」として検索されますが、何も見つからない場合は、グローバルアーティファクト設定で「キー」を検索します。そのため、前の画像から作成したグローバル「アーティファクト」は、アーティファクトが作成された時点でその画像が存在しなくなった場合でも使用されます。基本的に、「アーティファクト」設定は「magick」コマンドのライフタイム中はグローバルであり、したがって、ある画像から別の画像に情報を渡すために使用できます。プログラムされたAPIの場合、必要なデータを画像から直接読み取ってラベル文字列を自分で生成できるため、IMがこのような複雑な方法で情報を保存する必要はありません。

評価と関数、自由形式のチャンネル修飾子

FX演算子は解釈型式処理ハンドラーであるため、「-evaluate」演算子が追加され、簡単な画像修正をより迅速に行えるようになりました。その後、IM v6.4.8-8でより複雑な「-function」演算子が追加され、複雑な画像調整の柔軟性が向上しました。これらの2つの演算子は、「-negate」、「-level」などの他の画像レベル調整演算子とともに、それらの画像を適用する前に、特にグレースケール画像に対するマイナーな調整に最も役立ちます。背景除去ハイライトとシャドウのオーバーレイ、および画像マップの生成と微調整で使用されるグレースケール画像において特に役立ちます。

Evaluate、単純な数学演算

-evaluate」演算子は、基本的に高速だが非常に単純な「-fx」演算子のバージョンです(実際には、IMへの追加より数ヶ月前に追加されています)。ただし、ユーザーが提供する単一の定数値を使用して、1つの単純な操作のみに限定されています。使用可能な関数は、次のようにして調べることができます。

  magick -list evaluate
これには、定数値に対する典型的な数学関数「add」、「subtract」、「multiply」、「divide」が含まれます。-fx演算子とは異なり、値は0〜1の範囲に正規化されず、画像の実際のカラー値のままです。そのため、Q8 IM(品質と深度を参照)で50の値を減算すると、大きな減算が行われますが、Q16バージョンのIMでは、ほとんど目立たない小さな変更になります。ただし、引数に「%」を追加すると、その引数は最大カラー値のパーセンテージを表します(「QuantumRange」と呼ばれ、「2quality-1」に等しくなります)。つまり、適切な評価方法に対してパーセンテージを適切に使用することで、「-evaluate」引数をIM品質レベルに依存しないようにすることができます。 例えば、画像内のすべてのカラー値を50%のグレーレベルに単純に置き換えるのは、「Set」を使用すると非常に簡単で高速です。

  magick rose: -evaluate set 50%  rose_set_gray.gif
[IM Output]
-evaluate」演算子には、典型的な数学関数「add」、「subtract」、「multiply」、「divide」も含まれています。 例えば、画像のコントラストを半分にするには、「divide」を「2」で割り、「25%」をaddして、完璧なグレーを中心に再配置します。

  magick rose: -evaluate divide 2 -evaluate add 25%  rose_de-constrast.gif
[IM Output]
これは、「-fx」演算子と 'u/2+.25' を直接使用するよりも、桁違いに高速です。したがって、可能な限り、「-fx」演算子よりもこの演算子を使用する必要があります。 「-evaluate」の主な問題は、すべての結果が0から'QuantumRange'の範囲にクリップされることです(ImageMagickのHDRIバージョンを使用している場合を除く)。これは、変更された値が画像データに書き戻されるためです。つまり、個々の「-evaluate」操作の後、値が'QuantumRange'によってクリップされる可能性があります。 したがって、「-fx '2*u-.25'」に相当するコントラスト強調関数を使用しようとすると、2倍の値が減算される前にクリップされるため、正しい結果が得られません。

  magick rose: -evaluate multiply 2  -evaluate subtract 25% \
          rose_contrast.gif
[IM Output]
まず'multiply'によって、大きなカラー値がすべて最大値にクリップされ、次に'subtract'によって下限値がクリップされます。その結果、上限値が正しくなくクリップされ、暗く、色が歪んだ結果が生成されます。 直接的な解決策は、適切な定数を最初に'subtract'すること(下限値の最終的な正しいクリップを行う)で、乗算の前に実行し、効果的に'(u-.125)*2'という等価な式を使用することです。

  magick rose: -evaluate subtract 12.5%  -evaluate multiply 2 \
          rose_contrast2.gif
[IM Output]
しかし、この'クリッピング'問題には多くの代替案があります。最初の論理的なものは、新しい多項式関数法(下記参照)です。その他の代替案には、レベル調整演算子または色によるレベル調整を使用して、ストレッチアウトしてカラー範囲全体を満たしたい元のカラー値を指定することも含まれます。「-evaluate」メソッドを複数使用する場合、カラー値のクリッピングに注意してください。
-evaluate」演算子は、「-fx」(およびその他のほとんどの低レベルのIM演算子)と同様に、「-channel」の影響を受けます。これにより、カラーチャネルとは別に画像のアルファ透過性を制御できます。そしてはい、「-fx」と同様に、透過性は'マット'値ではなく'アルファ値'として扱われます。ディゾルブタイプの操作の一部として、画像を50%透過にする例を挙げます。

  magick rose: -alpha set  -channel A -evaluate divide 2   rose_transparent.png
[IM Output]
結果は半透明の画像であり、表示されると、表示される色の半分はウェブページの背景色になります。したがって、表示される画像は背景色に向かって暗くなります。また、特定の目的のためにさまざまなチャネルを個別の画像に分割する前に、個々のカラーチャネルで「-evaluate」を使用する方が簡単な場合が多いこともわかりました(チャネルの分離を参照)。たとえば、ここでは、高速だが珍しいグレースケール化の方法として使用します。基本的に、各チャネルに適切な量を掛けてから、チャネルを分離して加算することにより、特定の色比率を使用してグレースケール化された画像を生成します。

  magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   -channel RGB -separate -background black -compose plus -flatten gray_253.png
[IM Output]

Evaluate の数学関数

Evaluateには、特殊な目的の数学関数のセットも含まれています。これらの関数は、一般的に正規化されたカラー値(0〜1の範囲)を使用して実装され、出力も正規化されて画像のフルカラー範囲に適合するようにします。シグモイドコントラスト関数は、この数学関数の適合の例でもあります。

累乗

'Pow'関数(IM v6.4.1-9に追加)は、たとえば、正規化されたカラー値で動作し、ユーザーは画像の明るさの変更を行うことができます。これは、pow()C関数と完全に同等です(0〜1の範囲で正規化されたカラー値を使用)。
    value = pow(value, constant) 
したがって、'放物線'勾配を作成するには、'2'の引数を使用できます。または、'0.5'の値を使用して、'平方根'勾配を作成します。たとえば…

  magick -size 20x600  gradient: -rotate 90  gradient.png
  magick gradient.png  -evaluate Pow  2   eval_pow_parabola.png
  magick gradient.png  -evaluate Pow 0.5  eval_pow_sq_root.png
[IM Output] [IM Output] [IM Output]
[IM Output] ==> [IM Output] [IM Output]
下部の3つの画像は、グラフと元の画像の両方で生成された勾配のプロファイルを正確に示しています。これにより、1つの勾配画像がどのように変更されて別の画像になったかを簡単に確認できます。これは、IM Examplesのスクリプトディレクトリにあるスクリプト「im_profile」を介して、Gnuplotグラフプロットプログラムを使用して生成されました。
これは実際にはガンマ調整演算子と等価ですが、引数が反転しています。たとえば、「-gamma 2」操作は「-evaluate pow 0.5」または'平方根'操作関数と等価です。同様に、「-gamma 0.5」は「-evaluate pow 2」を使用して2乗することと等価です。特別な勾配操作を行うことで、この方法を使用して線形勾配を複雑な円弧に変換できます。

  magick -size 20x300  gradient: -rotate 90 \
          -evaluate Pow 2 -negate -evaluate Pow 0.5 \
          -flop \( +clone -flop \) +append  eval_circle_arc.png
[IM Output]
[IM Output]
これを理解したい人のために、上記の2行目はFX式'sqrt(1-u^2)'と等価です。これにより、単一の四分円弧が生成され、次に反転され、追加されて、半円弧が生成されます。多くの小さな個々のステップが必要な場合でも、FX式を使用するよりもはるかに高速です。より高度な多項式関数も参照してください。

対数

'Log'関数(IM v6.4.2-1に追加)も正規化された値(無限大を回避するために1.0を追加)で動作し、与えられた定数が対数の底として使用されます。実際の式(正規化された値を使用)は次のとおりです。
    value = log(value*constant+1.0)/log(constant+1.0) 
例えば…

  magick gradient.png -evaluate Log 10  eval_log.png
[IM Output]
[IM Output]
これは、前のPow評価方法と非常によく似ているように見えますが、まったく同じではありません。'Log'は'0'に近づくとかなりの傾斜を生成しますが、'Pow'は垂直な傾斜を生成します。値は傾斜を制御します。対数関数は指数関数とも密接に関連しており、これは現在シグモイドコントラスト調整演算子としてのみ実装されています。これには、上記の対数曲線で見られるのと同じ傾斜機能が含まれています。これは、「-sigmoidal-contrast」が、低照度条件を含む画像の強化にガンマ調整または'累乗'曲線よりも優れた手法である理由を説明しています。

正弦と余弦

IM v6.4.8-8以降、'sin'と'cos'メソッドが追加されました。これらのメソッドは、画像に与えられた値を取得し、角度に正規化するため、フルレンジは角度の完全な円をカバーします。結果は50%のバイアスを与えられ、正規の値の範囲に合うようにスケーリングされます。定数は値(したがって角度)の乗数として使用されるため、'N'は関数が値範囲全体で円周を'N'回移動することを意味します。具体的には、これらの関数は(正規化された値を使用して)次のように定義されています。
   value = 0.5 * sin( constant*value*2*PI ) + 0.5
   value = 0.5 * cos( constant*value*2*PI ) + 0.5 
本質的に、これらの関数は画像値(通常はグレースケール値)を正弦/余弦曲線に再マッピングします。たとえば、ここでは勾配画像を取得して、これらの評価メソッドを使用して変更します。

  magick gradient.png  -evaluate sin 1  eval_sin_1.png
  magick gradient.png  -evaluate cos 1  eval_cos_1.png
[IM Output] [IM Output]
[IM Output] ==> [IM Output] [IM Output]
定数パラメーターは角度乗数であるため、評価メソッドに与えられた値によって、画像内の勾配全体にそのピークが生成されます。

  magick gradient.png -evaluate cos 5  -negate  eval_cos_5.png
[IM Output]
[IM Output]
これは、波紋や分散効果の生成から、波紋のような変位曲線の生成まで、多くのタスクに最適です。 '0.5'の乗数定数を使用することにより、線形勾配を正弦曲線勾配に簡単に変換できます。これは、元の勾配と同じ傾斜を維持しています。結果を否定することで、勾配が正しく傾斜することも保証できます。

  magick gradient.png -evaluate cos 0.5  -negate  eval_cos.5.png
[IM Output]
[IM Output]
これは、重複した写真で使用するためのスムーズな勾配の生成に最適です。ただし、これらの最後の2つの「-evaluate」メソッドは、単純な周波数オプションを超えたより多くの制御オプションを提供する、より一般的な正弦波関数(下記参照)に取って代わられたため、めったに使用されません。

Function、複数引数 Evaluate

上記の波形ジェネレーターは、特に歪み画像マッピングで非常に役立ちました。しかし、関数のより細かい制御が必要であることが判明し、複数のパラメーターが必要になりました。このため、IM v6.4.8-9で「-function」演算子が追加されました。基本的に、「-function」は「-evaluate」の複数引数形式です。ただし、評価演算子とは異なり、これらの演算子は数学演算子と同様に、上記のすべての関数は画像の正規化されたチャネル値(0.0〜1.0の範囲)でのみ動作するため、ほとんどの場合、使用が容易になります。

多項式関数

'polynomial'メソッドは任意の数の値を受け取り、FX演算子よりもはるかに高速で、指定された正確な式に従って画像内のカラー値を変更します。
-function   Polynomial   a,b,c,...
各値は、最高次から最低次まで係数として使用され、指定された項数の多項式を生成します。たとえば、'4,-4,1'の引数は、「-fx」式「4*u^2 - 4*u + 1」と等価な多項式式を生成します。高校の数学を理解していれば、この多項式関数は、入力('u')カラー範囲0.0〜1.0で1.0から0.0、次に1.0に戻る放物線曲線を生成することを知っているはずです。つまり、黒と白の色を'白'にし、完璧な灰色を'黒'にします。

  magick gradient.png -function Polynomial 4,-4,1  func_parabola.png
[IM Output]
[IM Output]
一連の'レベル制御点'を使用して曲線レベル調整を生成した結果である、4次多項式など、さらに複雑な勾配を作成することもできます。これは通常、画像の色を調整してさまざまなシェーディング効果を与えるために使用されます。

  magick gradient.png -function Polynomial '-25, 53, -36, 8.3, 0.2' \
          func_quartic.png
[IM Output]
[IM Output]
もちろん、レベル演算子を使用した場合とまったく同じように、単純な線形変更も可能です…

  magick gradient.png -function Polynomial '4, -1.5' func_linear.png
[IM Output]
[IM Output]
ただし、完全な閾値操作を実行するために無限の係数が必要なため、'Polynomial'を使用して完全な閾値操作を行うことはできませんが、かなり近づくことができます。単一の値は自然に定数であり、その値の直接的な割り当てになります。言い換えれば、この場合、33%のグレー値への「-evaluate Set」メソッドと同じです。

  magick gradient.png -function Polynomial 0.33 func_constant.png
[IM Output]
[IM Output]
Polynomial」を他の数学関数と組み合わせることで、さらに複雑なグラデーションの変更を作成できます。たとえば、多項式の平方根をとることで、線形グラデーション上に真の円弧を作成できます。「-fx」の同等の式 'sqrt( -4*u^2 + 4*u + 0 )'…

  magick gradient.png -function Polynomial -4,4,0 -evaluate Pow 0.5 \
          func_circle_arc.png
[IM Output]
[IM Output]
Pow評価メソッドも上記の代替手段として参照してください。

正弦波関数

Sinusoid」関数メソッドは、「-evaluate」メソッドの 'sin' と 'cos' のはるかに高度なバージョンであり、実際にはそれらの関数を複製できますが、画像内の色値の変更方法をはるかに細かく制御できます。
-function   Sinusoid   frequency,phase,amplitude,bias
そして、以下の式を使用して実装されています…
  value = ampl * sin(2*PI( freq*value + phase/360 ) ) + bias
これは複雑に見えるかもしれませんが、関数を使いやすくするために必要です。上記のとおりの動作をする最初の値「周波数」のみが必要であり、他のパラメーターはすべてオプションです。デフォルトでは正弦曲線が生成されます。

  magick gradient.png -function Sinusoid 1    func_sine.png
[IM Output]
[IM Output]
度単位で「位相」引数を追加することにより、曲線の開始角度を指定できます。これにより、デフォルトの正弦曲線を余弦曲線に変更できます。

  magick gradient.png -function Sinusoid 1,90   func_cosine.png
[IM Output]
[IM Output]
「周波数」と「位相」を調整することで、線形グラデーションを黒から白(正弦曲線に沿った最小値から最大値)への滑らかな正弦波グラデーションに直接変換できます。余弦評価メソッドでは、より直接的ではない方法が使用されています。

  magick gradient.png -function Sinusoid 0.5,-90 func_sine_grad.png
[IM Output]
[IM Output]
次の2つのオプション値である「振幅」と「バイアス」は、正弦曲線のスケールと中心線を制御します。たとえば、ここでは、白とグレー(0.75 ±0.25、つまり0.5~1.0の範囲の値)の間で振動する波(負の余弦曲線)を作成し、白で開始と終了します。

  magick gradient.png -function Sinusoid 5,90,.25,.75  func_sine_bias.png
[IM Output]
[IM Output]
これらの最後のパラメーターには注意してください。これらは簡単に波形の色値範囲の境界を超える可能性があり、クリッピングされます(ImageMagickのHDRIバージョンを使用している場合を除く)。

逆正弦関数

逆正弦関数「Arcsin」は、IM v6.5.3-0に追加されました。これは、円柱変位マップを生成するために必要だった特別な曲線です。そのパラメーターは…です。
-function   Arcsin   width,center,range,bias
そして、以下の式を使用して実装されています…
  value = range/PI * asin(2/width*( value - center ) ) + bias
デフォルト値(定義されていない場合)'1, 0.5, 1, 0.5'は、関数が0,0から1,1までの全体の色範囲をカバーするように中心に配置されていることを保証します。

  magick gradient.png -function Arcsin 1    func_arcsin.png
[IM Output]
[IM Output]
結果の曲線の「幅」を半分にすると…

  magick gradient.png -function Arcsin 0.5    func_arcsin_width.png
[IM Output]
[IM Output]
「中心」を使用すると、入力グレースケール値に従って曲線の位置を調整できます。

  magick gradient.png -function Arcsin 0.4,0.7 func_arcsin_center.png
[IM Output]
[IM Output]
「範囲」引数を使用すると、色値の出力範囲を減らすことができ、「バイアス」は範囲の中心を調整します。

  magick gradient.png -function Arcsin 0.5,0.5,0.5,0.5  func_arcsin_range.png
[IM Output]
[IM Output]
関数の結果として無効な値の処理方法に注意してください。これにより、関数が変位で使用される場合に優れた制御が可能になり、それらをクリーンアップする方法が提供されます。使用される実際の値は、予想どおり「バイアス ±範囲/2」です。「幅」または「範囲」のいずれかを負の値にすると、その負の値の結果として関数の傾きが反転します。

  magick gradient.png -function Arcsin -1    func_arcsin_neg.png
[IM Output]
[IM Output]

逆正接関数

Arctan」メソッドは、IM v6.5.3-1に追加されました。そのパラメーターは…です。
-function   Arctan   slope,center,range,bias
そして、以下の式を使用して実装されています…
  value = range/PI * atan(slope*PI*( value - center ) ) + bias
ご覧のとおり、「Arcsin」関数とほぼ同じで、より有用にするための小さな変更のみが行われています。デフォルト値(定義されていない場合)'1, 0.5, 1.0, 0.5'も同一です。つまり、'1.0'の傾斜値を指定すると、ヒストグラムの変化の傾斜は純粋なグレーを中心とした1:1の変化(スケーリングなし)を生成し、白と黒はよりグレーの値になります。例えば

  magick gradient.png -function Arctan 1 func_arctan.png
[IM Output]
[IM Output]
つまり、グラデーションの中央部分は実際には変更されず、白と黒の端のみがコントラストが低くなります。曲線の「傾斜」が大きくなると、中央のグラデーションはより強くなります(中央でより圧縮されます)。

  magick gradient.png -function Arctan 10 func_arctan_10.png
[IM Output]
[IM Output]
これは多くの点でシグモイドコントラストカラー変更演算子と非常によく似ています。ただし、「Arctan」関数は、純粋な黒と白の出力範囲の制限に決して到達しません。これらの制限に近づきますが、決して超えることはありません。前の関数と同様に(そしてシグモイドコントラストと同様に)、第2引数は入力グラデーション値に対する曲線の位置を調整します。

  magick gradient.png -function Arctan 10,.7 func_arctan_center.png
[IM Output]
[IM Output]
そして、最後の2つの引数「範囲」を使用すると、生成される値の出力範囲を調整できます。たとえば、この値をわずかに拡大することで、可能な値の全範囲を完全にカバーするようにすることができます。

  magick gradient.png -function Arctan 5,0.7,1.2 func_arctan_range.png
[IM Output]
[IM Output]
ただし、このように画像全体のコントラストを変更する曲線を本当に生成したい場合は、この目的のために設計されたシグモイドコントラスト演算子を使用するのが一般的です。「Arctan」グラデーション関数のより一般的な用途は、特定の値に非常に迅速に近づきますが、その値を超えることのない曲線を作成することです。「範囲」と「バイアス」引数は、これらの制限値を制御します。たとえば、この曲線は、画像のグラデーションを変更して、0.7の入力グレースケールレベルの周りの非常にシャープな閾値を作成しますが、値は0.5と1.0の範囲の制限間で変化します。

  magick gradient.png -function Arctan 15,0.7,0.5,0.75 func_arctan_typ.png
[IM Output]
[IM Output]
これはシグモイドコントラストでは生成できません。

グラデーション画像に対する数学的操作

上記の関数は、グラデーション画像に対する非常に基本的な変換を提供します。しかし、2つ以上のグラデーション画像で数学的操作を行いたい場合はどうでしょうか。つまり、別の画像のグラデーションを使用して、1つのグラデーションを変更します。これには、特別な数学的合成メソッド(「Plus」や「Divide」など)を使用する必要があります。ただし、始める前に、1つの警告を申し上げます。グラデーション画像がアルファチャネルのない純粋なグレースケール画像の場合、数学的合成メソッドを直接使用できます。ただし、これらのメソッドを特定のチャネルに限定したり、アルファ(透過性)チャネルに適用したりする場合は、特別な'Sync'チャネルフラグなしで適切な「-channel」設定を設定する必要があります。画像合成を使用した画像数学で詳細を確認してください。通常、数学的合成メソッドの使用はそれほど難しくありません。複雑になるのは、バイアスを含むグラデーションがある場合です。つまり、グラデーションは'50%グレー'で'ゼロ'の値を表し、-1(黒)から+1(白)の範囲をカバーする必要があります。このような画像は、歪み画像マッピングによく使用されます。そのため、「バイアスされたグラデーション」に対する数学的操作が実際の問題であり、ここでより具体的に検討されます。

バイアスされたグラデーションの減衰

たとえば、ここでは正弦波を作成しますが、最初は小さく、その後振幅が大きくなります。これは、バイアスされたグラデーションの「減衰」と呼ばれます。言い換えれば、バイアスされたグラデーションに別の絶対グラデーションを掛けます。これは、AMラジオなどの「振幅変調」のしくみでもあります。そのため、まず線形グラデーションから簡単に生成できる正弦波が必要です…

  magick -size 5x300 gradient: -rotate 90   math_linear.png
  magick math_linear.png  -evaluate sine 12  math_sine.png
[IM Output] ==> [IM Output]
次に、これを減衰させるために、乗算アルファ合成を使用して、正弦波に線形グラデーションを掛けます…

  magick math_sine.png  math_linear.png  \
          -compose Multiply -composite  math_sine_2.png
[IM Output] X [IM Output] ==> [IM Output]
しかし、これを水面のリプル、変位マップなどで使用するには、波は完璧なグレーを中心に残しておく必要があります。そのためには、元の画像にバイアスを追加する必要があります。これは、元の画像を掛け合わせるために使用した関数と同じ関数で、反転して2で割ったものです…

  magick math_linear.png -negate -evaluate divide 2  math_bias.png
  magick math_sine_2.png  math_bias.png \
          -compose Plus -composite  math_attenuated.png
[IM Output] X [IM Output] ==> [IM Output]
これで、変位マップで使用できる線形減衰正弦波グラデーションができました。

もちろん、このプロセス全体を1つのコマンドですべて実行でき、単純な線形減衰である必要もありません。たとえば、ここでは、線形グラデーションの代わりに負の余弦波を使用して、高周波数の正弦波を減衰させます。


  magick math_linear.png  -evaluate cos 1 -negate  math_cosine_peak.png
  magick math_sine.png  math_cosine_peak.png \
          \( -clone 0,1 -compose multiply -composite \) \
          \( -clone  1  +level 50%,0 \
             -clone  2  -compose plus -composite \) \
          -delete 0--2  math_cosine_atten.png
[IM出力] 減衰 [IM出力] ==> [IM出力]
IM v6.5.4-3以降、特別な数学的合成メソッドを使用して、上記の手順をすべて1つの合成メソッドで実行できるようになりました。基本的に、減衰操作が式Sc*Dc-.5*Sc+.5または引数「1,-.5,0,.5」であることを認識することによって。

  magick math_sine.png  math_cosine_peak.png \
          -compose Mathematics -set option:compose:args 1,-.5,0,.5 \
          -composite  math_attenuate.png
[IM Output]
同じ結果は、最初に多項式関数を使用して減衰グラデーションを調整し、次に除外合成演算子を使用して画像をマージすることによっても達成できます。

  magick math_sine.png \( math_cosine_peak.png -function polynomial -.5,.5 \) \
          -compose Exclusion -composite  math_poly_excl.png
[IM Output]

バイアスされたグラデーションの乗算

しかし、両方の関数がバイアスがかかっており、完全なグレーがゼロを、黒と白が-1から+1の範囲を表す場合はどうでしょうか?これは、負の値を含む可能性があるため、単純に掛け算して正しい結果が得られるとは限らないため、もう少し複雑です。値のクリッピングが発生したり、結果画像でカーブの反転が正しく行われなかったりするのを防ぐために、注意が必要です。秘訣は、掛け算を複数のステップに分割することです。つまり、A × Bは、A × abs(B) × sign(B)と書くこともできます。これにより、通常のグラデーション画像に保存できない負の値を掛けることを避けることができます。そのため、必要なのは、バイアスグラデーションのいずれか1つを2つの部分に分割し、もう一方のグラデーションに適切に適用することだけです。バイアスグラデーションの'sign()'、つまり負の部分のマスクは、バイアスレベルでグラデーションに閾値処理を適用することで抽出できます。その後、その閾値画像を使用して、合成差分により、もう一方のグラデーションを選択的に反転させることができます。Solarizeを使用してバイアスグラデーションの'abs()'を簡単に抽出し、次にそれを反転して2倍にする(Levelを使用)ことで、0.0から1.0の範囲のグラデーションの絶対値を取得できます。上記のAttenuateのように、掛け算の一部としてバイアスオフセットも必要になるため、グラデーションの絶対値に変換する前に、反転して半分に縮小されたSolarizeの出力を直接使用できます。では、あるグラデーションをこれらの3つの構成要素に分解してみましょう。

  magick math_cosine_peak.png  -threshold 50% -negate  math_m_sign.png
  magick math_cosine_peak.png     -solarize 50%        math_m_bias.png
  magick math_m_bias.png          -level 50%,0         math_m_abs.png
[IM Output] グラデーションの符号
白 = 負
[IM Output] ==> [IM Output] バイアスオフセット
[IM Output] 絶対値
グラデーション画像のこれらの3つの部分を1つ取得したので、もう一方のグラデーションとマージできます。これを行うには、絶対値を掛け算し、バイアスを再追加し、負にする必要がある部分を反転させます。

  magick math_sine.png   math_m_abs.png \
          -compose Multiply -composite    math_m_1.png
  magick math_m_1.png   math_m_bias.png \
          -compose Plus -composite        math_m_2.png
  magick math_m_2.png   math_m_sign.png \
          -compose Difference -composite  math_multiply.png
[IM Output] X [IM Output] ==> [IM Output]
+ [IM Output] ==> [IM Output]
符号 [IM Output] ==> [IM Output]
これで、2つのバイアスグラデーション画像の完全な掛け算が完了しました!もう一度、すべてを1つのコマンドで行ってみましょう…

  magick math_sine.png  math_cosine_peak.png \
          \( -clone  1  -threshold 50% -negate \) \
          \( -clone  1      -solarize 50%      \) \
          \( -clone  3      -level 50%,0       \) \
          \( -clone 0,4 -compose multiply   -composite \
             -clone  3  -compose plus       -composite \
             -clone  2  -compose difference -composite \) \
          -delete 0--2    math_multiply_2.png
[IM Output] X [IM Output] ==> [IM Output]
最後に1点注意として、Attenuationとは異なり、バイアスグラデーションのこの掛け算は可換です。つまり、入力画像を入れ替えても、最終結果は変わりません。上記は2*Sc*Dc-Sc-Dc+1という式と同等であるため、IM v6.5.4-3以降では、上記のような複雑な手順を、引数"2,-1,-1,1"を使用する単一の'Mathematics'合成メソッドとして実装できます。

  magick math_sine.png  math_cosine_peak.png \
          -compose Mathematics -set option:compose:args 2,-1,-1,1 \
          -composite  math_bias_multiply.png
[IM Output]
つまり、この引数付き合成メソッドがない場合に必要な12個以上のステップよりも、はるかに簡単で高速な方法です。その式を見てみると、それが'Exclusion'合成メソッドの反転に過ぎないことに気づきました。奇妙ですが、本当です。そのため、次の操作でも同じゼロバイアスの掛け算が生成されます。

  magick math_sine.png  math_cosine_peak.png \
          -compose exclusion -composite -negate  math_excl_neg.png
[IM Output]

バイアスされたグラデーションの加算

'Mathematics'合成メソッドが登場したことで、バイアスグラデーションの加算も比較的簡単になりました。同等のFX式は"u+v-0.5"、または合成引数は"0,1,1,-.5"です。例えば、以下は私が手動で生成したフーリエ変換の例で、3つのバイアス正弦波と定数DC値の加算が必要でした。

  magick math_linear.png -function sinusoid 3.5,0,.25     wave_1.png
  magick math_linear.png -function sinusoid 1.5,-90,.13   wave_2.png
  magick math_linear.png -function sinusoid 0.6,-90,.07   wave_3.png

  magick wave_1.png wave_2.png wave_3.png -background gray40 \
          -compose Mathematics -set option:compose:args 0,1,1,-.5 \
          -flatten  added_waves.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
上記では、複数の画像合成を実装するために、"-flatten"演算子と"-background"設定を使用する方法を示しています。つまり、この場合は、指定されたすべての画像と背景定数の'バイアス和'です。

周波数変調

ある関数の出力に直接別の関数を適用しても、単純な結果は得られません。その理由は、これらの数学関数はすべて、グラデーションのx値ではなく、個々のピクセルのグラデーション'値'に適用されるためです。例えば…

  magick gradient.png  -evaluate sin 0.5 -normalize \
                        -evaluate cos  8  math_cos_var.png
[IM Output]
[IM Output]
これは、本質的に
cos( 8 * sin( {value}/2 ) )
と同等の非常に複雑な関数を生成します。言い換えれば、周波数が最初の正弦曲線のグラデーションによって変化する可変周波数です。基本的に、元の画像のグラデーションが変化するほど、ピーク間の距離は小さくなります。ただし、ピークの高さ(振幅)は変化しません。これは実際には'周波数変調'の仕組みで、一見単純な関数が非常に複雑な結果を生成する方法です。
建設中
Miscellaneous Image Transformation Techniques.

These have not been exampled yet, but are some basic IM developed transforms
that may provide useful.  If you have an interesting effect please contribute.

   pixelize an image
      resize an image down 10 then scale the image 10 to produce blocks
      of roughly averaged color.
      For example...
         magick input.jpg -resize 10% -sample 1000% output.jpg

  De-skew slightly rotated images

    -deskew {threshold}
       straighten an image. A threshold of 40% works for most images.

    Use -set option:deskew:auto-crop {width} to auto crop the image. The set
    argument is the pixel width of the image background (e.g 40).

    Programmically we auto crop by running a median filter across the image
    to eliminate salt-n-pepper noise.  Next we get the image bounds of the
    median filter image with a fuzz factor (e.g. -fuzz 5%).  Finally we
    crop the original image by the bounds.  The code looks like this:

      median_image=MedianFilterImage(image,0.0,exception);
      geometry=GetImageBoundingBox(median_image,exception);
      median_image-DestoryImage(median_image);

      print("  Auto-crop geometry: %lux%lu%+ld%+ld",
                geometry.width,geometry.height, geometry.x,geometry.y);
      crop_image=CropImage(rotate_image,&geometry,exception);

    See Trimming 'Noisy' Images

  Segmentation
    look at scripts
       divide_vert
       segment_image
    for some simple scripts I wrote to segment well defined images into
    smaller parts.   I hope to get simple segmentation functions like this
    into the core library, to allow for things like automatic sub-division of
    GIF animations, and seperating images and diagrams from scanned documents.