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

ImageMagick 使用例 -- 画像の変形

ImageMagick 使用例 前書きと索引
アートのような変形

これらの演算は、視覚的効果やアート的効果のために画像全体の見た目に大きな変化を与えます。しかし画像全体の見た目はしばしば劇的に変わるものの、元画像そのものは結果の中で一般的にまだ見て取れます。


アートのような変形

浮き出しまたは沈み込みの枠

[-raise](https://imagemagick.org/command-line-options/#raise)」オペレータは非常に単純な画像変形で、ほとんど変形と言えないほどです。これがやることは、既存の画像に矩形のベベル状ハイライトを加えるだけです。 |

  magick rose: -raise 5  rose_raise.gif

[IM Output]
反転した沈み込み効果は、オペレータの「プラス」形式を使って生成できます… |

  magick rose: +raise 5  rose_sunken.gif

[IM Output]
このオペレータは画像を枠で囲むのに少し似ていますが、ピクセルを枠として追加する代わりに「[-raise](https://imagemagick.org/command-line-options/#raise)」オペレータは画像のエッジピクセルを再着色します。これがこれを画像変形たらしめています。 | 実際には画像のフレーミングは、枠を追加してからそれを raise することで実現されます!
---|---
| このオペレータは矩形画像に対してのみ動作し、透明な背景を持つ画像では色の変更も透明になるため失敗します。基本的にはかなり頭の悪いオペレータです!
---|---

内側に枠を追加する

画像の外側に枠を置くのではなく、ユーザーは画像自身のエッジに直接枠を重ねたいと考えました。この効果を実現するために、解決策は画像の寸法とぴったり一致する矩形を描くことでした。組み込みの「rose」画像は 70×46 ピクセルなので、結果として得られるオーバーレイはその寸法と正確に一致します。 |

  magick rose: -fill none -stroke navy -strokewidth 11  \
          -draw 'rectangle 0,0 69,45'   inside_border.jpg

[IM Output]
追加される枠の幅は矩形の「[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)」で制御されます。すなわち

{stroke width}  =  {border width} * 2 - 1

したがって上記の 6 ピクセルの枠には「[-strokewidth](https://imagemagick.org/command-line-options/#strokewidth)」の 11 が必要でした。画像のサイズが分からない場合は、画像をShaveしてから通常どおりを追加できます。こちらの方がおそらく簡単ですが、たぶんそれほど融通は利きません。 |

  magick rose: -bordercolor green -shave 6x6 -border 6x6 inside_border2.jpg

[IM Output]

ランダムなピクセル拡散

[-spread](https://imagemagick.org/command-line-options/#spread)」は、各ピクセルをソース画像内のランダムな近隣の色で置き換えます。このランダムな選択はピクセル補間仮想ピクセル設定の使用に従って行われます。例えば… |

  magick -size 80x40 xc:red xc:blue -append -spread 5 spread_interpolated.png

[IM Output]
ピクセル画像を調べると、いくつかのピクセルが赤と青の混色になっていることが分かるでしょう。つまりこれらは補間されているのであって、単に拡散または入れ替えされているのではありません。これは距離の値が小さいほど顕著になります。また「[-spread](https://imagemagick.org/command-line-options/#spread)」は仮想ピクセル設定も利用することに注意してください。 |

  magick -size 80x80 xc: -virtual-pixel black -spread 10 spread_virtual.png

[IM Output]
ご覧のとおり、主に純粋な黒の仮想ピクセルからなるランダムな境界が得られます。ただし、画像の実ピクセルと仮想ピクセルの境界部分から補間されたいくつかの灰色のピクセルもあります。より伝統的なピクセル拡散効果を得るには、「[-interpolate](https://imagemagick.org/command-line-options/#interpolate) [Nearest](misc.html#nearest)」を使って特定ピクセルの色参照を強制することで、この混色を防げます。仮想ピクセルの問題やありうる「エッジ色のバイアス」を避けるため、「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel) [Mirror](misc.html#mirror)」を使うことをお勧めします。これはより伝統的なピクセルのランダムな「拡散」となります… |

  magick rose: -interpolate nearest -virtual-pixel mirror \
                -spread 5   spread_rose.png

[IM Output]

作成中

上記の主な問題は、画像からいくつかのピクセルデータが失われる可能性があることです。つまりピクセルは「入れ替え」られるのではなくランダムにコピーされるので、画像内の特定のピクセルが複製されたり失われたりする可能性があります。IM v6.9.2-2 以降では「[+spread](https://imagemagick.org/command-line-options/#spread)」を使って画像内のピクセルを実際に入れ替えることができ、画像内のどのピクセルも複製も消失もしないようにできます。元画像の全ピクセルがそのまま存在し、ただ新しい位置に移動するだけです。しかしピクセルの処理方法のため、ピクセルが「二重に入れ替え」られることがあります。つまり特定のピクセルが入れ替えられた後、後のピクセルともう一度入れ替えるよう選ばれることがあるのです。これはつまり、特定のピクセルが spread 引数で要求された距離よりも遠くまで移動しうることを意味します。この二重入れ替えはまた、ピクセルが右下隅に向かってより遠くまで拡散しやすくなることも意味します。この移動はもちろん、多数のピクセルが左上に向かって小さく移動することで均衡が取られています。例えば、ここでは元画像を参照として前に付けてピクセルを拡散します。 |

  magick -size 40x40 xc:red xc:blue -append \
          \( +clone +spread 5 \) +append spread_bias.png

[IM Output]
いくつかの赤いピクセルが下方向により多く拡散している一方で、予想より上方向に多く拡散している青いピクセルもいくつか見られることに注目してください(ただし画像の左側に向かって)。この問題は spread に小さい距離引数を使うとより顕著になります。この二重入れ替え問題の解決は容易ではなく、これを解決する「限定領域シャッフル」アルゴリズムを探しているところです。しかしそれまでの間、Transverse(左上から右下への対角ミラー)歪みを挟んで spread を 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 Forum Discussion rearrange vertical pixel row から開発されたものです。

ビネット写真変形

画像を円形にし、柔らかくぼかした輪郭にする特別なオペレータです。 |

  magick rose: -background black -vignette 0x5  rose_vignette.gif

[IM Output]
ゼロ(または非常に小さい)シグマを使うとぼかしを取り除き、楕円形または卵形のフレームを生成できます。ただし、実際には最大の楕円を使うわけではないので、自分で工夫したいかもしれません。 |

  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 番目の sigma 成分に非常に大きな数を使い、最初の radius でぼかしの広がりを定義することもできます。これはビネットのぼかしに、より一般的なガウス分布ではなく「線形」分布を生成します。 |

  magick rose: -background black -vignette 5x65000  rose_vignette_linear.gif

[IM Output]
画像に柔らかいエッジを与える、より矩形的なビネットのための別の手法は、柔らかいエッジのサムネイルで示されています。

複雑なポラロイド変形

Timothy Hunter 氏(RMagick で有名)の作業のおかげで、「[-polaroid](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#flatten)」する必要があります。
---|---
このオペレータは非常に複雑で、(「[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)」設定に従って)枠を追加し、紙を「カール」させ、影に反転したカールを加えます。影の色は「[-background](https://imagemagick.org/command-line-options/#background)」色設定で制御できます。上で見たように、このオペレータのプラス形式は結果をランダムな量だけ回転させます。このオペレータは写真の索引を、そうでない場合に得られるものよりもずっと面白く、静的でないものにします。 オペレータのマイナス形式では画像の回転角度を制御できます。 |

  magick spiral_stairs_sm.jpg -thumbnail 120x120 \
          -bordercolor AliceBlue -background SteelBlue4 -polaroid 5 \
          poloroid_5.png

[IM Output]
画像に「[-caption](https://imagemagick.org/command-line-options/#caption)」メタデータがあれば、そのテキストも「[caption:](text.html#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:](text.html#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](https://imagemagick.org/command-line-options/#caption)」が使われたのは、内部で「[caption:](text.html#caption)」テキスト画像生成器が使われているためです。

一方、IM コマンドの「[montage](montage.html#montage)」は、単語折り返しをしない「[label:](text.html#label)」テキスト画像生成器を使うため、「[-label](https://imagemagick.org/command-line-options/#label)」を使います。_
---|---
写真画像に少し「カール」を加えるためにこの変形が使うRotateWaveのシアー歪みは、生成画像のテキストに水平方向のぼやけた線を生む傾向があります。これはよく知られた画像歪みの問題で(細い線の回転を参照)、スーパーサンプリング技法を使うことで解決できます。基本的には、本当に欲しいサイズの 2 倍の大きさでポラロイドを生成し、それを最終的な通常サイズにリサイズするだけです。画像サイズの縮小は結果の画像、そしてより重要なことにキャプションテキストを効果的にシャープにします。ただし、これを機能させるには最終サイズの少なくとも 2 倍の画像が必要なだけでなく、画像にもっと大きな枠を追加し、テキストを通常の 2 倍の「[-density](https://imagemagick.org/command-line-options/#density)」で描画する必要があるかもしれません。フォントの「[-pointsize](https://imagemagick.org/command-line-options/#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]
ご覧のとおり、ずっと小さいフォントの pointsize を使ったにもかかわらず、キャプションテキストは非常にシャープで明瞭、読みやすくなっています。元画像に含まれていた他の細かいディテールも同様です。これの唯一の欠点は、結果の画像の影が小さく、ぼやけが少なくなることです。ポラロイド変形を完全に制御したい場合は、関与する全ステップを自分で行うことができます。元の手法は Tim Hunter のページ RMagick Polaroid Effect に文書化されています。手順は、キャプションの作成と付加、枠の追加、wave による写真のカール、反転したカール影の追加、そして最後に画像の回転です。さらに多くの例や他の自作手法については、ポラロイドサムネイルの例ポラロイド写真のモンタージュを参照してください。RubbleWeb IM Examples, Other のポラロイド例にも興味があるかもしれません。

油絵、色のかたまり

[-paint](https://imagemagick.org/command-line-options/#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]

絵の具のかたまりの半径が大きいと、かたまりが四角ばった見た目になり始めることに注目してください。この効果は、上の最後の画像で示したように、事前に画像を少しぼかすことである程度滑らかにできます。これは興味深い効果で、奇妙で素晴らしい背景画像を作るのに使えるかもしれません。例えば背景の例での使い方を参照してください。最後に一つ警告を。「[-paint](https://imagemagick.org/command-line-options/#paint)」は単一の単色領域を生成するはずですが、大きな半径の値では、一部の領域に垂直方向のグラデーションを生む傾向があります。これは非常に煩わしく、バグかもしれません。誰か分かりますか?「[-paint](https://imagemagick.org/command-line-options/#paint)」の代替手段もあります。一つは代わりに「-statistic Mode」を使うことで、これは各ピクセルに指定された矩形近傍内の「卓越した色」を割り当て、より良い結果を生み出せます。 |

  magick rose: -statistic Mode 10 rose_paint_mode.gif

[IM Output]
もう一つは、モルフォロジーメソッド、より具体的にはカラー画像向けの Intensity 変種のいくつかを使うことです。例えばここでは、rose に対して「OpenIntensity」モルフォロジーを行います。 |

  magick rose: -morphology OpenI Disk rose_paint_open.gif

[IM Output]
そしてここでは、少し小さい「Disk」を使って「CloseIntensity」を使います。 |

  magick rose: -morphology CloseI Disk:2.5 rose_paint_close.gif

[IM Output]
「disk」を使う必要はなく、生成される「かたまり」のために自分で「ブラシ」形のカーネルを設計することもできます。例えば、斜めの線のブラシを使うのはどうでしょう。

チャコール、シーンのアーティストスケッチ

チャコール効果は、与えられた画像のアーティストによるチャコールスケッチをシミュレートすることを意図しています。「[-charcoal](https://imagemagick.org/command-line-options/#charcoal)」オペレータは、ある意味でコンピュータビジョンで使われるエッジ検出変形に似ています。基本的には、画像内のオブジェクトの主要な境界やエッジを鉛筆とチャコールの陰影へと変えようとします。一つの引数はエッジ線の太さを表すはずです。

  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](https://imagemagick.org/command-line-options/#charcoal)」オペレータは、元画像のグレースケール変換にしきい値処理を加えて適用した「[-edge](https://imagemagick.org/command-line-options/#edge)」オペレータです。

鉛筆スケッチ変形

[-sketch](https://imagemagick.org/command-line-options/#sketch)」オペレータは基本的に、線のストロークのパターンを画像に適用して、芸術的な鉛筆スケッチのように見えるものを生成します。引数はストロークの長さと角度を制御します。ただし、これははっきりとした陰影のあるより大きな画像に適用するのが最適です。このオペレータとその内部動作の完全な例については、鉛筆スケッチを参照してください。

エンボス、金属的な刻印を作る

[-emboss](https://imagemagick.org/command-line-options/#emboss)」オペレータは、グレースケール画像を金属板に酸で刻印した効果を生成しようとします。これは多くの点で後述する「[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータと非常によく似ていますが、3D 風のエッジはありません。引数は radius/sigma で、sigma のみが重要です。この引数はあまり有用でないと感じており、実際バグがあるのかもしれません。引数は最近のバージョンの 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]

 emboss アルゴリズムが正確に何をするはずなのか誰か知っていたら、
教えてください。

ステガノ、画像の中に秘密の画像を隠す

[-stegano](https://imagemagick.org/command-line-options/#stegano)」オペレータは、実のところ「お遊び」のオペレータです。例えばスパイがランダムな画像の「混沌」の中に情報を隠すのに使えます。まず警告です…

ステガノには JPEG、GIF、その他の「ロッシー」な画像エンコーディングを使わないでください

例えば、仲間のスパイに送りたい暗号メッセージ(画像)を生成してみましょう… | |

  magick -gravity center -size 50x40 label:"Watch\nthe\nPidgeon" message.gif
  magick identify message.gif

[IM Output]
| [IM Text]


メッセージ画像のサイズ(36x43 ピクセル)も必要になるので、上で identify をしています。次にこれを何らかのオフセットで何らかの画像に入れます。使うオフセット(とメッセージのサイズ)は、隠しメッセージの暗号「鍵」になります。 |

  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 色値だったことを示しています。つまり微小です。あまりに微小なので、画像へのわずかな変更や改変でも、その中に隠されたメッセージは破壊されてしまいます。あまりに小さい差なので、コンテナ画像にはロッシー圧縮を伴う JPEG も、その他のロッシーな画像形式(GIF を含む)も画像形式として使えません。また、間違った「オフセット鍵」だとメッセージは得られません… |

  magick -size 50x40+14+2 stegano:rose_message.png message_bad.gif

[IM Output]
Region設定を使って、メッセージを隠す画像の領域を制限することもできます。メッセージを復元しようとするときにも同じ設定が必要になります。これはおそらく、大きな画像(特に「混雑した」領域に制限した場合)で隠しメッセージを見つけて解読することを、桁違いに難しくするでしょう。ただし、これは暗号学的にはあまり安全な技法ではないことに注意してください。特に元のソース画像も入手できる場合はそうです。画像の周波数解析により、攻撃者は一般に隠しメッセージがあることに気づくでしょう。画像の著作権保護の方法としても、ステガノオペレータは無用です。なぜなら画像へのごく小さな変更がメッセージを破壊し、その有効性を失わせるからです。スパイのツールとしても、まずまずのサイズの画像に対する「組み合わせ」の数がこれほど少ないため、あまり良くありません。あなたがおおよそ何をしているか知っている人なら、おそらく素早く解読できるでしょう。よく知られた、長年検証された暗号手法に従う方が良いです。これの唯一の実用的な使い道は、お遊びのツールとしてか、既存の画像にごく少量のノイズを加える方法としてです。

画像データの暗号化

[-encipher](https://imagemagick.org/command-line-options/#encipher)」と「[-decipher](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#depth) 8」を設定して、その制限を強制することをお勧めします。

上記で「png24」も必要だったのは、出力がパレットやカラーマップ付きの「png8:」画像にならないようにするためで、それも正しく動作しません。_
---|---
ご覧のとおり、結果の画像は完全なゴミのように見え、画像の本当の内容を示すものは何もありません。これでその画像をウェブに公開でき、正確な元のパスフレーズを知っている人だけが画像データを復元できます… |

  magick message_hidden.png -decipher pass_phrase.txt message_restored.gif

[IM Output]
ただし、画像データが何らかの形で破損すると復元できなくなることに注意してください。これには PNG がグレースケール画像形式で保存された場合も含まれます。そのため、PNG、MIFF、TIFF、あるいはピクセル列挙テキストのような非ロッシーな画像形式のみが使えます。一方、JPEG、PNG8、GIF のようなロッシーな画像形式を使うと画像データが破損し、結果として暗号化が破壊されます。画像を記述しているメタデータは、まだ平文のままであることに注意してください。つまり、画像自身の「comment」文字列をパスフレーズとして使って画像を暗号化したり、そのコメントをより小さなパスワードで暗号化したものを使ったりできます。パスフレーズをより可変にできる単純なアイデアです。画像の暗号化はほんの一段階にすぎません。結果をもう少し進めることで、何らかの追加処理なしでは単純には復号できない画像を作れます。例えば、ここでは単純で非破壊的な歪みをいくつか使って、通常の方法で画像を復号しようとする人を混乱させます。

  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](https://imagemagick.org/command-line-options/#transpose)」を含めなかった場合、画像は正しく復号されません。また、使われているストリーム暗号(下の専門家向け注記を参照)のため、何らかの「[-roll](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#encipher)」と「[-decipher](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#encipher)」と「[-decipher](https://imagemagick.org/command-line-options/#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 つは融合または平均化された色を使い、より落ち着いた、しかし各「ピクセル」についてより正確な色表現を生む傾向があります。人の顔のような画像の小さなマスクされた領域だけにこれを使う例については、誰かの匿名性を守るも参照してください。

ピクセルのグリッド

画像のグリッド化は、画像のピクセル化と非常によく似ています。この場合、画像を拡大して、画像のディテールのピクセルレベルの鮮明なビューを生成したいだけです。通常はごく小さな画像です。最も単純な方法は前の例のように、単に小さな画像をScaleしてピクセルを拡大することです。

  magick rose: -crop 10x10+12+20 +resize  grid_input.png
  magick grid_input.png  -scale  1000%  grid_scale.png

[IM Output] [IM Output]

単純なスケーリングの問題は、ピクセルの色が似ている領域では個々の「ピクセルブロック」が見えにくくなることです。ピクセルを分離するために、ピクセルの周りに枠を追加する必要があります。これには、生成したタイルマスクを重ねる必要があります。単一のコマンドで生成したタイル画像を使うさまざまな方法については、すでにメモリ内にある画像でタイル化するを参照してください。 ここでは黒地に白の「グリッド」を生成し、Screen 合成(白を重ね、黒の領域はそのまま残す)を使って重ねます。 |

  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 つの画像をSwapしました。ただし、宛先としてタイル画像を使ったため、元画像にあった画像メタデータが失われる可能性があります。 ここでは円形の色の「斑点」を生成しますが、今回はMultiply 合成(黒を重ね、白の領域はそのまま残す)を使いました。 |

  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]
タイルオーバーレイも negate して(黒い領域が透明になる)、Multiplyの代わりに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」を設定してください。前者の方が簡単です。
---|---
技術的には、alpha shaping はタイル画像を保存する前か、タイル画像をタイル化した後、それを重ねる前のどちらでもできることに注意してください。選択はあなた次第です。最後の技法の一つは、悪いリサンプリングフィルタを使ってリサンプリング失敗を生み、各ピクセルのエイリアスのある円を生成することです。これは(画像処理の失敗を悪用するため)優れた技法ではありませんが、ピクセルのグリッドを形成します。

タイルの間隔をあける

似たような問題に、画像内のタイルのグリッドの間隔をあけることがあります。これは個々のピクセルを「ピクセルブロック」にスケールアップするのではなく、画像の矩形領域の間にスペースを挿入することです。つまり、一定間隔で画像に追加のピクセルをSpliceするのです。現在の最良の解決策は、画像を行と列に分割し、各タイルに余分な間隔をSpliceしてから、タイルをAppendで元に戻すことです。例えば…

  magick rose: -background SkyBlue \
          -crop 10x0 +repage -splice 3x0 +append \
          -crop 0x10 +repage -splice 0x3 -append \
          grid_tile.png

[IM Output] [IM Output]

これは元画像をタイルに分割する別の方法ですが、その後いくつかの自作 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](https://imagemagick.org/command-line-options/#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% 以上が白の色グラデーションを持つ領域にのみ追加されます!これがバグなのか意図的なのか分かりませんが、これは上記のエッジが、元の mask 画像のほぼ完全に白い部分に位置することを意味します。この事実は、「[-edge](https://imagemagick.org/command-line-options/#edge)」オペレータの結果を利用するときに極めて重要になりえます。例えば、黒い輪郭を含む画像でエッジ検出を行う場合、「[-edge](https://imagemagick.org/command-line-options/#edge)」オペレータは黒い線を「二重化」し、奇妙な結果を生みます。

  magick piglet.gif  -colorspace Gray  -edge 1 -negate  piglet_edge.gif

[IM Output] [IM Output]

しかしエッジ検出を行う前に画像を negate することで、二重化された線が内側に向かって結合し、「二重線」効果が取り除かれます。 |

  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]

ご覧のとおり、上記のEdge オペレータよりもはるかに鋭い結果を生みます。ぼやけたアンチエイリアスのエッジは結果にほとんど影響を与えず、細いビットマップ線を生成します。また piglet の画像が示すように、前のエッジオペレータのように一方の特定の側に配置されることもありません。その結果、入力画像を negate しても効果がありません。しかし、すべてのエッジ検出器と同様に、組み込みの rose 画像のような「混雑した」背景を持つ実世界の画像では問題が生じることがあります。このきれいな結果は、後のHough 直線検出で非常に重要になります。

アンチエイリアス図形からのエッジ輪郭

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

  magick -size 80x80 -gravity center -font WebDings label:')' voice.gif

[IM Output]
そしてこれがそのエッジ検出した画像です… |

  magick voice.gif -edge 1 -negate   voice_edge.gif

[IM Output]
ご覧のとおり、ひどい見た目で、エッジの外側にわずかなアンチエイリアスがあり、線の内側は完全にエイリアスされた(階段状の)見た目になっています。画像を negate すると、画像の外側に同様の輪郭が生成されますが、線の外側に強いエイリアスもあります。 |

  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]
この技法には、マスクが negate されているかどうかにかかわらず動作するという利点もあります。ただし、結果は元画像に対して 1/2 ピクセルのオフセットを持つことに注意してください。そのため、結果を求めるために 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]
negate したエッジは、黒い領域の内側についてのエッジ画像を生成します。 |

  magick heart.gif -negate -edge 1 -negate   heart_edge_negate.gif

[IM Output]
上記の両方を加えると、ビットマップ形状のエッジを中心とする 2 ピクセルのエッジが得られます。 |

  magick heart.gif \( +clone -negate \) -edge 1 \
          -compose add -composite  -negate  heart_edge_double.gif

[IM Output]
ご覧のとおり、元画像自体はこの点でそれほど悪くないにもかかわらず、結果の画像は輪郭に「階段状」効果を伴って強くエイリアスされています。これは良い解決策ではありません。「[EdgeIn](morphology.html#edge-in)」モルフォロジーメソッド、またはそれに似た他のものを使うことで、少し良いエッジを作れます。 |

  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]
Level オペレータの使用に注意してください。これは前の例で使った「-evaluate multiply 2 -negate」と同等です。アンチエイリアスされた境界があれば、図形の輪郭を得るのではなく単に元の図形を滑らかにしたいだけの場合、元の図形を再追加できます。ただし、輪郭は元画像のエッジに沿って正確に配置されるので、前の例よりもサイズが半ピクセル大きくなることを覚えておいてください。 図形(アンチエイリアスまたはビットマップ)からアンチエイリアスされた輪郭を生成する他の方法をご存じですか?もしそうなら、私か IM フォーラムにメールしてください。クレジットを付けます。

ラスターからベクターへの変換器を使ったエッジ

最も理想的な解決策の一つは、IM 以外の「ラスターからベクターへ」の変換プログラムを使って、このビットマップ形状をベクター輪郭に変えることです。これができるプログラムには「ScanFont」、「CorelTrace」、Adobe の「Streamline」、「[Vector Magic](http://vectormagic.com/home)」などがあります。ただし、これらのほとんどは少なくともいくらかのお金がかかります。「VectorMagick」と別のトレースプログラム「AutoTracer」には、無料で使えるオンライン画像変換器があります。他の無料の解決策には「[AutoTrace](http://autotrace.sourceforge.net/)」や「[PoTrace](http://potrace.sourceforge.net/)」があります。さらなる提案を歓迎します。これらのトレースプログラムは使いやすいですが、通常は何らかの形の事前・事後の画像設定を必要とします。入力形式の数は限られており、入力画像の「滑らかにされた」形を作るベクター画像を出力します。私は「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](http://autotrace.sourceforge.net/)」デリゲートライブラリでビルドされている場合、IM にメモリ内の画像から SVG 画像を直接生成させることもできます。詳細についてはSVG 出力の取り扱いを参照してください。例えば…

  magick heart.gif  heart_2.svg

[IM Text]

さて、SVG 出力はもちろん元画像の滑らかにされた版を表しますが、これはこの例で実際に欲しいものではありません。しかし、今やビットマップの形状を ベクター形式 で持っているので、図形を「fill」する代わりに輪郭を「stroke」するように、SVG の「style」属性を調整するだけです。修正した SVG をまた ImageMagick に通して、きれいな輪郭のラスター画像を再生成できます。例えば… |

  cat heart.svg |
    sed 's/"fill:#000000[^"]*"/"fill:none; stroke:black;"/' |
      magick svg:- heart_outline.gif

[IM Output]
確かに少々ぎこちないですが、滑らかなアンチエイリアスされた結果はその労力に十分見合います。輪郭やその他の修正を「autotrace」コマンド自体のオプションとして指定できれば良いのですが、現在のところそれは機能ではありません。SVG 出力をさらに修正して、エッジを太くしたり、他の stroke や背景色を指定したり、ベクターエッジ形状の fill 色を変えたりできます。例えば、ここでは赤い fill で図形のより太い輪郭を生成し、すべてきれいにアンチエイリアスします。 |

  cat heart.svg |
    sed 's/"fill:#000000;[^"]*"/"fill:red; stroke:black; stroke-width:5;"/' |
        magick svg:- heart_outline_thick.gif

[IM Output]
これほど完璧に見えるハートは、他のどんな方法でもビットマップ形状から生成できなかったでしょう。「d="..."」パス要素を抽出して、Draw コマンドSVG パス文字列として直接使うこともできます。これにより、そのベクター輪郭で他の任意の IM draw 設定を使えるようになり、最終結果を完全に制御できます。「[AutoTrace](http://autotrace.sourceforge.net/)」プログラムを使う別の例については、Autotrace を使ったスケルトンを参照してください。

Hough 直線検出器

Hough 直線検出器(「[-hough-lines](https://imagemagick.org/command-line-options/#hough-lines)」、IM v6.8.9-1 で追加)は、非常に多くの段階を持つ非常に複雑な変形です(詳細はWikipedia, Hough Transformを参照)。基本的には、画像を調べて黒地に白い線を探し、画像内に存在する線分(ピクセルの線形なシーケンス)の正確な位置を返そうとするように設計されています。これは、画像の回転を除去したり、画像内の透視変換を決定して、それを繰り返したり除去したりするようなことに非常に重要になりえます。これがオペレータの完全なオプションセットです。

  -background {_background_} -stroke {_line_color_} -hough-lines {_W_}x{_H_}+{_threshold_}

色(backgroundline_color)は、結果の画像内の線の色を設定するために使われます(実際にそれを描く場合)。Hough オペレータへの引数(W}x{H}+{threshold)は、中間の「探索画像」内の「ピーク」を見つけるために使われるフィルタのサイズとしきい値を定義するために使われます。つまり、検出しようとしている線をどれだけうまく実際に「見つける」かを制御します(下記参照)。これらを調整して線検出を助けます。例えば、矩形の図形画像内の線を見つけてみましょう。まず画像を線に減らす必要があり、きれいな結果のためにはCanny エッジ検出器が推奨されます。

  magick shape_rectangle.gif -canny 0x1+10%+30% rectangle.gif

[IM Output] [IM Output]

では、この画像に Hough 直線検出器を適用してみましょう。 |

  magick rectangle.gif -background black -stroke red \
          -hough-lines 5x5+20   rectangle_lines.gif

[IM Output]
ご覧のとおり、5 本の線が見つかり、そのうち 2 本は非常に近接しています。余分な線が出る理由は、画像内の矩形が完全ではないからです。さて、ラスター(GIF)画像の結果を表示していますが、Hough オペレータは実際にはMagick Vector Graphics 形式でベクター画像を生成します。これは、さらなる処理のために線情報をリスト表示できることを意味します。

  magick rectangle.gif -background black -stroke red \
          -hough-lines 5x5+20   rectangle_lines.mvg

[IM Text]

線は画像の一方のエッジから他方のエッジへ(浮動小数点値で)描かれることに注意してください。そしてこれから、2 番目と 3 番目の線が近接している 2 本だと分かります。MVG 出力のコメントは、線が画像内で「ヒット」したピクセルの累積数を与えるので、画像内で線がどれだけ強いかの良い指標になります。この値は常に、「[-hough-line](https://imagemagick.org/command-line-options/#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 は「探索画像」を画像結果に追加するだけで、この場合それを削除します。また、「累積された値」をより見やすくするためにいくらかのコントラストを適用しました。これが Hough 検出器の引数が探索している画像です。画像は常に幅 180 ピクセル(線の角度 1 度あたり 1 ピクセル)で、高さは画像の対角線の長さの 2 倍です。そのため、ピークの位置は線の角度と、入力画像の中心点に対する線の垂直距離を直接定義します。つまり X 座標は度単位の角度で、Y 座標は中心からの距離で、-対角線距離から +対角線距離までです。右下のピークをよく見ると、なぜ 1 本ではなく 2 本の線になったのかが分かります。ここのピークは「二重化」されており、その間にわずかな隙間があります。このアルゴリズムは Fred Wienhaus 氏のスクリプト「[houghlines](http://www.fmwconcepts.com/imagemagick/houghlines/)」に基づいていますが、「垂直距離」の累積の取り扱いが異なります。


局所適応しきい値処理

作成中

[-lat](https://imagemagick.org/command-line-options/#lat)」オペレータは、周囲のウィンドウ内のピクセルの値に基づいて各ピクセルを適応的にしきい値処理しようとします。これは一般に、不均一な背景(つまり不均一な照明)を持つ画像をしきい値処理するのに使われます。これは、小さなウィンドウ内のピクセルがおおよそ同じ背景色とおおよそ同じ前景色を持つという仮定に基づいています。

例えば。
   magick input.png -lat 17 output.png

上記では、17 ピクセル四方の「ウィンドウ」を使って各点での画像の平均色を決定し、ピクセルがこの平均より暗ければ黒に、明るければ白にします。小さいウィンドウサイズは、しきい値を照明の小さな変化により敏感にし、計算が速いですが、画像内のノイズに悪影響を受けます。

より大きいウィンドウサイズは、しきい値を照明の小さな変化に対してより鈍感にし、計算が遅く、画像内のノイズの影響を受けにくくします。これは、しきい値の選択をピクセル値の小さな変化に対して敏感にしたり鈍感にしたりする効果があります。

例


ウィンドウは正方形である必要はありません。例えば…
  magick input.png -lat 15x25 output.png

計算された平均色に加算されるオフセットを与えることもでき、各ピクセルの局所しきい値を明るくしたり暗くしたりします。これは例えば、ノイズの影響やピクセル値の小さな変化の影響を減らすのに使えます。

  magick input.png -lat 15x25+2%

これらの小さな変化は通常、スキャナやデジタルカメラを使って画像を取得するときに発生します。適応しきい値処理をピクセル値の小さな変動に対して鈍感にするには、正のオフセット値を使ってください。適応しきい値をピクセル値の小さな変動に対してより敏感にするには、負のしきい値を使ってください。あるいは、「-lat」で処理する前に画像のノイズを減らすこともできます。

まとめると、各ピクセルは以下のロジックを使ってしきい値処理されます:
  AVG = ウィンドウ内の各ピクセルの平均値
  IF (入力ピクセル > AVG + OFFSET)
     出力ピクセルは黒
  else
     出力ピクセルは白

---

別の方法は、元画像のぼかしたコピーを
(剰余)減算で減算してから、しきい値処理することです。

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

はおおよそ以下と同等です…

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

特別な "-blur 10x65535" は、10x10 のウィンドウに自身を制限する
線形平均化ぼかしです。

'Subtract' 合成は数学的な剰余型の演算なので、負になる値を
50% より大きい値に回り込ませます。

オフセットを含めたい場合は、-flatten を使って単色背景画像も
減算することでそうできます… 例えば

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

はおおよそ以下と同等です…

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

上記は D Hobson dhobson@yahoo.com 氏が提供した初期のメモから修正されたものです。


   -adaptive-sharpen
        画像のエッジの周りだけを鮮明にする

   -segment cluster-threshold x smoothing-threshold
         色空間のセグメンテーション(画像オブジェクトではない)
         これは非常に冗長な出力を生むことがあります。
         詳しく知りたいなら、これは「ファジー c 平均法アルゴリズム」を適用します。

関連するものに -despeckle もあります。単一の異色ピクセルを除去します。

2 つの画像(それぞれの目用に 1 つ)から 3D ステレオグラムを生成します
これはアナグリフとしても知られています
  magick composite left.jpg right.jpg -stereo anaglyph.jpg

Shade 3D ハイライト

Shade の使い方

[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータは、ImageMagick が提供する最も興味深いオペレータの一つだと常々思っています。このオペレータのドキュメントは、その能力についておおまかなヒントを与えるだけでした。このオペレータを理解し、それが IM ユーザーに提供できる力を最もうまく使う方法を見つけ出すのに、多くの個人的な研究が必要でした。基本的にこのオペレータがやることは、与えられた画像が「高さフィールド」と呼ばれるものであると仮定することです。つまり、何らかのオブジェクトや地形の表面を表すグレースケール画像です。「white」の色は画像内の最も高い点を表し、「black」は最も低い点を表します。この表現は、強い「カメラ光」を使った写真で近い点を明るく、遠い点を暗くした 1980 年のコンピュータビジョン研究から来ています。 [-shade](https://imagemagick.org/command-line-options/#shade)」にはグレースケール画像が必要なので、オペレータは入力画像から色を自動的に除去します。同様に、画像に存在しうる透明度は完全に無用で、オペレータによって無視されます。
さて「[-shade](https://imagemagick.org/command-line-options/#shade)」はこのグレースケールの高さフィールドを取り、その上に光を当てます。結果は、こうして生成される光の陰影の表現です。出力が意味をなすためには、入力画像を「表面」として考えなければならないことを覚えておいてください。デモのためには「高さフィールド」画像が必要なので、一つ描いてみましょう。
  magick -font Candice -pointsize 64 -background black -fill white \
          label:A  -trim +repage -bordercolor black -border 10x5 \
          shade_a_mask.gif

[IM Output]
この画像は図形の「マスク」と同等でもあり、しばしば「[-shade](https://imagemagick.org/command-line-options/#shade)」への入力としてだけでなく、shade した結果から同じ形状を切り出すための画像のマスキングにも使われます。下記のShade 画像のマスキングを参照してください。「[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータにとって、この画像は平らな黒い平野に、平らな白い台地が垂直に上方へ立ち上がっているように見えます。したがって、この画像のエッジだけが興味深い効果を生みます。この効果のために、2 つの引数は光が当たる方向を定義します。最初の引数は光が来る direction(方向)です。そのため「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

ご覧のとおり、elevation が「0」だと、図形は光が来る側だけがハイライトされます。他のすべては黒です。他のどの表面にも光が当たらないからです。私はこれを「Dawn ハイライト」と呼んでおり、それ独自の特別な用途があります。これは注目すべき最初の項目につながります。「[-shade](https://imagemagick.org/command-line-options/#shade)」される画像は、ハイライトされた領域よりも暗い、または影になった領域が多くなることがよくあります。陰影は均等ではありません。光が「高さフィールド」画像の上で高くなるにつれて、画像全体の明るさはより白くなり、「真昼」または elevation が「90」になると、平らな領域はすべて鮮やかな白になり、斜面とエッジだけが灰色に陰影付けされ、中間グレーが最大、つまり「崖のような」斜面の変化になります。この「正午」の画像は、エッジ検出システムに少し似た別の特殊なケースですが、鋭いエッジに対しては 2 〜 4 ピクセルの幅になります。私は過去にこの画像を、「[-shade](https://imagemagick.org/command-line-options/#shade)」画像のベベルエッジ用のマスクを生成して、平らな領域を透明にするために使ったことがあります。elevation 角度が「90」度を超えると、光が反対の方向から来た場合と同じ結果が得られます。そのため引数「0x135」は「180x45」と全く同じ結果を生みます。負の elevation 角度も同じ結果を生み、光が下から「半透明」のような表面に当たってくるかのようになります。そのため「0x-45」は「0x45」と同じになります。言い換えると、特定の shade に対して、通常は同じ結果を生む他の 4 つの引数があります。上記から、私は shade 出力を直接使うには引数「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](https://imagemagick.org/command-line-options/#shade)」の主要な問題の一つは、実際に生成されるベベルの厚さです。上で使ったような鋭いエッジは、マスクされた領域の内側と外側の両方に、常に約 4 ピクセル幅のベベルを生成します。「[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータを使う前後で画像をリサイズすることを除けば、この厚さを調整する方法はありません。特定の elevation 照明角度から「平らな領域」がどれだけ明るくなるかを知りたい場合は、以下のコマンドを使って平らな単色表面を 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]

ご覧のとおり、elevation が「45」度だと、約 70% グレーというかなり明るい平らな色が生成されます。これは一般的な表示にとって妥当なグレーレベルです。ただし、さまざまな図形の 3D ハイライトを生成するために shade を使う予定なら、実際のグレーレベルが非常に重要になります。これについては後でオーバーレイハイライトを作るで見ていきます。つまり、これが基本的に「[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータのすべてです。しかし、それを効果的に使うことは、次に見ていく一連の技法と可能性を提示します。

Shade した図形のマスキング

上で述べたように、単純な「マスク」形状は、単純な形状から複雑な 3D 効果を生成するために「[-shade](https://imagemagick.org/command-line-options/#shade)」とともによく使われます。例えば、直接 shade したマスク画像にこれをやってみましょう。

  magick shade_direction_135.gif  shade_a_mask.gif \
          -alpha Off -compose CopyOpacity -composite   shade_beveled.png

[IM Output] [IM Output] [IM Output]

[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータが生成するベベルの約半分が、実際にはマスクされた領域の外側に落ちることに注目してください。言い換えると、まっすぐなベベルはマスクされると半分になります。一方、垂直または「真昼」の shade 画像(「90」度の elevation 角度を使用)は、ベベルエッジだけを抽出し、画像の中心を空洞のまま残すために使えます。

  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 画像は「[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータの効果の位置(と強度)をマスクする方法を提供する一方で、実際にはそれらの効果を完全には覆わないことに注意してください。「真昼」の 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 では、前に生成した「shade」画像をすべて同じコマンド内で生成できることを覚えておいてください。そのため、上記は完全にゼロから生成できたはずです。例えば。 |

  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 した図形画像

Alpha 抽出オペレータは、形状を持つ画像からアルファチャンネルをグレースケールマスクとして抽出するだけでなく、「オフにされた」アルファチャンネルに形状を保持するという副作用もあります。「オフにされている」ので、「[-shade](https://imagemagick.org/command-line-options/#shade)」を含む多くの画像処理オペレータに触られず、そのディテールが保持されます。これが意味するのは、形状を持つ画像については、形状を抽出し、作業を行い、そしてすべての画像処理が終わった後に、単にAlpha Onを再度行うだけで透明度を復元できる、ということです!例えば、ここでは透明な背景に「ハート」を描き、画像をぼかして 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]
言えることはただ WOW、なんという時間節約でしょう!あらゆる追加処理と画像クローンを伴う前のコマンドよりもずっと単純です。

Shade のエッジを丸める

前の例で見たように、図形マスクをぼかすことで、エッジの「崖」の「斜面」が、時の流れで摩耗したかのように滑らかになります。これは shade 画像に良い丸み効果を生みます。

  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

ご覧のとおり、ぼかしはエッジを丸めるだけでなく、照明効果を暗くします。結果を normalize して、最も明るい点と最も暗い点をそれぞれ純粋な白と黒の色に戻すことで、結果のコントラストを最大化できます。

  magick shade_blur_3.gif   -normalize  shade_blur_3n.gif

[IM Output] [IM Output]

これの唯一の欠点は、これが一般に shade した画像を暗くすることです。これはオーバーレイハイライトを作るで考慮に入れる必要があります。この shade 画像を直接マスクすることでも仕上げてみましょう…

  magick shade_blur_3n.gif shade_circle_mask.gif \
          -alpha Off -compose CopyOpacity -composite   shade_blur_3n_mask.png

[IM Output] [IM Output]

ご覧のとおり、マスク画像をぼかすことで、結果の形状のエッジが非常にきれいに丸められます。

オーバーレイハイライトを作る

[-shade](https://imagemagick.org/command-line-options/#shade)」オペレータの出力は非常に良いですが、実際に図形の単純なグレースケール画像が欲しいことはまれです。必要なのは何らかの色です。しかしこれはそれほど簡単ではありません。色を加える 2 つの主要な方法、つまりグレースケールを再着色するだけの中間調の色付けと、グレーの領域を画像で置き換える「Overlay」アルファ合成は、どちらも特殊な形のグレースケール画像に依存します。つまり、完璧な中間調グレー(「grey50」)が色や画像で置き換えられ、より白いまたは暗いグレーが、適切に色や画像を白くしたり暗くしたりします。未修正領域に完璧な中間調グレーを持つこれらの特殊なグレースケール「オーバーレイハイライト」画像は、「[-shade](https://imagemagick.org/command-line-options/#shade)」を使って作るのはそれほど簡単ではありません。しかし、以下は私が発見したより単純な方法のいくつかです。「[-shade](https://imagemagick.org/command-line-options/#shade)」で 30 度の仰角照明角度を使うのは、shade される図形の平らな領域に完璧な中間調グレーを生成する一つの方法です。例えば、ここでは画像を shade してから、左上のピクセルを抽出して、画像の「平らな」部分の結果の色を確認します。 [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](https://imagemagick.org/command-line-options/#blur)」の丸め効果を変えると、shade 画像の結果のハイライト強度も変動する傾向があります。つまり、大きなぼかしを使うとよく丸められた見た目のエッジが生成されますが、ハイライトもほとんど見えないほど暗くなります。これは、「[-shade](https://imagemagick.org/command-line-options/#shade)」画像の出力に、ハイライトをオーバーレイ画像として効果的にするためのコントラストをもっと多く加える必要があることを意味します。これを修正するには、この丸め調整からコントラスト効果を取り除く方法が必要です。これを行う典型的な方法は単に画像を「[-normalize](https://imagemagick.org/command-line-options/#normalize)」することですが、これを 30 度の shade 画像に対して行うと、「平らな」領域はもはや完璧なグレーではなくなります。例えば… | |

  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 度の shade 仰角を使うと、normalize した後に、望ましい完璧な中間調グレーレベルと、良い強いハイライト効果の両方が生成されることが分かりました。 | |

  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]


shade 画像は今や「[-normalize](https://imagemagick.org/command-line-options/#normalize)」オペレータを通されるので、「エッジを丸める」ために使う「[-blur](https://imagemagick.org/command-line-options/#blur)」値は、結果の最終的な強度にもはや影響しません。はるかに良い方法です。まとめると、shade 画像をnormalizeすると、中間調が完璧なグレー色から離れる方向にシフトします。これで、他の調整とは完全に独立して、生成されるハイライトの出力強度を調整できます。通常、normalize した結果は極端なので、ハイライトを望ましいレベルに減らすための制御された脱 normalize、つまりアンチコントラスト制御が必要になります。結果のハイライトを調整する最も単純な方法は、画像を完璧なグレーで色付けすることです。これは画像内のすべての色レベルを中央の純粋な中間調グレー色に向けてシフトさせます。例えば…

  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

ハイライトを単に線形に色付けする代わりに、その全体的な効果を減らしつつ、ハイライトの極端な明暗のスポットを保持する方法として、代わりにシグモイド非線形コントラストを使うこともできます。これはハイライト効果により「自然な」見た目を与え、表面がより反射的であるかのように、ハイライトをより明るくできます。ただし、この技法をより効果的にするには、shade 結果に純粋な白と黒の色がないようにする必要があります。これは、まず「[-normalize](https://imagemagick.org/command-line-options/#normalize)」ではなく「[-contrast-stretch](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#blur)" : 図形のエッジを丸める (0.001=ベベル 2=滑らか 10=丸い)
"[shade](https://imagemagick.org/command-line-options/#shade)" : 光が来る方向 (120=左上 60=右上)
"[sigmoidal](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" : 表面反射制御のハイライトスポット (1=平坦 5=良好 10=反射的)
"[colorize](https://imagemagick.org/command-line-options/#colorize)" : ハイライトの全体的なコントラスト ( 0%=明るい 10%=良好 50%=暗い )

上記の例は元の「circle」形状に整形されていますが、透明度は「Overlay」合成が適用された後にのみ復元すべきで、その前ではないことに注意してください。また、同じ形状に対して(任意の回転が行われた後に)ハイライトを繰り返し使う予定なら、使う予定の各形状についてハイライトオーバーレイを一度事前生成し、複数回再利用するために結果を保存できます。この shade オーバーレイの再利用の例は、平らなソース画像からの 3D DVD カバーの生成で、IM ディスカッションフォーラムにあります。上記の技法を実験することも強くお勧めします。これらは、平らな形状の画像をずっとリアルに見せるための鍵だからです。ハイライトについて他のアイデアを思いついたら、教えてください。

FUTURE:
   オーバーレイ画像の色付け
   画像とのオーバーレイアルファ合成

Dawn Shade ハイライトを使う

上のShade 画像のマスキングでは、「真昼」または「正午」の shade 画像(elevation90」を使用)が、「[-shade](https://imagemagick.org/command-line-options/#shade)」が生成する効果の位置と範囲をマスクするのにどれだけ有用かを示しました。しかし、形状の水平または「夜明け」の shade 画像(elevation0」を使用)も、かなり有用です。例えば、白または黒の画像のマスクとして使って、形状に別々のハイライトと陰影の効果を生成できます。これはまた、形状にほぼ等しい量の明暗の領域(あるいは等しくない量さえも)を確実に持たせるのにも使えます。私はそれらを別々に、しかし完全に制御された方法で生成します。

FUTURE: ここにさらなる詳細を

このテクニックを使う例については、最初の高度な 3D ロゴを参照してください。


FX、自作の画像オペレータを使う 画像リストオペレータ「[-fx](https://imagemagick.org/command-line-options/#fx)」は、ほぼあらゆる画像演算を作るのに使えるため、IM オペレータの特定のカテゴリに当てはまらない汎用の自作オペレータです。その使用例はこれらのページ全体に渡っていますが、ここでは特にその能力と、それをどう使えるかを見ていきます。このコマンドはその能力において非常に汎用的なので、次のようなことができます。

  • キャンバス、グラデーション、数学的カラーマップを作成する。
  • 画像間やチャンネル間で色値を移動する。
  • 想像できるほぼあらゆる方法で画像の色を調整する。
  • 画像を平行移動、反転、ミラー、回転、スケール、シアー、その他一般的に歪める。
  • 複数の画像をマージまたは合成する。
  • 画像を奇妙で素晴らしい方法でタイル化する。
  • 隣接ピクセルを畳み込んだりマージしたりする。
  • 画像のメトリクスや「フィンガープリント」を生成する。
  • 画像を変わった方法で比較する。

もちろん、これらの技法の多くはすでに IM の一部であり、より速く、より柔軟な結果を生みます。しかし、組み込まれていなければ「[-fx](https://imagemagick.org/command-line-options/#fx)」を使って望む演算の独自版を生成できます。実際、私や他の人々は、後で IM のコアライブラリに組み込まれる新しい演算をプロトタイプするのによくこれを使ってきました。例として自作の新しい順序ディザ置換を参照してください。ここでは「[-fx](https://imagemagick.org/command-line-options/#fx)」を使って「[-ordered-dither](https://imagemagick.org/command-line-options/#ordered-dither)」オペレータの改訂版を開発しました。このオペレータは本質的に、1 つ以上の画像に対して自由形式の数学演算を実行できます。コマンドの公式の要約については、ImageMagick ウェブサイトFX、特殊効果画像オペレータを参照してください。

FX の基本的な使い方

このコマンドは、好きなだけの入力画像のシーケンスを取ります。通常は 1 つか 2 つの画像で、すべての入力画像を、「[-fx](https://imagemagick.org/command-line-options/#fx)」関数の結果で修正された最初の画像のコピーで置き換えます。つまり、最初の画像にあるメタデータはすべて「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータの結果に保持されます。数学的に使いやすくするため、与えられるすべての色値は 0.0 〜 1.0 の範囲の値に正規化されます。結果もこの範囲に収まることが期待されます。これには透明度すなわちアルファチャンネルも含まれ、0.0(完全に透明を意味する)から 1.0(完全に不透明を意味する)まで取ります。値は「アルファ透明度」を表し、実際には IM が通常内部で透明度を格納する方法(matte 値として)の逆です。しかし、この形式の方が数学的により正確で使いやすいです。「[-channel](https://imagemagick.org/command-line-options/#channel)」設定は、最初の(「ゼロ番目」または「u」とも呼ばれる)画像内のどのチャンネルが「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータの結果で置き換えられるかを定義します。これはデフォルトでは、元画像のカラーチャンネル(「RGB」)だけに限定されます。その画像に既存の透明度があっても、「[-channel](https://imagemagick.org/command-line-options/#channel)」設定がアルファ(「A」)チャンネルを含むように変更されない限り、修正されません。式は各ピクセルにつき 1 回、さらに処理されるピクセル内の各カラーチャンネルにつき 1 回実行されます。また、式は実行されるたびに再解析されるので、複雑な式は大きな画像での処理に時間がかかることがあります。例えば、ここでは黒い画像を定義しますが、その後で青チャンネルを半分の明るさに設定して、代わりに「navy blue」色を形成します。 |

  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](https://imagemagick.org/command-line-options/#fx)」を使わずに生成できたはずですが、既存の画像に対してこれができることが、これを強力な画像オペレータにしています。関数は実際、メモリ内の現在の画像シーケンスにあるどの画像からも、任意のピクセル、または特定の色を読み取って使えます。最初の「ゼロ」画像には「u」という特別な名前が与えられます。2 番目の画像は「v」です。メモリ内の他の画像はインデックスで参照できます。そのため「u[3]」は現在の画像シーケンス内の 4 番目の画像で、「u[-1]」はシーケンス内の最後の画像です。これは画像リストオペレータで使われるのと同じインデックス方式なので、すぐに馴染めるはずです。他の修飾子が与えられない場合、使われる色値は指定された画像で使われる同じ色です。つまり、赤い色を使いたいと明示的に言わない限り、コマンドがそのとき処理しているカラーチャンネルの色値を使います。つまり、青チャンネルを処理しているときは青の色値に式を適用します。別途指示されない限り、(デフォルトの「[-channel](https://imagemagick.org/command-line-options/#channel)」設定で設定された)RGB の各色値を、画像内のすべてのピクセルについて処理します。つまり、3wh 回の計算で、与えられた式によって画像内のすべての値を修正します。例えば、ここでは IM 組み込みの「rose:」画像を取り、すべてのピクセル値を 50% 倍します。 |

  magick rose: -fx 'u*1.5'    fx_rose_brighten.gif

[IM Output]
上記の例では、個々の赤、緑、青の値それぞれが 1.5 倍されました。結果の値が 0 〜 1 の範囲外になると、HDRI 版の ImageMagickを使っていない限り、適切な境界(この場合は 1.0)に制限されます。画像を再着色するための他の多くの「[-fx](https://imagemagick.org/command-line-options/#fx)」式は、数学的な色調整ヒストグラムカーブで探求されています。最初の画像を修正する式の一部として、現在の画像シーケンス内の任意の画像も参照できるので、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](https://imagemagick.org/command-line-options/#fx)」がまず最初の画像だけのコピーを作ることです。それから、与えられた他のすべての画像を使って、式に従ってその画像を修正します。そして最後に、すべての入力画像を破棄し、修正された最初の画像のコピーで置き換えます。画像内の各ピクセル位置に基づいて値を計算することもできます。値「i,j」は処理されているピクセルの現在の位置で、「w,h」は画像のサイズ(特定の画像修飾子が与えられない限り最初の画像)を与えます。例えば、ここでは自作グラデーション画像を生成します。 |

  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]
グレースケールのグラデーションを生成するとき、上記の例の「G」つまり緑チャンネルのように、1 つのカラーチャンネルだけを処理するよう求めることで、-fx オペレータを約 3 倍速く動作させられます。このチャンネルはその後Separateして最終的なグレースケール画像を生成できます。これは、特に非常に複雑な「[-fx](https://imagemagick.org/command-line-options/#fx)」式を使うときに、非常に大きな速度向上になります。さらに多くの FX 生成グラデーションについては、自分でグラデーションを作るの例を参照してください。 位置情報を使って、「p{x,y}」構文でソース画像から特定のピクセルを参照できます。例えば、各ピクセルを元のソースの「ミラー」位置の色値で置き換える独自の「ミラー画像」型関数(「[-flop](https://imagemagick.org/command-line-options/#flop)」画像オペレータのような)を簡単に作れます。 |

  magick rose: -fx  'p{w-i-1,j}'  fx_rose_mirror.gif

[IM Output]
この種の「画像歪み」は、画像の形で歪み画像マッピング、または他の種類の値ルックアップテーブルを作ることで、より強力になりました。これを行う例は自作のディザパターンとしきい値マップで提供されており、そこでは FX を使って特定の色を他の画像のパターンで置き換えます。 さて、FX 式によって生成される最終画像のサイズは、与えられた最初の画像と同じです。そのため、より大きな画像を生成するには、最初の画像を望むサイズに設定する必要があります。この種の状況では、2 番目(あるいは 3 番目)の画像を色のソースとして使えます(そのため次の例でSwapがあります)。例えば、ここでは 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 自作オペレータを使って画像歪みを行うことは、このオペレータが実際にどれほど強力かを示しています。このオペレータがなければ、歪み、sparse-color、順序ディザのような新しい演算の多くが ImageMagick コアライブラリに追加されることはなかったでしょう。ここではもう少し単純なもの、rose 画像の赤と青のチャンネルを入れ替えるものを示します。どう動くか分かるか試してみてください。 |

  magick rose: \( +clone -channel R -fx B \) \
          +swap -channel B -fx v.R     fx_rb_swap.gif

[IM Output]
| _同じことをするより速くより良い方法は、「[-separate](https://imagemagick.org/command-line-options/#separate)」と「[-combine](https://imagemagick.org/command-line-options/#combine)」を使うことです。RGB チャンネル画像の結合を参照してください。あるいは、「[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)」を使えば、同じことをさらに速くできます。

ここに傾向が見えますか?_
---|---
デフォルトの「[-channel](https://imagemagick.org/command-line-options/#channel)」設定として、これは「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータの出力を 3 つのカラーチャンネルだけに限定します。これは、アルファすなわち透明度チャンネルに影響を与えたい場合、チャンネル設定を変更して明示的に指定する必要があることを意味します。例えば、すべてのアルファチャンネル値を半分に設定して、半透明の「rose:」画像を作ってみましょう。 |

  magick rose: -alpha set  -channel A  -fx '0.5'    fx_rose_trans.png

[IM Output]
上記が正しく動作するには、「[-fx](https://imagemagick.org/command-line-options/#fx)」が扱うためのアルファチャンネルを「rose:」が実際に持つようにする必要があったことに注意してください。これはアルファチャンネル制御オペレータで行いました。「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータの画像の RGBA チャンネルを操作するこの能力が、このオペレータをチャンネルとマスクの操作に最適なものにしています。
IM 6.2.10 以降では、「[-fx](https://imagemagick.org/command-line-options/#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](https://imagemagick.org/command-line-options/#fx)」が使う単純なトークン化処理のため、変数名は文字だけで構成され、数字を含んではいけません。また、多くの単一文字が画像情報にアクセスする内部変数に使われているので、変数名は少なくとも 2 文字の長さにすることをお勧めします。そのため、私は単なる「x」や「y」ではなく「xx」と「yy」を使います。
---|---
| _「[-fx](https://imagemagick.org/command-line-options/#fx)」関数「rr=hypot(xx,yy)」は、非常によく使われる式「rr=sqrt(xx*xx+yy*yy)」を高速化するために IM v6.3.6 に追加されました。

もちろん、距離の二乗が必要な場合は、「hypot()」関数とそれが含む sqrt() 関数を避けるべきです。_
---|---
本当に複雑な式のさらなる例については、より複雑な自作グラデーションを参照してください。これは複数文の代入なしでは不可能でしょう。FX 形式の透視歪みについても同じことが言えます。IM バージョン 6.3.0-1 以降、「[-fx](https://imagemagick.org/command-line-options/#fx)」式の複雑さは外部ファイルを必要とし始めたので、標準の「@_filename_」を使って式をファイルから読み込めるようになりました。 |

   echo "u*2" | magick rose: -fx "@-"  fx_file.png

[IM Output]
これはまた、特定の仕事のための具体的な FX 式を生成するために、より複雑なスクリプトを使えることも意味します。内部的には、ファイルは単に文字列に読み込まれ、通常どおり解釈されます。「[-fx](https://imagemagick.org/command-line-options/#fx)」にとって重要な他の設定は「[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)」と「[-interpolate](https://imagemagick.org/command-line-options/#interpolate)」です。仮想ピクセル設定では、ルックアップ座標が入力画像のカバーする領域の外に出たときに返すべき色や画像結果を設定できます。これにより、ぼかしのようなものの端の効果を設定したり、より広い領域に画像をタイル化したりできます。補間設定では、ルックアップ座標(浮動小数点値)が入力画像内のピクセルの整数座標の間に落ちたときに、IM が隣接ピクセルの色をどのように混ぜるべきかを指定できます。さらなる情報については補間ピクセルルックアップを参照してください。 | さらにいくつかの関数がさまざまな時期に追加されました
IM v6.3.6 : hypot()
IM v6.7.3-4 : while(), not(), guass(), squish()

---|---

FX のデバッグ

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

  magick rose: -fx 'i==10&&j==10?debug(u):1; u' null:

[IM Output]
出力は標準出力ではなく標準エラーに出ることを覚えておいてください。そうすれば、問題なくこれをコマンドパイプラインで使えます。FX 式がその 1 つのピクセルだけについて、各チャンネルにつき 1 回、計 3 回実行されたことに注目してください。これにピクセル数を掛けてみれば、この小さな画像でさえ「debug()」が 1 ピクセルだけに限定されていなかった場合の出力の長さが想像できるでしょう。

FX に似た組み込み演算

[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータは、以前は ImageMagick に存在しなかった新しい画像処理関数を開発する方法を表します。ユーザーによるそのような開発の結果、ImageMagick はカラールックアップテーブル(「[-clut](https://imagemagick.org/command-line-options/#clut)」)のような新しい関数やメソッドで拡張できました。しかし一般に、新しいメソッドが「[-fx](https://imagemagick.org/command-line-options/#fx)」を使って安定したら、その式はより速い組み込み演算に変換され、通常は類似オペレータのグループの一部として追加されます。これらには以下の一般的な画像オペレータとそのメソッドが含まれます… -evaluate | 直接的なピクセル、色値、チャンネル修正関数。
(下記のEvaluateを参照)。
---|---
-function | より複雑なピクセル、色値、チャンネル修正関数。
(下記のFunctionを参照)。
-evaluate-sequence | 複数画像のシーケンスを数学的にマージする
(下記のEvaluate-Sequenceを参照)。
-sparse-color | 一般的な画像再着色オペレータ。
Sparse Color グラデーションを参照)
-compose | 一般的な複数画像の結合とオーバーレイのメソッド。
アルファ合成を参照)。
-distort | 逆ピクセルマッピングを使った一般的な画像歪みオペレータ。
Distort オペレータを参照)
-morphology | 一般的な領域効果の畳み込み/モルフォロジー関数。
Morphology オペレータConvolve オペレータを参照)
人々が新しい種類の画像演算を開発するとき、通常はまず「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータを使ってプロトタイプします。それを練り上げると、その「メソッド」は ImageMagick コアライブラリの新しい超高速な組み込みオペレータに変換されます。ユーザーは、IM への有用な追加になると信じる独自の「[-fx](https://imagemagick.org/command-line-options/#fx)」式(または他の定義済み関数)で、まだ他の画像オペレータでカバーされていないものを貢献することを歓迎されます。それが上記の汎用オペレータの一つで扱える場合、追加するのは比較的簡単なはずです。例えば、私自身が 2 つの画像を比較するための「色が似ていればマスク」型の演算を必要としました。これは新しい「[-compose](https://imagemagick.org/command-line-options/#compose)」メソッド「[ChangeMask](compose.html#changemask)」として追加されました。これにより、GIF アニメーションのより複雑な透明度最適化を追加できました。「[-fx](https://imagemagick.org/command-line-options/#fx)」の速度と複雑さが問題になり始めたら、PerlMagick のような API スクリプト言語に移行する方がおそらく良いでしょう。PerlMagick を使うこの例「[pixel_fx.pl](https://github.com/ImageMagick/ImageMagick/blob/main/PerlMagick/demo/pixel-fx.pl)」は、その API の配布物の一部です。

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

IM バージョン 6.2.10 以降では、「[-format](https://imagemagick.org/command-line-options/#format)」や「[-annotate](https://imagemagick.org/command-line-options/#annotate)」引数で使われるような画像プロパティエスケープ文字列の中でFX 式を使えるようになりました。エスケープシーケンス「%[fx:...]」は浮動小数点値としての数値で置き換えられ、現在の画像シーケンス内の各画像につき 1 回計算されます。ただしFX 式は処理中にわずかに修正されます。具体的には…

  • 現在のピクセル座標「i」、「j」は値 0 に固定されるので、それ単独では画像変数はピクセル 0,0 の値だけを返します。「p{}」インデックスが使われない限り。
  • カラーチャンネルが選択されない限り、赤チャンネルの値だけが返されます。
  • デフォルトの画像参照「s」は、アノテートまたは識別されている現在の画像に設定されます。
  • インデックス「t」は「s」が参照する画像のインデックスを返します。

| IM v6.6.8-6 以前は、「t」画像インデックスと「n」画像の総数の両方の FX 式の値が壊れており、すべての画像についてそれぞれ 0 と 1 の値だけを返していました。同等のパーセントエスケープ「%p」と「%n」についても同じです。
---|---
例えば、ここでは各画像をその左上隅の色で「[-annotate](https://imagemagick.org/command-line-options/#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 で追加されました。このオペレータは、各画像内の各チャンネルにつき 1 回、与えられた FX 式を呼び出し、返された値を 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](basics.html#identify)」コマンドで「[-format](https://imagemagick.org/command-line-options/#format)」を使って、結果を直接出力するだけのこともできます。 |

  magick identify -format '%[fx:atan(1)*4]' null:

[IM Output]
これは PI の値を数学的に計算して返しますが、この値は組み込み変数「pi」としても利用できます。乱数を生成できます。例えば、-5 から 10(両端を含む)の整数を生成するには。ここでは「magick identify」コマンドの「[info:](https://usage.imagemagick.org/files/#info:)」同等版を使います。 |

  magick xc: -format '%[fx:int(rand()*16)-5]' info:

[IM Output]
さらなるメソッドについてはIdentify の代替: テキスト出力オプションを参照してください。また、画像の幅と高さの情報に基づいて描画文字列を生成するためにFX 式を使った角を丸めた枠も参照してください。FX 式を使って画像の位置を計算したり、他の画像のサイズと位置を使って配置したりできます(逐次計算される位置を参照)。計算された値に基づいて新しいファイルを生成するために、ファイル名のパーセントエスケープの中でFX エスケープを使うこともできます。例については、タイル切り抜きの最後の例を参照してください。
上記のすべては本質的に「[-format](https://imagemagick.org/command-line-options/#format)」を実行し、したがってそれに含まれるFX 式を、現在の画像シーケンス内の各画像につき 1 回実行します。「[-print](https://imagemagick.org/command-line-options/#print)」オペレータは「[-identify](https://imagemagick.org/command-line-options/#identify)」とよく似た働きをしますが、現在の画像シーケンス内のすべての画像にアクセスして、1 回だけ実行される点が異なります。このオペレータでは、上記とは違って「u[{i}]」を使って任意の画像から値にアクセスできます。
FX 式は他の色空間の画像に適用できるので、例えば 3 つの異なる色について(「赤」チャンネルの)「Hue」値を調べられます。 |

  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](https://imagemagick.org/command-line-options/#print)」を使うこともできます。これは画像シーケンス全体に対して 1 回だけ適用されます。つまり、このオペレータを使って、複数の画像を含むはるかに複雑な「%[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](https://imagemagick.org/command-line-options/#set)」オプションに、与えた設定を画像の「Attribute」や「Properties」文字列としてではなく、「[-define](https://imagemagick.org/command-line-options/#define)」ができるのと同じようにグローバルなArtifactとして保存したいことを伝えます。ただし、「[-set](https://imagemagick.org/command-line-options/#set)」形式では、Artifactを設定する際にパーセントエスケープを展開できますが、「[-define](https://imagemagick.org/command-line-options/#define)」ではできません。「label:」オペレータがパーセントエスケープを展開するとき、与えられた「key」はまず画像ごとの「attribute」または「properties」として探されますが、何も見つからなければ、グローバルなArtifact設定でその「key」を探します。そのため、前の画像から作成したグローバルな「artifact」が、Artifactが作成されたときにその画像がもう存在しなくても使われます。基本的に「Artifact」設定は「magick」コマンドの生存期間中グローバルなので、ある画像から別の画像へ情報を渡すのに使えます。プログラムされた API では、必要なデータを画像から直接読み取り、IM にそれほど複雑な方法でその情報を保存させる必要なく、ラベル文字列を自分で生成できるので、この状況は避けられます。


Evaluate と Function、自由形式のチャンネル修正子

FX オペレータは解釈される式ハンドラなので、単純な画像修正をより速く行えるように「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」オペレータが追加されました。後に、複雑な画像調整での柔軟性を高めるため、より複雑な「[-function](https://imagemagick.org/command-line-options/#function)」オペレータが IM v6.4.8-8 で追加されました。これら 2 つのオペレータは、「[-negate](https://imagemagick.org/command-line-options/#negate)」や「[-level](https://imagemagick.org/command-line-options/#level)」のような他の画像レベル調整オペレータとともに、画像を適用する前にグレースケール画像へのちょっとした調整を行うのにおそらく最も有用でしょう。特に、背景除去ハイライトと影のオーバーレイ画像マップの生成と微調整に使われるようなグレースケール画像で。

Evaluate、単純な数学演算

[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」オペレータは基本的に「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータの高速だが非常に単純な版です(実際には IM への追加よりほんの数か月先行しています)。ただし、ユーザーが提供する単一の定数を使う 1 つの単純な演算だけに限定されます。evaluate に組み込まれている関数は、以下を使って調べられます。

  magick -list evaluate

これには典型的な数学関数「add」、「subtract」、「multiply」、「divide」が、定数値に対して含まれます。「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータとは違い、値は 0 〜 1 の範囲に正規化されず、画像の実際の色値のままです。そのため、Q8 の IM(品質と深度を参照)で値 50 を減算すると大きな減算になりますが、Q16 版の IM では、ほとんど気づかないほど小さな変化にしかなりません。ただし、引数に「%」を加えると、その引数は最大色値(「QuantumRange」として知られ、「2 _quality_ -1」に等しい)のパーセンテージを表します。これは、適切な evaluate メソッドにパーセンテージを適切に使うことで、「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」引数を IM の品質レベルに依存しないものにできることを意味します。 例えば、画像内のすべての色値を 50% グレーレベルに単純に置き換えるのは、「Set」を使えば非常に単純で非常に高速です。 |

  magick rose: -evaluate set 50%  rose_set_gray.gif

[IM Output]
[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」オペレータには、典型的な数学関数「add」、「subtract」、「multiply」、「divide」も含まれます。 例えば、画像のコントラストを半分にするには、「divide」で「2」で割り、「add」で「25%」を加えて完璧なグレーを中心に再配置できます。 |

  magick rose: -evaluate divide 2 -evaluate add 25%  rose_de-constrast.gif

[IM Output]
これは「u/2+.25」で「[-fx](https://imagemagick.org/command-line-options/#fx)」オペレータを直接使うよりも数桁速いです。そのため、可能な限り「[-fx](https://imagemagick.org/command-line-options/#fx)」よりこのオペレータを優先して使うべきです。「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」の 主要な 問題は、各修正値が画像データに保存し戻されるとき、すべての結果が 0 〜「QuantumRange」の限界に(HDRI 版の ImageMagickを使っていない限り)クリップされることです。つまり、個々の「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」演算の後、値は「QuantumRange」によってクリップされる可能性があります。 そのため、コントラスト強調関数(「[-fx](https://imagemagick.org/command-line-options/#fx) '2*u-.25'」と同等)をそのまま直接適用しようとすると、減算が行われる前に倍化された値がクリップされてしまうので、正しい結果を得られません。 |

  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](https://imagemagick.org/command-line-options/#evaluate)」メソッドを使うときは、色値のクリップに気をつけてください。
[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」オペレータは、「[-fx](https://imagemagick.org/command-line-options/#fx)」(および他のほとんどの低レベル IM オペレータ)と同様に、「[-channel](https://imagemagick.org/command-line-options/#channel)」の影響を受けます。これにより、画像のアルファ透明度をカラーチャンネルとは別に制御できます。そしてその通り、「[-fx](https://imagemagick.org/command-line-options/#fx)」と同様に、透明度は「matte 値」ではなく「アルファ値」として扱われます。例えば、Dissolve型の演算の一部として画像を 50% 透明にするには。 |

  magick rose: -alpha set  -channel A -evaluate divide 2   rose_transparent.png

[IM Output]
結果は半透明の画像で、表示されるとき、見える色の半分がウェブページの背景色になることを意味します。そのため、表示される画像は背景色に向けて暗くなります。また、特定の目的のためにさまざまなチャンネルを別々の画像に分離する前に、個々のカラーチャンネルに「[-evaluate](https://imagemagick.org/command-line-options/#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 つの画像は、生成されたグラデーションのプロファイルを、グラフと元画像そのものの両方で示しています。これにより、あるグラデーション画像がどのように別のものに修正されたかが見やすくなります。これは IM Examples のScriptsディレクトリにあるスクリプト「[im_profile](../static/img/scripts/im_profile)」を介して、Gnuplotグラフ作成プログラムを使って生成されました。
---|---
これは実際にはガンマ調整オペレータと同等ですが、引数が反転しています。例えば「-gamma 2」演算は「-evaluate pow 0.5」つまり「平方根」演算関数と同等になります。同様に「-gamma 0.5」は「-evaluate pow 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)」と同等です。これは四分円の弧を 1 つ生成し、それをFlopしてAppendで結合し、半円弧を生成します。また、多くの個別の(小さな)ステップを必要とするにもかかわらず、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 Evaluate メソッドと非常に似ているように見えるかもしれませんが、まったく同じではありません。「Log」は「0」に近づくにつれて感知できる傾きを生みますが、「Pow」は垂直な傾きを生みます。値が傾きを制御します。対数関数は指数関数とも密接に関連しており、これは現在シグモイドコントラスト調整オペレータとしてのみ実装されています。これには上記の対数曲線で見られるのと同じ傾きの特徴が含まれます。これが、「[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#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

本質的に、これらの関数がやることは、画像の値(通常はグレースケール値)をサイン/コサイン曲線に再マッピングすることです。例えば、ここではグラデーション画像を取り、これらの evaluate メソッドを使って修正します。

  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]

さて、定数パラメータは角度の乗数なので、evaluate メソッドに与える値が、画像内のグラデーション全体にわたってその数だけのピークを作ります。 |

  magick gradient.png -evaluate cos 5  -negate  eval_cos_5.png

[IM Output] [IM Output]
これは、リップルや分散効果の生成から、リップル状の変位曲線の生成まで、多くのタスクに最適です。乗数定数「0.5」を使うことで、線形グラデーションを、元と同じ傾きを持つサイン曲線グラデーションに単純に変えられます。結果を negate することで、グラデーションが正しく傾斜するようにできます。 |

  magick gradient.png -evaluate cos 0.5  -negate  eval_cos.5.png

[IM Output] [IM Output]
これは写真を重ね合わせるのに使う滑らかなグラデーションの生成に最適です。ただし、これら最後の 2 つの「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」メソッドは、単純な周波数オプション以上の、より多くの制御オプションを提供するより一般的なSinusoid 関数(下記参照)に取って代わられたため、めったに使われません。


Function、複数引数の Evaluate

上記の波生成器は、特に歪み画像マッピングで非常に有用であることが分かりました。しかし、関数のはるかに細かい制御が必要で、複数のパラメータが必要であることが分かりました。このため、「[-function](https://imagemagick.org/command-line-options/#function)」オペレータが IM v6.4.8-9 で追加されました。基本的に「[-function](https://imagemagick.org/command-line-options/#function)」は「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」の複数引数形式です。ただし、Evaluate オペレータとは違い、これらのオペレータは数学演算子のように、上記のすべての関数が画像の正規化されたチャンネル値(0.0 〜 1.0 の範囲)でのみ動作し、ほとんどの場合これにより使いやすくなります。

多項式関数

polynomial」メソッドは任意の数の値を取り、与えられた正確な式に従って、FX オペレータができるよりずっと速く、画像内の色値を修正します。

-function   Polynomial   a,b,c,...

各値は最高次から最低次までの係数として使われ、与えられた項数を持つ多項式を生成します。例えば引数「4,-4,1」は「[-fx](https://imagemagick.org/command-line-options/#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]
さらにずっと複雑なグラデーション、例えば四次多項式さえ作れます。これは「レベル制御点」のセットを使ってカーブレベル調整を生成した結果です。これは通常、画像にさまざまな陰影効果を与えるために、画像の色を調整するのに使われます。 |

  magick gradient.png -function Polynomial '-25, 53, -36, 8.3, 0.2' \
          func_quartic.png

[IM Output] [IM Output]
もちろん、Level オペレータを使った場合とまったく同じように、単純な線形修正も可能です… |

  magick gradient.png -function Polynomial '4, -1.5' func_linear.png

[IM Output] [IM Output]
ただし、完全なしきい値演算を行うには無限の係数が必要なため、「Polynomial」でそれを行うことはできません。かなり近づけることはできますが。単一の値は自然にただの定数で、その値の直接代入になります。言い換えると、これはまさに「[-evaluate](https://imagemagick.org/command-line-options/#evaluate) Set」メソッドのようなもので、この場合は 33% グレー値です。 |

  magick gradient.png -function Polynomial 0.33 func_constant.png

[IM Output] [IM Output]
Polynomial」を他の数学関数と組み合わせることで、さらに複雑なグラデーション修正を作れます。例えば多項式の平方根を取ることで、線形グラデーション上に真の円弧を作れます。同等の「[-fx](https://imagemagick.org/command-line-options/#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 Evaluate メソッドも参照してください。

Sinusoid 関数

Sinusoid」関数メソッドは、「[-evaluate](https://imagemagick.org/command-line-options/#evaluate)」メソッドの「sin」と「cos」のはるかに高度な版で、実際それらの関数を再現できますが、画像内の色値をどう修正するかについてずっと良い制御ができます。

-function   Sinusoid   frequency,phase,amplitude,bias

そして以下の式を使って実装されます…

  value = ampl * sin(2*PI( freq*value + phase/360 ) ) + bias

これは複雑に見えるかもしれませんが、関数が使いやすいことを保証します。上記とまったく同じように動作する最初の値「frequency」だけが必須で、他のすべてのパラメータはオプションです。デフォルトではサイン曲線を生成します。 |

  magick gradient.png -function Sinusoid 1    func_sine.png

[IM Output] [IM Output]
度単位の「phase」引数を加えることで、曲線の開始角度を指定できます。デフォルトのサイン曲線をコサインに変えられます。 |

  magick gradient.png -function Sinusoid 1,90   func_cosine.png

[IM Output] [IM Output]
「frequency」と「phase」を調整することで、線形グラデーションを黒から白へ(サイン曲線に沿って最小から最大へ)進む滑らかな正弦波グラデーションに直接変えられます。より間接的な方法についてはEvaluate Cosine メソッドを参照してください。 |

  magick gradient.png -function Sinusoid 0.5,-90 func_sine_grad.png

[IM Output] [IM Output]
次の 2 つのオプション値「amplitude」と「bias」は、正弦波曲線のスケールと中心線を制御します。例えば、ここでは白とグレーの間で振動する波(negate したコサイン曲線)を作ります(値は 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]
これら最後のパラメータには注意してください。波形が色値の範囲の境界を簡単に超えてしまい、(HDRI 版の ImageMagickを使っていない限り)クリップされる可能性があるからです。

Arcsin 関数

逆正弦関数「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]
結果の曲線の「width」を半分にすると… |

  magick gradient.png -function Arcsin 0.5    func_arcsin_width.png

[IM Output] [IM Output]
center」では、入力グレー値に従って曲線を再配置できます。 |

  magick gradient.png -function Arcsin 0.4,0.7 func_arcsin_center.png

[IM Output] [IM Output]
range」引数では色値の出力範囲を減らせ、「bias」はその範囲の中心を調整します。 |

  magick gradient.png -function Arcsin 0.5,0.5,0.5,0.5  func_arcsin_range.png

[IM Output] [IM Output]
関数の結果として無効になる値がどう扱われるかに注目してください。これにより、関数が変位で使われるときのより良い制御が可能になり、それらをきれいにする方法を提供します。実際に使われる値は、予想どおり「_bias_ ± _range_ /2」です。「width」または「range」のどちらかが負にされると、その負の値の結果として関数の傾きが反転することに注意してください。 |

  magick gradient.png -function Arcsin -1    func_arcsin_neg.png

[IM Output] [IM Output]

Arctan 関数

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]
つまり、グラデーションの中間部分は実際には変更されないまま残り、黒と白の端だけがコントラストを下げられます。曲線の「slope」が大きくなるにつれて、中心のグラデーションがその分だけ強くなります(中央でより圧縮される)。 |

  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 つの引数「range」では、生成される値の出力範囲を調整できます。例えば、この値を少し広げることで、可能な値の全範囲を完全にカバーするようにできます。 |

  magick gradient.png -function Arctan 5,0.7,1.2 func_arctan_range.png

[IM Output] [IM Output]
ただし、この方法で画像のコントラスト全体を修正する曲線を本当に生成したい場合は、この目的のために設計されたシグモイドコントラストオペレータを使う方が一般的です。「Arctan」グラデーション関数のより典型的な用途は、特定の値に非常に素早く近づくが、その値を超えない曲線を作ることです。「range」と「bias」引数が制御するのは、これらの限界値です。例えば、この曲線は画像内のグラデーションを修正して、入力グレーレベル 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 つ以上のグラデーション画像で何らかの数学をしたい場合はどうでしょう。つまり、あるグラデーションを別の画像のグラデーションを使って修正するのです。これには特別な数学合成メソッド(「[Plus](compose.html#plus)」や「[Divide](#divide)」など)を使う必要があります。しかし始める前に、一つ 警告 をしておきたいと思います。グラデーション画像がアルファチャンネルのない純粋なグレースケール画像なら、数学合成メソッドを直接使えます。ただし、これらのメソッドを特定のチャンネルに限定したり、アルファ(透明度)チャンネルに適用したりしたい場合は、特別な「Sync」チャンネルフラグなしで、適切な「[-channel](https://imagemagick.org/command-line-options/#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]

さて、これを減衰させるために、サイン波を線形グラデーションと、Multiplyアルファ合成を使って乗算します…

  magick math_sine.png  math_linear.png  \
          -compose Multiply -composite  math_sine_2.png

[IM Output] [IM Output] [IM Output]

しかしこれを例えば水の波紋、変位マップで使うには、波が完璧なグレーの周りに中心化されたままでなければなりません。これを行うには、元画像にバイアスを加える必要があります。これはたまたま、元画像を乗算するために使ったのと同じ関数を negate して 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] [IM Output] [IM Output]

こうして、変位マップでの使用に適した、線形に減衰したサイン波グラデーションが得られました。

もちろん、すべての処理を 1 つのコマンドで行えますし、単純な線形減衰である必要もありません。例えば、ここでは高周波サイン波を、線形グラデーションの代わりに negate したコサイン波を使って減衰させます。

  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 Output] 減衰 [IM Output] [IM Output]

IM v6.5.4-3 以降では、特別な数学合成メソッドを使って、上記のすべてのステップを 1 つの compose メソッドで行えるようになりました。基本的に、減衰演算が式 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]
同じ結果は、まず多項式関数を使って減衰グラデーションを調整し、それからExclusion compose オペレータを使って画像をマージすることでも実現できます。 |

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

[IM Output]

バイアス付きグラデーションを乗算する

しかし、両方の関数がバイアス付きで、完璧なグレーがゼロを意味し、黒と白が -1 から +1 までの範囲を表す場合はどうでしょう?さて、これは少し複雑です。乗算は負の値を含みうるので、単にそれらを乗算して正しく出ることを期待できないからです。これには、値をクリップして結果の画像で曲線の正しい negate を得るために、注意が必要です。コツは乗算を複数のステップに分けることです。つまり A × BA × abs(B) × sign(B) とも書けます。こうすることで、通常のグラデーション画像に格納できない負の値での乗算を避けられます。だから必要なのは、バイアスグラデーションの一方を取り、それを 2 つの部分に分けて、他方のグラデーションに適切に適用できるようにすることだけです。バイアス付きグラデーションの「sign()」、つまりどの部分が負かのマスクを得るには、バイアスレベルでグラデーションにしきい値を使って抽出できます。後でそのしきい値画像を使い、合成 Differenceで他方のグラデーションを選択的に negate できます。バイアス付きグラデーションの「abs()」は、Solarizeを使い、それを negate して倍化(Levelを使用)することで、0.0 〜 1.0 の範囲のグラデーションの絶対値を得るために簡単に抽出できます。乗算の一部としてバイアスオフセットも必要になるので(上記の減衰のように)、グラデーションの絶対値に変換される前の、negate して半分にスケールした 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 つの部分が得られたので、それらを他方のグラデーションとマージできます。これを行うには、絶対値で乗算し、バイアスを再加算し、それから負にすべき部分を negate します。

  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] [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] [IM Output] [IM Output]

最後に一つ注記を。減衰とは違い、このバイアス付きグラデーションの乗算は可換です。つまり、入力画像を入れ替えても最終結果に影響しません。上記は式 2*Sc*Dc-Sc-Dc+1 と同等なので、IM v6.5.4-3 以降では、引数「2,-1,-1,1」を使って上記の複雑なステップを単一の「[Mathematics](compose.html#mathematics)」compose メソッドとして実装できます。 |

  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]
つまり、この引数付き compose メソッドなしで必要な十数ステップ以上よりも、はるかに簡単で速い方法です。たまたまその式を見たとき、これが単に「[Exclusion](compose.html#exclusion)」compose メソッドの negate であることに気づきました。奇妙ですが本当です。そのため、以下も同じゼロバイアス乗算を生成します。 |

  magick math_sine.png  math_cosine_peak.png \
          -compose exclusion -composite -negate  math_excl_neg.png

[IM Output]

バイアス付きグラデーションを加算する

[Mathematics](compose.html#mathematics)」compose メソッドの登場で、バイアス付きグラデーションの加算も比較的簡単になりました。同等の FX 式は「u+v-0.5」つまり compose 引数「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]

上記で、複数画像の合成を実装するために「[-background](https://imagemagick.org/command-line-options/#background)」設定とともに「[-flatten](https://imagemagick.org/command-line-options/#flatten)」オペレータをどう使ったかに注目してください。この場合は、与えられたすべての画像に背景定数を加えた「バイアス付きの和」です。

周波数変調

ある関数の出力に別の関数を直接適用しても、単純な結果は生まれません。理由は、これらすべての数学関数が、グラデーション内のピクセルの 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 ) )

言い換えると可変周波数で、周波数は最初のサイン曲線のグラデーションとともに変化します。基本的に、元画像でグラデーションが速く変化するほど、ピーク間の距離が小さくなります。ただし、ピークの高さ(振幅)は変化しません。これは実際、一見単純な関数が非常に複雑な結果を生む「周波数変調」がどう機能するかです。


作成中

その他の画像変形技法

これらはまだ例示されていませんが有用かもしれないいくつかの基本的な
IM 開発の変形です興味深い効果があれば貢献してください

   画像をピクセル化する
      画像を 10 まで縮小してから 10 までスケールしておおよそ平均化された
      色のブロックを生成する
      例えば
         magick input.jpg -resize 10% -sample 1000% output.jpg

  わずかに回転した画像の傾き補正

    -deskew {threshold}
       画像をまっすぐにするしきい値 40% がほとんどの画像で機能する

    -set option:deskew:auto-crop {width} を使うと画像を自動切り抜きするset
    引数は画像背景のピクセル幅: 40)。

    プログラム的にはメディアンフィルタを画像に適用してソルトペッパー
    ノイズを除去することで自動切り抜きする次にファズ係数: -fuzz 5%
    メディアンフィルタ画像の画像境界を得る最後にその境界で元画像を
    切り抜くコードは以下のようになる:

      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);

    [「ノイズの多い」画像のトリミング](crop.html#trim_blur)を参照

  セグメンテーション
    スクリプトを見てください
       [divide_vert](https://usage.imagemagick.org/scripts/divide_vert)
       [segment_image](https://usage.imagemagick.org/scripts/segment_image)
    よく定義された画像をより小さな部分にセグメント化するために私が書いた
    いくつかの単純なスクリプトですこのような単純なセグメンテーション関数を
    コアライブラリに入れてGIF アニメーションの自動分割やスキャンした
    ドキュメントからの画像や図の分離のようなことを可能にしたいと思っています