ImageMagick の例 --
画像変換
- 索引
-
ImageMagick の例 序文と索引
-
アート風の変換
-
コンピュータビジョン変換
-
シェーディングによる 3D ハイライト
-
FX(DIY 画像演算子)の使用
-
Evaluate と Function、高速 FX 演算子
-
グラデーションに対する数学演算
アート風の変換
盛り上がった境界線または凹んだ境界線
「-raise
」演算子は、非常に単純な画像変換であるため、ほとんどそうではありません。これは、既存の画像に長方形のベベルハイライトを追加するだけです。
|
![]() |
|
![]() |
-raise
」演算子は、境界線として余分なピクセルを追加する代わりに、画像のエッジピクセルを再着色します。これにより、画像変換になります。![]() ![]() |
実際には、画像のフレーミングは、境界線を追加してから、それを盛り上げることで実現されます! |
![]() ![]() |
この演算子は長方形の画像でのみ機能し、透明な背景を持つ画像では失敗します。なぜなら、色の変更も透明になるからです。基本的に、これはかなり単純な演算子です! |
内側の境界線を追加する
ユーザーは、画像の外側に境界線を追加するのではなく、画像のエッジにオーバーレイする境界線を追加したいと考えていました。解決策は、画像の周りに長方形を描画することでした。組み込みの rose in は 70x46 ピクセルであるため、これが結果です。
|
![]() |
-strokewidth
」によって制御されます。つまり{stroke width} = {border width} * 2 - 1
-strokewidth
」11 が必要です。画像のサイズがわからない場合は、画像をシェイブしてから、通常どおり境界線を追加できます。これはおそらくより簡単ですが、それほど多用途ではないかもしれません。
|
![]() |
ランダムなピクセル拡散
「-spread
」は、各ピクセルをソース画像からのランダムな近くの色の色で置き換えます。ピクセル補間と仮想ピクセル設定の使用に従って、このランダムな選択が行われました。例えば…
|
![]() |
また、「-spread 」も仮想ピクセル設定を使用することに注意してください。
|
![]() |
-interpolate Nearest
」を使用して、特定のピクセルの色ルックアップを強制することで、この色の混合を防ぐことができます。仮想ピクセルと可能性のある「エッジカラーバイアス」の問題を回避するには、「-virtual-pixel Mirror
」を使用することをお勧めします。そのため、これはより伝統的なランダムなピクセルの「拡散」です…
|
![]() |


+spread
」を使用して画像内のピクセルを実際に交換できるため、画像内のピクセルは複製または失われません。元の画像のすべてのピクセルはまだ存在しますが、新しい位置に移動されています。ただし、ピクセルの処理方法により、ピクセルが「二重交換」される可能性があります。つまり、特定のピクセルが交換される可能性がありますが、後で別のピクセルと再度交換するように選択される可能性があります。つまり、特定のピクセルは、spread 引数によって要求されたよりもさらにドリフトする可能性があります。この二重交換は、ピクセルが右下隅に向かってさらに広がる可能性が高いことも意味します。もちろん、その動きはバランスが取れていますが、多数のピクセルが左上隅に向かってわずかにドリフトします。たとえば、ここでは、参照として元の画像を先頭に付けてピクセルを拡散します。
|
![]() |
|
![]() |
ヴィネット写真の変換
画像を柔らかなぼやけた輪郭を持つ円形にする特別な演算子。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
複雑なポラロイド変換
Timothy Hunter(RMagick の名声)が行った作業のおかげで、「-polaroid
」変換演算子が IM v6.3.2 に追加されました。
Polaroid® は、Polaroid Corporation の登録商標です。
たとえば、ここでは、写真のサムネイルにポラロイドのような外観を与えています。この画像は、凱旋門内にあるらせん階段(下向き)、パリを見ています。非常に長い階段です!
|
![]() |
![]() ![]() |
結果の画像には半透明の影があるため、PNG 形式の画像を使用するか、GIF または JPG 形式で固定背景色に「-flatten 」する必要があります。 |
-bordercolor
」設定に従って境界線を追加し、紙を「カール」させ、影に逆カールを追加するからです。影の色は、「-background
」色の設定で制御できます。上記のように、演算子のプラス形式は結果をランダムな量だけ回転させます。この演算子は、写真の索引を、そうでなければ得られるものよりもはるかに面白く、静的でないものにします。演算子のマイナス形式を使用すると、画像の回転角度を制御できます。
|
![]() |
画像に「-caption 」メタデータがある場合、そのテキストも「caption: 」画像作成演算子を介してポラロイドフレームの下部に追加されます。つまり、写真の幅に折り返されます。
|
![]() |
他の標準的なテキスト設定(「caption: 」に従って)を使用すると、追加されたキャプションの外観を制御できます。
|
![]() |
![]() ![]() |
画像メタデータ属性「-caption 」は、「caption: 」テキストから画像へのジェネレータの内部使用のために使用されました。一方、IM コマンド「 montage 」は「-label 」を使用します。なぜなら、単語の折り返しを行わない「label: 」テキストから画像へのジェネレータを使用するからです。 |
-density
」の2倍で描画する必要があります。「-pointsize
」を大きくしないでください。テキストはまったく同じ方法で拡大されません。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]](../images/rose.gif)

![[IM Output]](rose_paint_1.gif)
![[IM Output]](rose_paint_3.gif)
![[IM Output]](rose_paint_5.gif)
![[IM Output]](rose_paint_10.gif)

![[IM Output]](rose_blur_paint_10.gif)
-paint
"は単色の領域を生成することになっていますが、半径値が大きいと、一部の領域で垂直方向のグラデーションが発生する傾向があります。これは非常に厄介で、バグの可能性があります。ご存知の方はいませんか?"-paint
"を使用する代替手段があります。1つは"-statistic Mode
"を使用する方法です。これは、指定された長方形の近傍内の「主要な色」で各ピクセルを割り当て、より良い結果を得ることができます。
|
![]() |
|
![]() |
|
![]() |
木炭画、シーンのアーティストスケッチ
チャコール効果は、指定された画像のアーティストによるチャコールスケッチをシミュレートすることを目的としています。"-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]](../images/rose.gif)

![[IM Output]](rose_charcoal_1.gif)
![[IM Output]](rose_charcoal_3.gif)
![[IM Output]](rose_charcoal_5.gif)
![]() ![]() |
技術的には"-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]](../images/rose.gif)

![[IM Output]](rose_emboss_0x05.gif)
![[IM Output]](rose_emboss_0x09.gif)
![[IM Output]](rose_emboss_0x10.gif)
![[IM Output]](rose_emboss_0x11.gif)
![[IM Output]](rose_emboss_0x12.gif)
![[IM Output]](rose_emboss_0x20.gif)
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]](../images/rose_grey.gif)

![[IM Output]](rose_g_emboss_0x05.gif)
![[IM Output]](rose_g_emboss_0x09.gif)
![[IM Output]](rose_g_emboss_0x10.gif)
![[IM Output]](rose_g_emboss_0x11.gif)
![[IM Output]](rose_g_emboss_0x12.gif)
![[IM Output]](rose_g_emboss_0x20.gif)
If anyone knows exactly what the emboss algorithm is supposed to do, please let me know.
ステガノグラフィ:画像の中に秘密の画像を隠す
"-stegano
"オペレーターは、実際にはどちらかというと「楽しい」オペレーターです。たとえば、スパイがランダムな画像の「カオス」の中に情報を隠すために使用できます。まず警告を…
JPEG、GIF、またはその他の「可逆圧縮ではない」画像エンコーディングをステガノグラフィで使用しないでください。
例として、仲間のスパイに送信したい暗号化されたメッセージ(画像)を生成してみましょう…
|
![]() |
||
|
|
![]() |
|
![]() |
|
![]() |
||
|
|
![]() |
画像データの暗号化
"-encipher
"および"-decipher
"オペレーターは、基本的に画像データを解読できない状態に暗号化します。つまり、画像の内容自体は、後で復号されるまでまったく認識できなくなります。これは、たとえば、公開サービス上の機密画像を保護するために使用できます。機密のパスフレーズを持つ他のユーザーのみが後で表示できるようになります。しかし、まず警告を…
JPEG、GIF、またはその他の「可逆圧縮ではない」画像エンコーディングを暗号化で使用しないでください。
例として、上記で作成した秘密のメッセージ画像を、それほど「秘密」ではないファイル"pass_phrase.txt"に保存したパスフレーズを使用して暗号化してみましょう。
![]() ![]() |
暗号化された画像は、8ビット画像ファイル形式を使用して保存されていると想定しています。そのため、出力ファイルへの最終的な保存の前に"-depth 8 "を設定して、その制限を適用することをお勧めします。" png24 "も上記で必要であり、出力ファイルがパレットまたはカラーマップされた"png8:"画像にならないようにします。これも正しく動作しません。 |
|
![]() |
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]](message.gif)

![[IM Output]](message_obfuscate.png)

![[IM Output]](message_restored_2.png)
-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]](message.gif)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_signed.png)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_restored_3.png)
-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]](message.gif)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_binary.png)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_restored_4.png)
![]() ![]() |
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]](../images/rose.gif)

![[IM Output]](rose_pixelate_sampled.gif)
![[IM Output]](rose_pixelate_scaled.gif)
![[IM Output]](rose_pixelate_resized.gif)
ピクセルのグリッド
グリッド化された画像は、ピクセル化された画像と非常に似ています。この場合、画像を拡大して、画像の詳細の明確なピクセルレベルのビューを生成したいと考えています。通常は非常に小さな画像です。最も簡単な方法は、前の例のように、小さな画像を拡大縮小してピクセルを拡大することです。
magick rose: -crop 10x10+12+20 +resize grid_input.png magick grid_input.png -scale 1000% grid_scale.png |
![[IM Output]](grid_input.png)

![[IM Output]](grid_scale.png)
ここでは、スクリーン合成(白を重ね合わせ、黒い領域はそのままにする)を使用して重ね合わせた白黒の「グリッド」を生成します。
|
![]() |
scale*image_size+gap_size
(この場合は10*10+1 => 101)であることに注意してください。また、最終的な画像サイズが縮小された画像(サイズが1ピクセル小さい)ではなく、タイル画像から取得されるように、2つの画像を入れ替えました。ただし、タイル画像を宛先として使用したため、元の画像にあった画像メタデータが失われる可能性があります。ここでは、円形の色の「スポット」を生成しますが、今回は乗算合成(黒を重ね合わせ、白い領域はそのままにする)を使用しました。
|
![]() |
たとえば、ここでは基本的な形態演算子を使用して、色のオーバーレイにひし形の形をした「穴」を生成します。そのためには、ダイヤモンド形態カーネルを使用して、単一の「シード」ピクセルを描画して展開します。
|
![]() |
![]() ![]() |
"tile: "コーダーは、画像内の透明度を現在の背景色で置き換えることに注意してください。タイリング画像の透明度を保持する場合は、「-background none 」または「-compose Src 」を設定します。前者の方が簡単です。 |
タイルの間隔をあける
同様の問題として、画像内のタイルグリッドの間隔があります。これは、個々のピクセルを「ピクセルブロック」に単純に拡大縮小するのではなく、画像の矩形領域の間にスペースを挿入することです。つまり、画像に一定の間隔で余分なピクセルを挿入することです。現在、最適な解決策は、画像を行と列に分割し、各タイルに余分な間隔を挿入してから、タイルを連結することです。例を以下に示します。
magick rose: -background SkyBlue \ -crop 10x0 +repage -splice 3x0 +append \ -crop 0x10 +repage -splice 0x3 -append \ grid_tile.png |
![[IM Output]](../images/rose.gif)

![[IM Output]](grid_tile.png)
|
![]() |
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]](mask.gif)

![[IM Output]](mask_edge_1.gif)
![[IM Output]](mask_edge_2.gif)
![[IM Output]](mask_edge_3.gif)
![[IM Output]](mask_edge_10.gif)
-edge
"演算子の結果を使用する場合、この事実は非常に重要になる可能性があります。たとえば、黒い輪郭を含む画像のエッジ検出を行っている場合、「-edge
」演算子は黒い線を「二重化」して、奇妙な結果を生成します。
ただし、エッジ検出を行う前に画像を反転させると、二重化された線は内側に移動して結合され、「二重線」効果が除去されます。
|
![]() |
エッジは鋭すぎる傾向があり、結果の画像に滑らかではないエッジが生成されることがわかりました。そのため、結果に非常にわずかなぼかしを適用すると、見た目がかなり向上することがわかりました。
|
![]() |
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]](mask.gif)

![[IM Output]](mask_canny.gif)
![[IM Output]](piglet_canny.gif)
![[IM Output]](piglet_canny_neg.gif)
![[IM Output]](rose_canny.gif)
アンチエイリアシングされた形状からのエッジ輪郭
通常のエッジ検出方法の最大の課題は、結果が非常にエイリアシングされていることです。つまり、形状が滑らか(アンチエイリアシング)であるかエイリアシングされているかに関係なく、非常に階段状のピクセル効果を生成します。たとえば、ここでは、滑らかなアンチエイリアシングされた吹き出し(「WebDings」フォントの文字「(
」)を示します。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
ビットマップ形状からのエッジ輪郭
ビットマップ画像は、滑らかな輪郭を作成するために使用できるアンチエイリアシングされたピクセルがないため、はるかに困難です。たとえば、ここでは、「WebDings」フォント(文字「Y
」)から抽出された凝った「ハート」の形状を示します。ただし、ネットワークからダウンロードされたひどいビットマップ画像をシミュレートするために、意図的にエイリアシングされたビットマップとして生成しました。透明度を含むGIF画像の輪郭などです。
|
![]() |
|
![]() |
エッジを反転させると、黒い領域の内側のエッジ画像が生成されます。
|
![]() |
|
![]() |
EdgeIn
」形態学的方法、または同様のものを用いることで、わずかに優れたエッジを作成できます。
|
![]() |
-filter Cubic
」設定、またはその他のリサンプリングフィルターを追加することで、より太いエッジを生成できます。
|
![]() |
0.7
」のぼかしが最適であり、処理速度を上げるために3ピクセルの制限を設定しています。
|
![]() |
-evaluate multiply 2 -negate
」と同等です。アンチエイリアシングされた境界線を使用すると、元の形状を滑らかにしたいだけであれば、元の形状を再追加できます。輪郭は元の画像のエッジに正確に位置しているため、前の例よりも0.5ピクセル大きくなることに注意してください。形状(アンチエイリアシングまたはビットマップ)からアンチエイリアシングされた輪郭を生成する他の方法をご存知でしたら、メールまたはIMフォーラムでお知らせください。クレジットいたします。 ラスタからベクターへのコンバーターを使用したエッジ処理
最も理想的な解決策の1つは、非IMの「ラスタからベクターへの」変換プログラムを使用して、このビットマップ形状をベクター輪郭に変換することです。これを実行できるプログラムには、「ScanFont
」、「CorelTrace
」、「AbobeのStreamline
」、および「Vector Magic
」などがあります。ただし、これらのほとんどは、少なくともいくらかのお金がかかります。「VectorMagick」および別のトレースプログラム「AutoTracer
」には、無料で使用できるオンライン画像コンバーターがあります。その他の無料の解決策としては、「AutoTrace
」または「PoTrace
」などがあります。さらにご提案いただければ幸いです。これらのトレースプログラムは使い方は簡単ですが、通常はなんらかの前処理と後処理が必要です。入力形式は限られており、ベクター画像を出力するため、入力画像の「スムージングされた」形式が作成されます。「AutoTrace
」の方が、結果のSVGデータをスケーリングしないため、標準的な線幅が生成されますが、「パイプライン」で使用することはできません。最適な結果を得るには、しきい値処理によって入力画像を基本的なビットマップ画像にして、Autotraceが認識する画像形式に変換することをお勧めします。その後、その画像をSVGベクター画像に変換できます。
|
![]() |
![]() |
|
![]() |
![]() |
autotrace:
」画像入力デリゲートを使用して、上記のシーケンスを直接実行できます。これには、「autotrace
」コマンドがインストールされている必要があります。たとえば
|
![]() |
AutoTrace
」デリゲートライブラリを使用してビルドされている場合、IMはメモリ内の画像からSVG画像を直接生成することもできます。これの詳細については、SVG出力処理を参照してください。例として...SVG出力は、もちろん元の画像のスムージングされたバージョンを表しており、この例では実際に必要なものではありません。しかし、これでビットマップの形状がベクター形式で得られたため、SVGの「style
」属性を調整して、形状を「fill
」するのではなく、輪郭を「stroke
」するだけで済みます。修正されたSVGをImageMagickに再度入力して、クリーンな輪郭ラスタ画像を再作成できます。例として...
|
![]() |
autotrace
」コマンド自体にオプションとして輪郭またはその他の修正を指定できれば理想的ですが、現時点では機能していません。SVG出力をさらに変更してエッジを太くしたり、その他のストロークや背景色を指定したり、ベクターエッジ形状の塗りつぶしの色を変更したりすることもできます。たとえば、ここでは、すべてきれいにアンチエイリアシングされた、形状のより太い輪郭を赤い塗りつぶしで生成します。
|
![]() |
d="..."
」パス要素を抽出して、SVGパス文字列として描画コマンドで直接使用することもできます。これにより、そのベクター輪郭で他のIM描画設定を使用できるようになり、最終結果を完全に制御できます。「AutoTrace
」プログラムの別の例については、Autotraceを使用したスケルトンを参照してください。ハフ直線検出器
ハフ線検出器(IM v6.8.9-1に追加された「-hough-lines
」)は、多くの段階を含む非常に複雑な変換です(詳細については、Wikipedia、ハフ変換を参照)。基本的に、画像を調べ、黒い背景上の白い線を検出し、画像に存在する線分(線形シーケンスピクセル)の正確な位置を返すように設計されています。これは、画像の回転の削除や、画像の透視変換の決定(繰り返したり削除したりできる)などにとって非常に重要になる可能性があります。演算子のオプションの完全なセットを以下に示します。
-background {background} -stroke {line_color} -hough-lines {W}x{H}+{threshold} |
では、この画像にハフ線検出器を適用してみましょう。
|
![]() |
-hough-line
」演算子に指定したしきい値よりも大きくなります。これにより、最初と最後の線(非常に近い一致)はどちらも強さがほぼ等しいことがわかるため、一方を他方よりも選択することは困難です。このような状況が発生した場合は、エッジ検出ステップを改善することをお勧めします。MVG画像は、定義された色がありません。この例の色設定は実際には使用されませんでした。色は、前の例のように結果を「ラスタ」画像に変換するときにベクトルを実際に「描画」する場合にのみ使用されます。特殊なdefineを使用して、中間「検索画像」または「アキュムレータ」も表示できます。これは、すべての向きで白いピクセルを探しています。
|
![]() |
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」はグレースケール画像を必要とするため、オペレーターは入力画像から自動的に色を除去します。同様に、画像に存在する可能性のある透明度は完全に無効になり、オペレーターによって無視されます。 |
|
![]() |
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 |
![[diagram]](../img_diagrams/shade_elevation.gif)
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 |
magick -size 320x100 xc:black \ -font Candice -pointsize 72 -fill white \ -draw "text 25,65 'Anthony'" \ -shade 120x45 shade_anthony.jpg |
![[IM Output]](shade_anthony.jpg)
|
![[IM Text]](shade_elevation_45.txt.gif)
陰影付き形状のマスキング
上記で述べたように、単純な「マスク」形状は、「-shade」と共に使用して、単純な形状から複雑な3D効果を生成することがよくあります。たとえば、直接陰影を付けたマスク画像に対してこれを行いましょう。
magick shade_direction_135.gif shade_a_mask.gif \ -alpha Off -compose CopyOpacity -composite shade_beveled.png |
![[IM Output]](shade_direction_135.gif)

![[IM Output]](shade_a_mask.gif)

![[IM Output]](shade_beveled.png)
magick shade_direction_135.gif \ \( shade_elevation_90.gif -normalize -negate \) \ -alpha Off -compose CopyOpacity -composite shade_beveled_edge.png |
![[IM Output]](shade_direction_135.gif)

![[IM Output]](shade_elevation_90.gif)

![[IM Output]](shade_beveled_edge.png)
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
|
![]() |
シェーディングされた形状画像
アルファ抽出オペレーターは、形状のある画像からアルファチャンネルをグレースケールマスクとして抽出するだけでなく、オフになっているアルファチャンネルに形状を保持するという副作用もあります。オフになっているため、「-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 |
magick shade_blur_3n.gif shade_circle_mask.gif \ -alpha Off -compose CopyOpacity -composite shade_blur_3n_mask.png |
![[IM Output]](shade_blur_3n.gif)

![[IM Output]](shade_blur_3n_mask.png)
オーバーレイハイライトの作成
「-shade」オペレーターからの出力は非常に優れていますが、形状の単純なグレースケール画像を実際に必要とすることはめったにありません。必要なのは色です。ただし、2つの主な方法で色を追加することはそれほど簡単ではありません。中間色を色付けするはグレースケールを単に再着色するだけであり、「オーバーレイ」アルファ合成は、灰色の領域を画像で置き換えます。どちらも特殊な形式のグレースケール画像に依存しています。つまり、完璧な中間調の灰色(「`grey50`」)が色または画像で置き換えられ、白または暗い灰色は、必要に応じて色または画像を白くまたは暗くします。変更されていない領域に完璧な中間調の灰色を持つ、これらの特別なグレースケール「オーバーレイハイライト」画像は、「-shade」を使用して作成するのはそれほど簡単ではありません。ただし、私が発見したより簡単な方法をいくつか紹介します。「-shade」で30度の仰角照明角度を使用すると、形状の平らな領域に完璧な中間調の灰色を生成する1つの方法です。たとえば、ここでは画像に陰影を付け、左上のピクセルを抽出して、「平らな」画像部分の結果の色を確認します。
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|||
|
![]() |
||
|
|
![]() |
||
|
|
![]() |
||
|
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 |
![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
- 要約すると、上記の例には4つの別々のコントロールがあります…
- "
blur
":形状のエッジを丸める (0.001=面取り 2=滑らか 10=丸み) - "
shade
":光源の方向 (120=左上 60=右上) - "
sigmoidal
":表面反射制御ハイライトスポット (1=フラット 5=良好 10=反射性) - "
colorize
":ハイライトの全体的なコントラスト (0%=明るい 10%=良好 50%=暗い)
FUTURE: Color Tinting the Overlay image Overlay Alpha Composition with an Image
夜明けのシェーディングハイライトの使用
上記のシェード画像のマスキングでは、「真昼」または「正午」のシェード画像(「90
」の仰角を使用)が、「-shade
」によって生成される効果の位置と範囲をマスキングするのに役立つことを示しました。しかし、形状の水平方向または「夜明け」のシェード画像(「0
」の仰角を使用)も非常に役立ちます。たとえば、白または黒の画像のマスクとして使用して、形状に別々のハイライトとシェーディング効果を生成できます。これにより、形状にほぼ均等な量の明暗領域(または不均等な量)が得られるようにすることもできます。これは、別々に生成しますが、完全に制御された方法で行います。FUTURE: more detail hereこのテクニックの例については、最初の高度な3Dロゴを参照してください。
FX、DIY画像演算子の使用
画像リスト演算子 "-fx
" は、ほぼすべての画像操作を作成するために使用できるため、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回実行されます。また、式は実行されるたびに再解析されるため、複雑な式は大きな画像を処理するのに時間がかかる可能性があります。たとえば、ここでは黒い画像を定義しますが、青のチャンネルを半分の明るさに設定して、「紺色」の色を作成します。
|
![]() |
|
![]() |
![]() ![]() |
「-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%を掛けます。
|
![]() |
-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]](fx_red.gif)

![[IM Output]](fx_blue.gif)

![[IM Output]](fx_combine.gif)
![]() ![]() |
もちろん、代わりにチャンネルコピー合成方法を使用することもできますが、それははるかに高速です。しかし、それがポイントではありません。 逆もまた真なり。ほぼ全てのIM画像操作は、FXの同等の関数で置き換えることができます。 |
-fx
」はまず、最初の画像のコピーを作成します。その後、与えられた他の全ての画像を使用して、その画像を数式に従って変更します。そして最後に、全ての入力画像を破棄し、変更された最初の画像のコピーで置き換えます。画像内の各ピクセルの位置に基づいて値を計算することもできます。値「i,j
」は処理中のピクセルの現在の位置を表し、「w,h
」は画像のサイズ(特定の画像修飾子が指定されていない限り、最初の画像)を表します。例えば、ここではDIYグラデーション画像を生成します。
|
![]() |
あるいは、「i,j 」の位置値の両方を使った、より複雑な処理も可能です。
|
![]() |
-fx
」演算子の処理速度を約3倍速くすることができます。その方法は、上記の例のように「G
」(緑)チャンネルなど、1つのカラーチャンネルのみを処理するように指示するだけです。このチャンネルはその後分離され、最終的なグレースケール画像が生成されます。これは、特に非常に複雑な「-fx
」数式を使用する場合、非常に大きな速度向上をもたらす可能性があります。FXで生成されたグラデーションの詳細は、独自のグラデーションを作成するの例を参照してください。 位置情報を使用して、「p{x,y}
」構文でソース画像から特定のピクセルを参照することができます。例えば、「-flop
」画像演算子のような独自の「ミラーイメージ」型関数を簡単に作成でき、各ピクセルを元のソースの「ミラー」位置のカラー値で置き換えることができます。
|
![]() |
|
![]() |
0.5
」の値は、入力座標「i,j
」と位置ルックアップ「v.p{...}
」に使用されるピクセル座標の間を正しく変換するために必要であり、より数学的に正確な画像座標は実際の数学的計算(スケーリング)に必要です。上記は実際には、あらゆる種類の画像歪みで使用される正確な方法です。詳細な歪みサマリーを有効にすることで、ほとんどの歪みに対するこのFX同等物を確認できます。これは、歪みが期待通りに機能していることを二重に確認する方法として、ほとんどの画像歪みに対するFX同等物を報告します。FX DIY演算子を画像歪みに使用することは、この演算子がいかに強力であるかを示しています。この演算子がなければ、歪み、スパースカラー、順序付きディザリングなどの新しい操作の多くがImageMagickコアライブラリに追加されたとは考えられません。ここでは、rose画像の赤と青のチャンネルを入れ替える、少し簡単な例を示します。どのように機能するかを考えてみてください。
|
![]() |
![]() ![]() |
同じことをより高速かつ効率的に行う方法は、「-separate 」と「-combine 」を使用することです。RGBチャンネル画像の結合を参照してください。あるいは、「-color-matrix 」を使用して、さらに高速に同じ処理を行うこともできます。傾向が見えてきましたか? |
-channel
」設定では、「-fx
」演算子の出力が3つのカラーチャンネルに制限されます。つまり、アルファチャンネルまたは透過チャンネルに影響を与えたい場合は、チャンネル設定を変更して明示的に指定する必要があります。例えば、全てのアルファチャンネルの値を半分にすることで、半透明の「rose:
」画像を作成してみましょう。
|
![]() |
-fx
」が使用できるアルファチャンネルが「rose:
」に実際に存在することを確認する必要がありました。アルファチャンネル制御演算子を使用してこれを行いました。「-fx
」演算子は画像のRGBAチャンネルを操作できるため、チャンネルとマスクの操作に最適です。IM 6.2.10以降、「
-fx
」式に変数代入を追加できるようになりました。これにより、他の方法では基本的に不可能な、いくつかの式の複雑さを軽減できます。例えば、ここでは、特定の点(変数「xx
」と「yy
」に割り当てられている)からの距離に基づいてグラデーションを作成します。変数を使用しない場合、この数式は非常に読みづらくなる可能性があります。
|
![]() |
![]() ![]() |
「-fx 」で使用されている単純なトークン化処理のため、変数名は文字のみで構成され、数字を含めることはできません。また、多くの単一文字が画像情報のアクセスのための内部変数として使用されているため、変数名は少なくとも2文字以上の長さにすることをお勧めします。そのため、「x 」や「y 」ではなく「xx 」と「yy 」を使用します。 |
![]() ![]() |
「-fx 」関数「rr=hypot(xx,yy) 」は、非常に一般的に使用される式「rr=sqrt(xx*xx+yy*yy) 」を高速化するためにIM v6.3.6に追加されました。もちろん、2乗距離が必要な場合は、「 hypot() 」関数とその意味するsqrt() 関数を避ける必要があります。 |
-fx
」式の複雑さが外部ファイルが必要になり始めたため、標準の「@filename
」を使用して、ファイルから式を読み取ることができるようになりました。
|
![]() |
-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:
」画像ハンドラーを使用して、実際の画像結果は無視されます。
|
![]() |
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
」を付けます。
|
![]() ![]() ![]() |
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]](annotate_pixel.gif)
identify
」コマンドで「-format
」を使用して、結果を直接出力できます。
|
![]() |
pi
」として利用できます。乱数を生成できます。例えば、-5から10までの整数(両端を含む)を生成するには、次のようにします。「info:
」は「magick identify
」コマンドと同等です。
|
![]() |
上記のすべては、本質的に「
-format
」を実行し、したがって、現在の画像シーケンス内の各画像に対して1つずつFX式を含むものを実行します。「-print
」演算子は「-identify
」と非常によく似ていますが、現在の画像シーケンス内のすべての画像にアクセスして一度だけ実行される点が異なります。この演算子を使用すると、上記とは異なり、「u[{i}]
」を使用して任意の画像から値にアクセスできます。FX式は他の色空間の画像にも適用できるため、例えば3つの異なる色の「色相」値(「赤」チャンネル)を見つけることができます。
|
![]() |
gold
」、「yellow
」、「khaki
」の平均色を見つけるなど、直接的な色の計算にもIMを使用できます。
|
![]() |
|
![]() |
-print
」を使用して情報を印刷することもできます。これは、画像シーケンス全体に対して一度だけ適用されます。つまり、この演算子を使用して、複数の画像を含むはるかに複雑な「%[fx:...]
」式を計算できます。他の画像からのデータへのアクセス
ただし、FXエスケープ式を使用することには1つの深刻な問題があります。画像を作成する際に、IMは現在の画像シーケンス内の他の画像に直接アクセスできません。これは、新しい画像が一般的にメモリ内の以前の画像に依存しないため、一般的な画像作成では一般的に必要ありません。基本的に、描画している画像とは異なる画像の特定のピクセルの色を収集する場合(上記のように)、または新しい画像を作成する場合は、IMコア関数には目的の情報への直接リンクがありません。たとえば、ビルトインの「rose:
」画像のピクセル12,26(青みがかったピクセル)の色でラベルを作成しようとすると、直接的なアプローチは失敗します!
|
![]() |
|
![]() |
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
」を使用すると非常に簡単で高速です。
|
![]() |
-evaluate
」演算子には、典型的な数学関数「add
」、「subtract
」、「multiply
」、「divide
」も含まれています。 例えば、画像のコントラストを半分にするには、「divide
」を「2
」で割り、「25%
」をadd
して、完璧なグレーを中心に再配置します。
|
![]() |
-fx
」演算子と 'u/2+.25
' を直接使用するよりも、桁違いに高速です。したがって、可能な限り、「-fx
」演算子よりもこの演算子を使用する必要があります。 「-evaluate
」の主な問題は、すべての結果が0から'QuantumRange
'の範囲にクリップされることです(ImageMagickのHDRIバージョンを使用している場合を除く)。これは、変更された値が画像データに書き戻されるためです。つまり、個々の「-evaluate
」操作の後、値が'QuantumRange
'によってクリップされる可能性があります。 したがって、「-fx '2*u-.25'
」に相当するコントラスト強調関数を使用しようとすると、2倍の値が減算される前にクリップされるため、正しい結果が得られません。
|
![]() |
multiply
'によって、大きなカラー値がすべて最大値にクリップされ、次に'subtract
'によって下限値がクリップされます。その結果、上限値が正しくなくクリップされ、暗く、色が歪んだ結果が生成されます。 直接的な解決策は、適切な定数を最初に'subtract
'すること(下限値の最終的な正しいクリップを行う)で、乗算の前に実行し、効果的に'(u-.125)*2
'という等価な式を使用することです。
|
![]() |
-evaluate
」メソッドを複数使用する場合、カラー値のクリッピングに注意してください。「
-evaluate
」演算子は、「-fx
」(およびその他のほとんどの低レベルのIM演算子)と同様に、「-channel
」の影響を受けます。これにより、カラーチャネルとは別に画像のアルファ透過性を制御できます。そしてはい、「-fx
」と同様に、透過性は'マット'値ではなく'アルファ値'として扱われます。ディゾルブタイプの操作の一部として、画像を50%透過にする例を挙げます。
|
![]() |
-evaluate
」を使用する方が簡単な場合が多いこともわかりました(チャネルの分離を参照)。たとえば、ここでは、高速だが珍しいグレースケール化の方法として使用します。基本的に、各チャネルに適切な量を掛けてから、チャネルを分離して加算することにより、特定の色比率を使用してグレースケール化された画像を生成します。
|
![]() |
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]](gradient.png)
![[IM Output]](eval_pow_parabola.png)
![[IM Output]](eval_pow_sq_root.png)
![[IM Output]](gradient_pf.gif)

![[IM Output]](eval_pow_parabola_pf.gif)
![[IM Output]](eval_pow_sq_root_pf.gif)
![]() ![]() |
下部の3つの画像は、グラフと元の画像の両方で生成された勾配のプロファイルを正確に示しています。これにより、1つの勾配画像がどのように変更されて別の画像になったかを簡単に確認できます。これは、IM Examplesのスクリプトディレクトリにあるスクリプト「im_profile 」を介して、Gnuplotグラフプロットプログラムを使用して生成されました。 |
-gamma 2
」操作は「-evaluate pow 0.5
」または'平方根'操作関数と等価です。同様に、「-gamma 0.5
」は「-evaluate pow 2
」を使用して2乗することと等価です。特別な勾配操作を行うことで、この方法を使用して線形勾配を複雑な円弧に変換できます。
![]() |
![]() |
sqrt(1-u^2)
'と等価です。これにより、単一の四分円弧が生成され、次に反転され、追加されて、半円弧が生成されます。多くの小さな個々のステップが必要な場合でも、FX式を使用するよりもはるかに高速です。より高度な多項式関数も参照してください。対数
'Log
'関数(IM v6.4.2-1に追加)も正規化された値(無限大を回避するために1.0を追加)で動作し、与えられた定数が対数の底として使用されます。実際の式(正規化された値を使用)は次のとおりです。value = log(value*constant+1.0)/log(constant+1.0)例えば…
![]() |
![]() |
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]](eval_sin_1.png)
![[IM Output]](eval_cos_1.png)
![[IM Output]](gradient_pf.gif)

![[IM Output]](eval_sin_1_pf.gif)
![[IM Output]](eval_cos_1_pf.gif)
![]() |
![]() |
![]() |
![]() |
-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に戻る放物線曲線を生成することを知っているはずです。つまり、黒と白の色を'白'にし、完璧な灰色を'黒'にします。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Polynomial
'を使用して完全な閾値操作を行うことはできませんが、かなり近づくことができます。単一の値は自然に定数であり、その値の直接的な割り当てになります。言い換えれば、この場合、33%のグレー値への「-evaluate Set
」メソッドと同じです。
![]() |
![]() |
Polynomial
」を他の数学関数と組み合わせることで、さらに複雑なグラデーションの変更を作成できます。たとえば、多項式の平方根をとることで、線形グラデーション上に真の円弧を作成できます。「-fx
」の同等の式 'sqrt( -4*u^2 + 4*u + 0 )
'…
![]() |
![]() |
正弦波関数
「Sinusoid
」関数メソッドは、「-evaluate
」メソッドの 'sin
' と 'cos
' のはるかに高度なバージョンであり、実際にはそれらの関数を複製できますが、画像内の色値の変更方法をはるかに細かく制御できます。-function Sinusoid frequency,phase,amplitude,bias
value = ampl * sin(2*PI( freq*value + phase/360 ) ) + biasこれは複雑に見えるかもしれませんが、関数を使いやすくするために必要です。上記のとおりの動作をする最初の値「周波数」のみが必要であり、他のパラメーターはすべてオプションです。デフォルトでは正弦曲線が生成されます。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0.75 ±0.25
、つまり0.5~1.0
の範囲の値)の間で振動する波(負の余弦曲線)を作成し、白で開始と終了します。
![]() |
![]() |
逆正弦関数
逆正弦関数「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
までの全体の色範囲をカバーするように中心に配置されていることを保証します。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
バイアス ±範囲/2
」です。「幅」または「範囲」のいずれかを負の値にすると、その負の値の結果として関数の傾きが反転します。
![]() |
![]() |
逆正接関数
「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の変化(スケーリングなし)を生成し、白と黒はよりグレーの値になります。例えば
![]() |
![]() |
![]() |
![]() |
Arctan
」関数は、純粋な黒と白の出力範囲の制限に決して到達しません。これらの制限に近づきますが、決して超えることはありません。前の関数と同様に(そしてシグモイドコントラストと同様に)、第2引数は入力グラデーション値に対する曲線の位置を調整します。
![]() |
![]() |
![]() |
![]() |
Arctan
」グラデーション関数のより一般的な用途は、特定の値に非常に迅速に近づきますが、その値を超えることのない曲線を作成することです。「範囲」と「バイアス」引数は、これらの制限値を制御します。たとえば、この曲線は、画像のグラデーションを変更して、0.7の入力グレースケールレベルの周りの非常にシャープな閾値を作成しますが、値は0.5と1.0の範囲の制限間で変化します。
![]() |
![]() |
グラデーション画像に対する数学的操作
上記の関数は、グラデーション画像に対する非常に基本的な変換を提供します。しかし、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]](math_linear_pf.gif)

![[IM Output]](math_sine_pf.gif)
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]](math_sine_2_pf.gif)

![[IM Output]](math_bias_pf.gif)

![[IM Output]](math_attenuated_pf.gif)
もちろん、このプロセス全体を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出力]](math_sine_pf.gif)
![[IM出力]](math_cosine_peak_pf.gif)

![[IM出力]](math_cosine_atten_pf.gif)
Sc*Dc-.5*Sc+.5
または引数「1,-.5,0,.5
」であることを認識することによって。
|
![]() |
|
![]() |
バイアスされたグラデーションの乗算
しかし、両方の関数がバイアスがかかっており、完全なグレーがゼロを、黒と白が-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 |
![]() |
グラデーションの符号 白 = 負 |
|
![]() ![]() |
![]() |
バイアスオフセット |
![]() |
絶対値 | |
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 |
![]() |
![]() |
![]() ![]() ![]() |
![]() |
![]() ![]() ![]() |
|
符号 |
![]() ![]() ![]() |
|
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]](math_sine_pf.gif)

![[IM Output]](math_cosine_peak_pf.gif)

![[IM Output]](math_multiply_2_pf.gif)
2*Sc*Dc-Sc-Dc+1
という式と同等であるため、IM v6.5.4-3以降では、上記のような複雑な手順を、引数"2,-1,-1,1
"を使用する単一の'Mathematics
'合成メソッドとして実装できます。
|
![]() |
Exclusion
'合成メソッドの反転に過ぎないことに気づきました。奇妙ですが、本当です。そのため、次の操作でも同じゼロバイアスの掛け算が生成されます。
|
![]() |
バイアスされたグラデーションの加算
'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]](wave_1_pf.gif)

![[IM Output]](wave_2_pf.gif)

![[IM Output]](wave_3_pf.gif)

![[IM Output]](added_waves_pf.gif)
-flatten
"演算子と"-background
"設定を使用する方法を示しています。つまり、この場合は、指定されたすべての画像と背景定数の'バイアス和'です。周波数変調
ある関数の出力に直接別の関数を適用しても、単純な結果は得られません。その理由は、これらの数学関数はすべて、グラデーションのx値ではなく、個々のピクセルのグラデーション'値'に適用されるためです。例えば…
![]() |
![]() |
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.