ImageMagick 使用例 -- キャンバスの作成
キャンバスは ImageMagick において、描画の出発点となる画像として、透明部分のある画像を重ねるための背景として、あるいは一般的な画像処理の一部としてさえ利用されます。キャンバスは単色のこともあれば、色の範囲を持つこともあり、さらには小さな画像のタイルであることもあります。ここでは、さまざまなキャンバス画像を生成するために使える手法のほんの一部を見ていきます。
単色のキャンバス
直接生成する
特定の色とサイズのキャンバスを生成するのは非常に簡単です。"[-size](https://imagemagick.org/command-line-options/#size)"(サイズを指定しない場合は "1x1" がデフォルト)を指定し、"canvas:" を使って指定した色のキャンバスを生成します。色を指定しなければ 'white'(白)のキャンバスが生成されます。 たとえば、ここでは 'khaki' 色のキャンバスを生成しています。 |
magick -size 100x100 canvas:khaki canvas_khaki.gif
![[IM Output]](../static/img/canvas/canvas_khaki.gif)
より一般的には、短縮された(そしてより伝統的な)形式 "xc:"("X Constant Image" を意味していました)が使われます。私はだいたいこれを使っています。たとえば、これは X ウィンドウの色 'wheat' を使った画像です。 |
magick -size 100x100 xc:wheat canvas_wheat.gif
![[IM Output]](../static/img/canvas/canvas_wheat.gif)
凝った Image Read Modifiers(画像読み込み修飾子)を使えば、単色のキャンバス画像を単一の引数として指定できます。この手法を使うと、特定のサイズと色の 'xc' キャンバス画像を、多くの ImageMagick スクリプトに対する単一の「入力画像」引数として指定できます。 |
magick 'xc:Salmon[100x100!]' canvas_salmon.gif
| 数値はリサイズ値なので '!' が必要です。これがないと、正方形でない場合に要求したサイズが得られません。
---|---
![[IM Output]](../static/img/canvas/canvas_salmon.gif)
すでにキャンバスを作成済みだが、別の色のものが必要になった場合は、"[-opaque](https://imagemagick.org/command-line-options/#opaque)" 演算子でその色を置き換えられます。 |
magick canvas_khaki.gif -fill tomato -opaque khaki canvas_tomato.gif
![[IM Output]](../static/img/canvas/canvas_tomato.gif)
既存の画像から単一のピクセルを取り出し、それを望むキャンバスサイズへ拡大することもできます。単一ピクセルを単純かつ高速にリサイズするために "[-scale](https://imagemagick.org/command-line-options/#scale)" を使います。 ここでは、組み込みの "rose:" 画像からバラの色を取り出しています。 |
magick rose: -crop 1x1+40+30 +repage -scale 100x100\! canvas_rose_red.gif
同じサイズの画像を作成する
| ImageMagick を使う上で最も基本的な手法の一つは、既存の画像と同じサイズのキャンバスを生成することです。これは既存の画像をキャンバスへ変換しつつ、元の画像のサイズを保持することで実現できます。一般に、保持する必要があるのは画像のサイズだけではなく、画像のすべてのメタデータも同様です。これにはラベル、コメント、カラープロファイル、時間遅延、さらには保存時の圧縮やビット深度などが含まれます。このメタデータは、新しく空白化したキャンバスにそうした情報を注釈として書き込みたい場合や、元の画像を新しいキャンバスへ重ねる予定があり、その情報を保持する必要がある場合に重要になり得ます。当然ながら IM はこれを行う多数の方法を、たいていはさまざまな画像操作の副作用として提供しています。画像を単色にクリアする用途を明確に意図しているものは、ほんのわずかです。 左に示すのはテスト画像です。この画像を実際にどう生成したかは気にしないでください。本演習には重要ではありません。私はこの画像を、使用時に IM をしっかり酷使できるよう、色・透明度・その他の特徴の幅広い範囲を含むよう設計しました。 この画像を生成するために使ったコマンドに本当に興味があるなら、私がこれを作成するために使っている専用スクリプト "generate_test" を見てください。 | ![]() |
|---|---|
特定の色を重ねる
IM v6.4.2-1 以降では、"[+level-colors](https://imagemagick.org/command-line-options/#level_colors)" にカンマなしの単一の色を指定して、すべての色を設定できます。 |
magick test.png -alpha Opaque +level-colors Sienna color_levelc.gif
![[IM Output]](../static/img/canvas/color_levelc.gif)
色を追加する前(または後)に透明度を有用な状態に設定するために "[-alpha](https://imagemagick.org/command-line-options/#alpha)" 演算子を使っている点に注意してください。あるいは "-channel All" を使って、色をリセットする操作によって透明度チャンネルも設定されるようにできます。もう一つの古い手法は、"[-colorize](https://imagemagick.org/command-line-options/#colorize)" を使って完全に不透明な値で塗りつぶし色を重ねることです。しかし IM v6.7.9 より前では、これは元の画像のアルファチャンネルを変更しなかったため、先に "[-alpha](https://imagemagick.org/command-line-options/#alpha) [Off](masking.html#alpha_off)" でアルファチャンネルを無効化するか、"[-alpha](https://imagemagick.org/command-line-options/#alpha) [Opaque](masking.html#alpha_off)" で不透明にしておくとよいでしょう。とはいえ、それをしなくても同じ結果は得られます。 |
magick test.png -alpha off -fill Chocolate -colorize 100%
color_colorize.gif
| "[-alpha](https://imagemagick.org/command-line-options/#alpha) [Off](masking.html#alpha_off)"(または古い同等のもの "[-alpha off](https://imagemagick.org/command-line-options/#matte)")はアルファチャンネルを無効化するだけである点に注意してください。あとで再び On にすると、(保持されていた)元のアルファチャンネルが復元されます。IM v6.7.9 より前では、"[-colorize](https://imagemagick.org/command-line-options/#colorize)" を使うときにアルファが保持されました。
---|---
![[IM Output]](../static/img/canvas/color_colorize.gif)
IM v6.4.3-0 以降では、"[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)" 演算子を使って、ある点を望む色に設定し、それを画像全体に広げることができます。ほぼあらゆる着色手法が使えます(下記の Sparse Points of Color を参照)。 |
magick test.png -alpha Off \
-sparse-color Voronoi '0,0 Peru' color_sparse.gif
![[IM Output]](../static/img/canvas/color_sparse.gif)
より一般的な方法は、"[-draw](https://imagemagick.org/command-line-options/#draw)" を使って、現在の画像のすべての色を現在の "[-fill](https://imagemagick.org/command-line-options/#fill)" 色に直接リセットすることです。 |
magick test.png -fill Tan -draw 'color 0,0 reset' color_reset.gif
![[IM Output]](../static/img/canvas/color_reset.gif)
これは ImageMagick バージョン 5 で推奨されていた方法です。
上記の「単純な」手法すべてに対する主な不満は、どれも画像を現在の "[-background](https://imagemagick.org/command-line-options/#background)" 色に単純にリセットするものではないという点です。次の一連の手法は Alpha Composition(アルファ合成)を利用して、さまざまな演算子に画像を望む色へ置き換えさせます。これらの複数画像を用いる手法は、"[-compose](https://imagemagick.org/command-line-options/#compose)" を使う演算子で機能します。 たとえば "[-flatten](https://imagemagick.org/command-line-options/#flatten)"(Flatten onto Background の例を参照)を使えば、"[-background](https://imagemagick.org/command-line-options/#background)" 色を使ってキャンバスを作成できます。 |
magick test.png -background Wheat \
-compose Dst -flatten color_flatten.gif
![[IM Output]](../static/img/canvas/color_flatten.gif)
上記は '[Dst](compose.html#Dst)' 合成法を使って背景キャンバスだけを読み込み、元の画像のピクセル色を無視しています。 元の画像のメタデータ(コメントやラベルデータなど)だけを取得しつつ、画像そのものは特定の色とサイズのキャンバス画像に置き換えたい場合は、"[-extent](https://imagemagick.org/command-line-options/#extent)" 演算子(Extent, Direct Image Size Adjustment を参照)が最良の解決策かもしれません。ここでも '[Dst](compose.html#Dst)' 合成法を使って元の画像のピクセルデータを無視させ、"[-background](https://imagemagick.org/command-line-options/#background)" 色だけを使うようにしています。 |
magick test.png -background LemonChiffon \
-compose Dst -extent 100x100 color_extent.gif
![[IM Output]](../static/img/canvas/color_extent.gif)
あるいは "[-border](https://imagemagick.org/command-line-options/#border)"(Adding a Border を参照)を使い、"[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" を色の供給源として用いることもできます。 |
magick test.png -bordercolor Khaki \
-compose Dst -border 0 color_border.gif
![[IM Output]](../static/img/canvas/color_border.gif)
この最後の手法には、元の画像のサイズに対してキャンバスをわずかに拡大できるという追加の利点もあります。 | "[-border](https://imagemagick.org/command-line-options/#border)" によるキャンバス生成法は、IM のバージョン 6.1.4 より前では機能しません。それ以前は、"[-border](https://imagemagick.org/command-line-options/#border)" 演算子が生成する背景は単純な単色ではなく、ボーダー色で囲まれた黒のキャンバスでした。あまり有用ではありません。
---|---
より柔軟(だが非常に低速)なキャンバス生成法は、"[FX, DIY Operator](transform.html#fx)" 演算子が提供しています。デフォルトでは "[-fx](https://imagemagick.org/command-line-options/#fx)" は透明度チャンネルに触れないため、入力画像の透明度チャンネルも無効化する必要があります。 |
magick test.png -alpha off -fx Gold color_fx_constant.gif
![[IM Output]](../static/img/canvas/color_fx_constant.gif)
"[-fx](https://imagemagick.org/command-line-options/#fx)" 演算子では、ちょっとした色の計算もできます。たとえば 70% 暗くした金色はどうでしょう… |
magick test.png -alpha off -fx "Gold*.7" color_fx_math.gif
![[IM Output]](../static/img/canvas/color_fx_math.gif)
上記の手法はすべて、完全に不透明な色での塗りつぶしだけでなく、半透明の色も使えます。ただし、あらかじめ画像に透明度チャンネルがあることを確認しておくとよいでしょう。 ここでは例として、半透明の赤でキャンバスを作成します。しかし、これをこのウェブページの「青みがかった」背景に重ねると、くすんだ紫がかったピンク色になります。 |
magick test.png -alpha set -fill '#FF000040' -draw 'color 0,0 reset' \
color_semitrans.png
![[IM Output]](../static/img/canvas/color_semitrans.png)
また、"[-fx](https://imagemagick.org/command-line-options/#fx)" 演算子を透明度とともに使う場合は、4 つの 'RGBA' 色チャンネルすべてを変更するために "[-channel](https://imagemagick.org/command-line-options/#channel)" を設定する必要がある点に注意してください。
抽出した色で画像を空白化する
元の画像から取り出した色を使って画像を空白化することも可能ですが、少し厄介です。特定のピクセルを「背景色」として使いたいときに有用な手法です。たとえばピクセル 0,0 はよく選ばれる候補です。
以下の例では、画像を空白化する際に、組み込みの rose 画像(左に表示)のさまざまなピクセルから色を選びます。最も分かりやすい(が低速な)方法は、単純に "[FX, DIY Operator](transform.html#fx)" を使って色の空白化に用いるピクセルを選ぶことです。 |
magick rose: -fx 'p{0,0}' color_pick_fx.png
![[IM Output]](../static/img/canvas/color_pick_fx.png)
ただし、これはピクセルを一度だけ選択することで高速化できます。fx の式を Sparse Color の引数として使えばそれが可能です。一見単純ではなく見えますが、こちらの方がはるかに高速です。 |
magick rose: -sparse-color voronoi '0,0 %[pixel:p{40,30}]'
color_pick_sparse.png
![[IM Output]](../static/img/canvas/color_pick_sparse.png)
もう一つのより複雑な方法は、その 1 ピクセルを切り出して画像全体にタイル状に敷き詰めることです。これは後ほど Tiling with an Image already In Memory で詳しく説明する手法を使います。 |
magick rose: \( +clone -crop 1x1+64+22 -write MPR:pixel +delete \) \
-fill mpr:pixel -draw 'color 0,0 reset' \
color_pick_draw.png
magick rose: -set option:distort:viewport '%wx%h+0+0' \
-crop 1x1+10+25 +repage -distort SRT 0 \
color_pick_distort.png
その他のキャンバス手法
非常に特定の色のキャンバスを生成する方法は他にもたくさんありますが、それらはかなり分かりにくいものです。そのため、しっかりとコメントを付けておかないと、数か月後や数年後に自分の IM スクリプトを見たときに、実際に何をしているのか分からなくなるかもしれません。これらの手法はおすすめしませんが、柔軟性の低い古いバージョンの IM を使っている場合には知っておくと便利です。 黒のキャンバス。"-threshold" を使い、その後で透明度チャンネルを無効化します。 伝統的には、次のようにして黒のキャンバスを作成できます。
magick test.png -threshold 100% -alpha off black_threshold.png
"-level" 演算子で 'black'(黒)と 'white'(白)の両方の点に同じ引数を指定すると、同じ効果が得られます。
magick test.png -level 100%,100% -alpha off black_level.png
"-fx" 演算子は、すべてのピクセルをゼロにクリアすることで、より分かりやすく黒のキャンバスを作成する方法を提供します。ただし、完全に不透明にするためにアルファチャンネルもリセットする必要があります。
magick test.png -fx 0 -alpha off black_fx.png
ただし、"-evaluate" を使うこのバージョンの方が、特に大きな画像では高速なはずです。
magick test.png -evaluate set 0 -alpha off black_evaluate.png
"-gamma" 演算子を悪用して画像をすべて黒にすることもできます。
magick test.png -gamma 0 -alpha off black_gamma.png
あまり明らかではない方法として、色レベルが少なすぎる状態で画像を「ポスタライズ」し、結果として使われる色が一つ、黒だけになるようにする方法があります。 |
magick test.png -posterize 1 -alpha off black_posterize.png
アルファ演算子。画像を完全に透明にしてから、その画像のマスクを 'extract'(抽出)できます。
magick test.png -alpha transparent -alpha extract black_alpha.png
白のキャンバス。これも伝統的には "-threshold" を使います。ただし、すべての IM のバージョンで確実にすべての色が白にマップされるよう、値は負の数でなければなりません。
magick test.png -threshold -1 -alpha off white_threshold.png
"-level" 演算子で 'black' と 'white' の両方の点に同じ引数を指定すると、同じ効果が得られます。
magick test.png -level -1,-1 -alpha off white_level.png
もちろん "-fx" 演算子を使ってピクセル値を直接設定することもできます。
magick test.png -fx 1.0 -alpha off white_fx.png
ただし、"-evaluate" を使うこのバージョンの方が、特に大きな画像では高速なはずです。
magick test.png -evaluate set 100% -alpha off white_evaluate.png
あるいは、何らかの黒キャンバス生成法を反転(negate)します。 |
magick test.png -posterize 1 -alpha off -negate white_posterize.png
アルファ演算子。画像を完全に不透明(透明度なし)にしてから、その画像のマスクを 'extract'(抽出)できます。
magick test.png -alpha opaque -alpha extract white_alpha.png
透明なキャンバス。既存の画像から生成したいキャンバスとしておそらく最も重要なのは、透明なキャンバスです。これに描き加えていって思いどおりにし、それを元の画像に重ねることができます。最も速く簡単な方法は、"-alpha transparent" 演算子(IM v6.4.3-7 で追加)を使って、IM に画像を直接透明にクリアさせることです。
magick test.png -alpha transparent trans_alpha.png
ただし、これは非常に最近の追加なので、まだ広く利用できるとは限りません。 ![[IM Output]](../static/img/canvas/trans_alpha.png)
'Clear' アルファ合成演算子を使うと、任意の重ね合わせ画像(この場合は単一ピクセルの "null:")を使って完全に透明な「黒」のキャンバスを作成できます。重ね合わせ画像は無視されるためです。
magick test.png null: -alpha set -compose Clear -composite -compose Over \
trans_compose.png
ここでは "-draw matte" 演算子を使って、マット(透明度)チャンネルの値を、現在の "-fill" 色設定の透明度の値で置き換えます。この場合は完全に透明にします。
magick test.png -alpha set -fill none -draw 'matte 0,0 reset'
color_matte.png
"-fx" 演算子を使えば、これをより直接的に行うこともできます。
magick test.png -alpha set -channel A -fx 0 +channel trans_fx.png
当然ながら、"-evaluate" を使うこのバージョンの方が、特に大きな画像では高速なはずです。
magick test.png -alpha set -channel A -evaluate set 0 +channel \
trans_evaluate.png
画像を完全に透明にするもう一つの方法は、"-threshold" を使うことですが、その効果を透明度チャンネルだけに限定します。
magick test.png -channel A -threshold -1 +channel trans_threshold.png
実際この場合、数学的には 'matte' チャンネルを扱っており、threshold を使ってそれをゼロではなく最大値に設定しています("-fx" 演算子のときはゼロにしました)。これが上記で 101%' のようなものではなく '-1' を使った理由です。 上記の多くの画像結果では、元の画像の元の RGB 色がまだ存在しており、ただ透明にされているだけです。たとえば、ここでは上記の画像の一つを読み込み、画像内のマット/アルファチャンネルを無効化して色を再び見えるようにします。 |
magick trans_fx.png -alpha off trans_fx_alpha_off.jpg
ただし、すべての画像ファイル形式や、ごく一部を除く画像操作が、結果の画像にまだ存在する部分的に透明な RGB 色を保持するわけではない点に注意してください。 ![[IM Output]](../static/img/canvas/trans_fx_alpha_off.jpg)
前にも述べましたが、繰り返す価値があるので言うと、上記の手法の多くは、画像にすでにアルファチャンネルがあることに依存しています。もしなければ、"[-alpha](https://imagemagick.org/command-line-options/#alpha) [On](masking.html#alpha_on)" を使って追加してください。ただしその場合は、いっそ "[-alpha](https://imagemagick.org/command-line-options/#alpha) Transparent" 演算子を使ってもよいでしょう。Controlling Image Transparency の例を参照してください。 雑多なキャンバスの着色。特定の色を使う場合を除けば、任意の原色/二次色のキャンバスを生成できるほど真に柔軟なのは "-gamma" 演算子だけです。基本的に、チャンネルをゼロにするには 0 を、チャンネル値を最大化するには -1 を使います。 たとえば、ここでは黄色のキャンバスを生成しています… |
magick test.png -gamma -1,-1,0 -alpha off yellow_gamma.png
![[IM Output]](../static/img/canvas/yellow_gamma.png)
IM v6.4.2 以降では、"[+level](https://imagemagick.org/command-line-options/#level)" 演算子を使って、すべての色チャンネルに特定のグレーレベルを設定することもできます。 |
magick test.png +level 40%,40% -alpha off grey_level.png
色のグラデーション
上で見たように、単色のキャンバスは十分簡単に作成できます。しかし、ときにはもっと面白いものが欲しくなります。 非常に有用な画像作成演算子の一つが "gradient:" です。たとえば… |
magick -size 100x100 gradient: gradient.jpg
![[IM Output]](../static/img/canvas/gradient.jpg)
ご覧のとおり、デフォルトでは "gradient:" は上が白、下が黒で、画像の高さ方向にグレーが滑らかにシェーディングされた画像を作成します。しかし、グレースケールのグラデーションだけでなく、一方または両方の色を指定して、異なる色のグラデーションを生成することもできます。
magick -size 100x100 gradient:blue gradient_range1.jpg
magick -size 100x100 gradient:yellow gradient_range2.jpg
magick -size 100x100 gradient:green-yellow gradient_range3.jpg
magick -size 100x100 gradient:red-blue gradient_range4.jpg
magick -size 100x100 gradient:tomato-steelblue gradient_range5.jpg
単一の色を指定すると、二番目の色は 'white' か 'black' のうち、指定した色から最も色の距離が大きい方になる点に注意してください。そのため 'blue' は 'blue-white' のグラデーションを、'yellow' は 'yellow-black' のグラデーションを生成します。'red-blue' のグラデーションでは、中央にずっと暗い紫色の帯が現れます。この暗化は、特に強い原色の場合に、より暗い非線形 sRGB 色空間が使われることによって生じます。詳しくは Processing Real Images を参照してください。 | _"gradient:" は現在のところ sRGB の Color Space(色空間)の色表現しか理解しません。そのため、線形 LAB 色空間で 'red-blue' の色を使って、より明るく正しい「紫」のグラデーションを生成することはできません。
これはまた、HSV 色空間を使って多色の「虹」グラデーションを生成することもできないことを意味します。
ただし、そうしたグラデーションを比較的簡単に「ごまかして」作ることはできます。下記の Gradients in other Colorspaces を参照してください。
---|---
| _グラデーションは現在のところ、他の角度や 2 色を超える色を含む形では指定できません。ただし、この機能は SVG グラデーションの不可欠な一部なので、この状況はおそらく変わり、グラデーションのオプションが大きく改善されるでしょう。
---|---
特に素敵なグラデーションには次のようなものがあります… |
magick -size 10x120 gradient:snow-navy gradient_ice-sea.jpg
magick -size 10x120 gradient:gold-firebrick gradient_burnished.jpg
magick -size 10x120 gradient:yellow-limegreen gradient_grassland.jpg
magick -size 10x120 gradient:khaki-tomato gradient_sunset.jpg
magick -size 10x120 gradient:darkcyan-snow gradient_snow_scape.jpg
![[IM Output]](../static/img/canvas/gradient_snow_scape.jpg)
| _IM v6.3.1 以降では、グラデーションを生成するアルゴリズムが、水平方向に一様な色を生成するようになりました。すなわち、画像の各行のすべてのピクセルに同じ色が割り当てられます。つまり、1 行につき 1 色です。
このバージョン以前は、"gradient:" 演算子は画像の幅を無視し、画像の左上隅から右下隅へ向かって 1 行ずつ、次に増分した色を割り当てるという動作をしていました。
その結果、グラデーションは現在と同様に主に垂直方向のグラデーションでしたが、完全なものではありませんでした。たいていの場合、この事実はテスト画像のような特殊な場合や、Image Mapping での使用においてのみ重要でした。
_
---|---
グラデーションの動作は、次の define によって影響を受けることがあります。
放射状グラデーション
IM v6.4.4 以降では、同様の方法で放射状グラデーション画像も生成できます。 |
magick -size 100x100 radial-gradient: rgradient.jpg
![[IM Output]](../static/img/canvas/rgradient.jpg)
グラデーションは生成される画像の中央を中心とし、その直径は画像の X または Y サイズの大きい方に合わせて設定される点に注意してください。そのため、画像のサイズが正方形でない場合は「切り取られた」放射状グラデーションが得られます。 |
magick -size 100x60 radial-gradient: rgradient_clip.jpg
![[IM Output]](../static/img/canvas/rgradient_clip.jpg)
これにより、一方の辺を 1.42 倍(2 の平方根)大きくして放射状グラデーションを生成し、それを切り取ることで、中心から隅までの正方形の放射状グラデーションを簡単に生成できます。 |
magick -size 100x142 radial-gradient: \
-gravity center -crop 100x100+0+0 rgradient_crop.jpg
![[IM Output]](../static/img/canvas/rgradient_crop.jpg)
グラデーションそのものの色は、ずっと古い線形の "[gradient:](#gradient)" 画像生成器と同じ慣例に従います。
magick -size 100x100 radial-gradient:blue rgradient_range1.jpg
magick -size 100x100 radial-gradient:yellow rgradient_range2.jpg
magick -size 100x100 radial-gradient:green-yellow rgradient_range3.jpg
magick -size 100x100 radial-gradient:red-blue rgradient_range4.jpg
magick -size 100x100 radial-gradient:tomato-steelblue rgradient_range5.jpg
透明度を伴うグラデーション
IM v6.2.9-8 以降では、"gradient:"(および後の "radial-gradient:")画像作成演算子が、透明および半透明の色の使用を理解します。 |
magick -size 100x100 gradient:none-firebrick gradient_transparent.png
![[IM Output]](../static/img/canvas/gradient_transparent.png)
| _ImageMagick 6.5.4-7 より前では、完全な透明を含むグラデーション(最後の例のような)は一般に黒いハロー(縁取り)を生じていました。
何が起きていたかというと、生成されるグラデーションが、指定された色から特別な色 'none' すなわち透明な黒へのものだったのです。その結果、色は完全に透明になる前に、半透明の黒に向かってシェーディングされていました。
この問題の解決策は、透明度のグラデーションを生成し、それを望む色で Colorize(着色)することでした。_
---|---
|
magick -size 100x100 gradient:none-black \
-fill firebrick -colorize 100% gradient_trans_colorize.png
ヒストグラム調整によるグラデーション
線形グラデーションに何らかのヒストグラム調整を適用することで、非線形のグラデーションを作成できます。たとえば Sigmoidal Contrast 関数を使うと、より自然に見えるグラデーションを作成できます。 |
magick -size 100x100 gradient: -sigmoidal-contrast 6,50% \
gradient_sigmoidal.jpg
![[IM Output]](../static/img/canvas/gradient_sigmoidal.jpg)
この種のグラデーションは、Overlapping Photos(重なり合う写真)の生成に特に適しています。重なり合う領域の始まりにある急激なグラデーション変化を取り除くからです。
Evaluate/Function によるグラデーション
Evaluate Operator や関連する Function Operator を使って、単純な線形グラデーションを変更することもできます。 |
magick -size 100x100 gradient: -evaluate cos 0.5 -negate \
gradient_cosine.jpg
![[IM Output]](../static/img/canvas/gradient_cosine.jpg)
あるいはもう一歩進めて、線形グラデーションの中央に滑らかな放物線状のピークを作ります。 |
magick -size 100x100 gradient: -function Polynomial -4,4,0 \
gradient_peak.jpg
magick -size 100x100 gradient: -function sinusoid 4,-90 \
gradient_bands.jpg
![[IM Output]](../static/img/canvas/gradient_bands.jpg)
これら密接に関連する 2 つの演算子はどちらも、正弦曲線、多項式、対数、べき乗の数学関数に基づいて画像やグラデーションを変更できます。より多くの例については Evaluate Math Functions と Function, Multi-Argument Evaluate を参照してください。
歪めたグラデーション
回転したグラデーション
Sparse Color の '[Barycentric](#barycentric)' 法(下記参照)は任意の角度でグラデーションを生成する便利な方法を提供しますが、お使いの IM がバージョン 6.4.3-0 より古い場合は、斜めまたは回転したグラデーションを生成するために別の方法が必要かもしれません。たとえば、グラデーション画像のサイズを大きくし(2 の平方根、すなわち 1.42 倍する)、それを 45 度回転させて、最終サイズに切り取ることで、斜めのグラデーションを作れます。 |
magick -size 142x142 gradient: -rotate -45 \
-gravity center -crop 100x100+0+0 +repage \
gradient_diagonal.jpg
![[IM Output]](../static/img/canvas/gradient_diagonal.jpg)
IM v6.3.5 以降では、SRT Distortion を使って、回転したグラデーションをはるかに高速かつ簡単に生成できます。たとえば、次は 100x100 ピクセルの画像内で 60 度回転させた 100 ピクセルのグラデーションです。 |
magick -size 100x100 gradient: -distort SRT 60 gradient_srt.jpg
![[IM Output]](../static/img/canvas/gradient_srt.jpg)
これはデフォルトの Virtual Pixel, Edge 設定を使って、画像全体が要求したグラデーションで覆われるようにしています。エキスパート向けの Distort Viewport 設定を使って、グラデーションをより大きな画像にマッピングすることもできます。たとえば Overlapping Photos での利用などです。
グラデーションのワーピング
しかし、同じ歪曲手法を使えば、単純な回転よりずっと多くのことができます。 グラデーションをねじることもできます… |
magick -size 100x100 gradient: -swirl 180 gradient_swirl.jpg
magick -size 100x100 gradient: -rotate -90 \
-distort Perspective '0,0 40,0 99,0 59,0 0,99 -10,99 99,99 109,99' \
gradient_trapezoid.jpg
![[IM Output]](../static/img/canvas/gradient_trapezoid.jpg)
あるいは General Distortion Operator を使って、グラデーションを弧や円に巻きつけることもできます… |
magick -size 100x100 gradient: -distort Arc '180 0 50 0' \
gradient_arc.jpg
magick -size 100x100 gradient: -distort Arc '360 0 50 0' \
gradient_circle.jpg
![[IM Output]](../static/img/canvas/gradient_circle.jpg)
もっとも、これらのグラデーションを生成するには、新しい "[radial-gradient:](#radial-gradient)" の方がおそらくより単純な方法です。 非常に有用だが生成が難しいグラデーションに、極角グラデーションがあります。このグラデーションの正確な形は、偶数サイズの画像を中心とするか、奇数サイズの画像を中心とするかによって異なります。たとえば、偶数のピクセル寸法(この場合 76 ピクセル)を持つ画像を生成するには Arc Distort を使えます。 |
magick -size 1x1000 gradient: -rotate 90 \
-distort Arc '360 -90 50 0' +repage \
-gravity center -crop 76x76+0+0 +repage gradient_angle_even.png
![[IM Output]](../static/img/canvas/gradient_angle_even.png)
上記の '-90' は、'ゼロ' と '最大値' が同じ値へ巻き戻る '不連続点' の角度を設定します。値 '50' は、最終的に切り取られる画像のサイズの 1/2 以上であるべきです。小さな画像を生成するのに、はるかに長いグラデーションを使った点に注目してください。これにより結果全体の正確さが向上します。特に画像が大きくなるほど効果があります。 密接に関連する Polar Distort でもこうしたグラデーションを生成できますが、歪曲の '中心' の正確な位置を制御できるため、奇数ピクセルサイズの極グラデーション画像を正しく生成できます。この場合は 75 ピクセルの画像(半径 = '36.5')です。 |
magick -size 1x1000 gradient: -rotate 90 \
+distort Polar '36.5,0,.5,.5' +repage \
-transverse gradient_angle_odd.png
![[IM Output]](../static/img/canvas/gradient_angle_odd.png)
最後の 2 つの画像は、サイズを除けばよく似ているように見えますが、最も中心のピクセルの扱いがわずかに異なります。よく見ると、最後の例は完全なグレーの中心ピクセルを持っているのに対し、前の例は単一の中心ピクセルを持たず、4 つの中心ピクセルを持っていることが分かります。 画像の最終サイズは値 '36.5' によって決まり、これは望む '75' ピクセルの半分です。'.5' のオフセットが、極の中心を正しく扱う上で重要な点です。 デフォルトでは歪曲は不連続点を画像の上部に配置する点に注意してください。そのため Transverse Warp によって、不連続点の角度と位置を、Arc Distort が生成するものと一致するように補正しています。 次は、角度グラデーションを生成しつつ透明な円形マスクを付けた、少し異なる変種です。 |
magick -size 50x1000 gradient: -rotate 90 -alpha set \
-virtual-pixel Transparent +distort Polar 49 +repage \
-transverse gradient_angle_masked.png
![[IM Output]](../static/img/canvas/gradient_angle_masked.png)
値 '49' は半径から 1 を引いたものです。デフォルトでは歪曲が結果画像の周囲に 1 ピクセルのアンチエイリアスバッファを追加するためです。その結果、最終画像は 100x100 ピクセルになります。
円形の形状やグラデーションをワープすることで、興味深い非線形グラデーションを作れます。たとえば、Wave Distortion を使って弧状にすると、おおよそ三角形のグラデーションを生成できます。 |
magick -size 100x100 radial-gradient: \
-background black -wave -28x200 -crop 100x100+0+0 +repage \
gradient_triangle.jpg
![[IM Output]](../static/img/canvas/gradient_triangle.jpg)
あるいは、円形の形状の上端に沿って極座標歪曲をかけることで生成される、非常に奇妙な鳥のような形状を。 |
magick -size 100x100 radial-gradient: \
+distort Polar '49' +repage \
gradient_bird.jpg
合成によるグラデーション
さまざまな合成法を使ってグラデーションを組み合わせ、変更することもできます。たとえば Modulus_Add 合成法を使って、ブラインド(よろい戸)のようなグラデーションを生成できます。 |
magick -size 100x100 gradient: \( +clone +clone \) \
-background gray50 -compose ModulusAdd -flatten \
gradient_venetian.jpg
magick -size 100x100 gradient: \( gradient: -rotate -90 \) \
\( -clone 0--1 -clone 0--1 \) \
-background gray50 -compose ModulusAdd -flatten \
gradient_vent_diag.jpg
![[IM Output]](../static/img/canvas/gradient_vent_diag.jpg)
あるいは、Channel Copying または Mathematical Blending の合成法を使って 2 つの単色グラデーションをブレンドすることで、カラフルな 2 次元のカラーマップグラデーションを生成できます。 |
magick -size 100x100 gradient:yellow-blue \
\( gradient:black-lime -rotate -90 \) \
-compose CopyGreen -composite gradient_colormap.jpg
他の色空間でのグラデーション
"gradient:" 生成器は現在のところ、他の Color Spaces(色空間)で直接グラデーションを生成できません(非線形 sRGB のグラデーション画像しか作成されません)が、グラデーションを別の色空間へ転送して、興味深い効果を生成することはできます。たとえば…
magick -size 30x600 xc:red -colorspace HSB \
gradient: -compose CopyRed -composite \
-colorspace RGB -rotate 90 gradient_rainbow.jpg
これはまず、高度に彩度の高い色('red')を HSL 色空間へ変換します。彩度の高い色ならどれでも使えます。これにより、画像の彩度と明度のチャンネルが適切な値に正しく設定されます。その後、グラデーションを生成して、この HSL 色空間画像の '色相'('red' に相当)チャンネルへコピーします。すると見事に、HSL 画像を RGB へ戻して変換したとき、完全に彩度の高い色の虹のグラデーションが得られます。 もう一つの方法は、これらの色空間の一つに対してちょうど適切な値のグラデーションを生成し、その後("[-set](https://imagemagick.org/command-line-options/#set)" を使って)画像の色空間を変更することです。これにより、画像内で作成した色の値を変えることなく色空間が変わります。そして RGB へ戻して変換すると、同じ値の虹が得られます。
magick -size 30x600 gradient:'#FFF-#0FF' -rotate 90 \
-set colorspace HSB -colorspace RGB \
gradient_rainbow_2.jpg
結果は実際には前の方法とまったく同じですが、もう少し直接的です。すなわち、望む色空間に対して適切な値を生成し、それからその値が属する色空間を設定します。 ここでは、マスクされた角度グラデーション(上記参照)を取り、それを HSB 色空間に再マッピングして、色相の円環を生成します。赤(色相 = 0)は右へ回転され、伝統的に置かれる位置(極座標の角度 0)に配置されます。 |
magick -size 100x300 gradient:'#FFF-#0FF' -rotate 90 \
-alpha set -virtual-pixel Transparent +distort Polar 49 +repage \
-rotate 90 -set colorspace HSB -colorspace RGB \
gradient_hue_polar.png
![[IM Output]](../static/img/canvas/gradient_hue_polar.png)
上記に類似した例として Color Wheel(カラーホイール)があります。これは色相と明度の両方のグラデーションを使って Combining Channel Images(チャンネル画像の合成)によって生成されます。
リサイズによるグラデーション
Glenn Randers-Pehrson 氏が紹介してくれた一つの技は、非常に小さな画像、幅 2 ピクセルのものを作成し、それを "[-resize](https://imagemagick.org/command-line-options/#resize)" を使って必要な画像サイズに拡大することです。Resize Operator は拡大した画像を、より大きなスケールで見栄えがよくなるよう滑らかにしようとします。この平滑化を利用して非線形のグラデーションを生成します。 たとえば、ここでは 'portable bitmap'(PBM 形式)画像を使って小さな画像を生成し、それを拡大のために IM に渡します。 |
echo "P1 1 2 0 1 " | \
magick - -resize 100x100\! gradient_resize.jpg
![[IM Output]](../static/img/canvas/gradient_resize.jpg)
| 'csh' やその変種のような一部のシェルは、上記のリサイズのジオメトリ設定にある '!' 文字をあまりうまく扱えません ── クォートで囲んでもです。そのためバックスラッシュ '\' 文字が必要かもしれません。注意が必要です。
---|---
生成されるグラデーションは線形ではなく、指定した色の始まりと終わりが滑らかになっており、通常のグラデーションで得られるよりもそれらの色がずっと強調されます。グラデーションが従う実際の関数は、リサイズで使われた正確な Resampling Filter(再サンプリングフィルター)に依存します(そしてそれに近いものになります)。 最初の 2 ピクセル画像を生成する簡単な方法は、実は gradient 自身を使うことです! これにより色を直接指定できます。もちろん、結果も回転させない限り、垂直方向のグラデーションに限られます。 |
magick -size 1x2 gradient:khaki-tomato \
-resize 100x100\! gradient_resize2.jpg
![[IM Output]](../static/img/canvas/gradient_resize2.jpg)
もちろん、この手法では 1 次元に限られません。ここでは 4 ピクセルの 'portable greymap'(PGM 画像形式)を使って 2 次元のグラデーションを生成します。 |
echo "P2 2 2 2 2 1 1 0 " | \
magick - -resize 100x100\! gradient_resize3.jpg
![[IM Output]](../static/img/canvas/gradient_resize3.jpg)
ご覧のとおり、この斜めのグラデーションは、上記の Rotated Gradient と比べると、あまり線形ではありません。 | Network Portable Bitmap 画像形式は、スクリプトから画像を生成するのに非常に汎用性があります。画像データを生成または操作する手段として、知っておく価値が十分にある形式です。
---|---
よく見ると、グラデーションは拡大されたピクセルの中央から始まっており、画像を端から端まで完全には覆っていないことも分かります。これは Triangle Resize Filter を使うとより明確になります。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-filter triangle -resize 100x100\! gradient_resize4.jpg
![[IM Output]](../static/img/canvas/gradient_resize4.jpg)
Resize Operator は、"[Resampling Filter](filter.html#filter)" 設定に従ってこれらのピクセル間の色を滑らかにします。フィルターを調整することで、リサイズによるグラデーションをより端から端までの効果にできます。 |
magick -size 1x2 gradient: \
-filter Cubic -resize 100x100\! gradient_resize5.jpg
![[IM Output]](../static/img/canvas/gradient_resize5.jpg)
次は 'resize' 手法を使って作成した粗い「虹のグラデーション」です。
magick xc:black xc:red xc:yellow xc:green1 xc:cyan xc:blue xc:black \
+append -filter Cubic -resize 600x30\! gradient_rs_rainbow.jpg
この方法では、グラデーションの生成に任意の色の組み合わせと順序を使えます。これにより、Color Lookup Tables(カラールックアップテーブル)の生成に非常に適しています。
補間ルックアップによるグラデーション
"[-interpolate](https://imagemagick.org/command-line-options/#interpolate)" 設定の詳細については Interpolation Setting を参照してください。 グラデーションを生成するもう一つの方法は、特別な Interpolation Setting(補間設定)を使うことです。この設定は、ピクセルのルックアップが整数でなく、特定のピクセルに正確に一致しない場合に返されるピクセル色を決定するために使われます。補間は、ルックアップ点を取り囲むピクセルに基づいて色を決定します。たとえばデフォルト設定の 'bilinear' は、2 つのピクセルの間に落ちるルックアップに対して色を線形に決定します。
magick -size 600x30 xc: \( +size xc:gold xc:firebrick +append \) \
-fx 'v.p{i/(w-1),0}' gradient_interpolated.jpg
ここではルックアップの X 位置 'i/(w-1)' が、2 番目の 2 ピクセル画像にわたって '0.0' から '1.0' まで変化します。浮動小数点数によって、"[gradient:](#gradient)" が行うのとほぼ同じ完全な線形グラデーションが生成されます。 上記は実際には、Clut Recolored Images(CLUT による再着色画像)を使って、2 色画像の補間ルックアップでグラデーション画像を再着色するのとほぼ等価です(違いについては Perfect Gradients を参照)。
magick -size 30x600 gradient: -rotate 90 \
\( +size xc:gold xc:firebrick +append \) -clut \
gradient_clut_recolored.jpg
この方法を使えば、多色のグラデーションを生成することもできます。
magick -size 30x600 gradient: -rotate 90 -interpolate Bicubic \
\( +size xc:black xc:tomato xc:wheat +append \) -clut \
gradient_clut.jpg
ただし制限として、色は等間隔でしか定義できません。入力グラデーションを何らかの非線形の形に大まかに変更してその中心をずらす以外に、中間色の位置を単純にずらすことはできません。3 色を超える場合、状況はさらに悪化します。 上記はまた、Duotones(デュオトーン)を使ってグレースケール画像を着色するのにも適した手法であり、(Tint Operator を使う場合とは異なり)中間調の色を正確に定義することが保証されます。
補間ルックアップによるグラデーションは 2 次元に拡張することもでき、純粋な 1 次元グラデーションと同じくらい簡単に、正方形の線形グラデーション(Bilinear Interpolation)を生成できます。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
gradient_bilinear.jpg
![[IM Output]](../static/img/canvas/gradient_bilinear.jpg)
次は同じ例ですが、Catrom Interpolation を使い、非常に低速な FX 演算子の代わりに Distort Operator を使って生成しています。 |
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-filter point -interpolate catrom \
-define distort:viewport=100x100 \
-distort Affine '.5,.5 .5,.5 1.5,1.5 99.5,99.5' \
gradient_catrom.jpg
![[IM Output]](../static/img/canvas/gradient_catrom.jpg)
上記を理解する上での鍵となる点は、ピクセルの中心に基づいて小さな画像を拡大しているということです。詳細は Image Coordinates vs Pixel Coordinates を参照してください。 ほとんどの補間法には、同等の Interpolated Resize Filters がある点に注意してください。しかし、ビューポートとピクセル座標を使うことで、前の Resize Gradients で見られた、非常に小さな画像の極端な拡大によって生じる端の効果が取り除かれます。
ただし、Mesh Interpolation 設定は Resize Filter としては利用できません。これは特別な 2 次元補間で、ピクセル内の領域を 2 つの平坦な線形三角形に分割し、色差が最小となる隅同士を結ぶ対角線に沿ってヒンジ(蝶番)状にします。そのため、2 つの色を同じ色にして "-interpolate mesh" を使うと、非常に異なる 2D グラデーションを生成できます。 |
magick \( xc:red xc:gold +append \) \
\( xc:gold xc:green +append \) -append \
-filter point -interpolate mesh \
-define distort:viewport=100x100 \
-distort Affine '.5,.5 .5,.5 1.5,1.5 99.5,99.5' \
gradient_mesh.jpg
![[IM Output]](../static/img/canvas/gradient_mesh.jpg)
対角線上で向かい合う 2 つの黄色の隅が同じなので、それらを結ぶために黄色の対角線が使われました。他の色は、それらの三角形に線形にマッピングされます。対角線上の 2 つの色が同じでない場合は、異なる対角分割になることがあります。
自前のグラデーションを作る
FX DIY Operator を使うと、現在のピクセル位置に基づいて、独自のグラデーションやその他の画像生成を定義できます。この演算子は作業対象の画像を必要とするため、その画像に合わせてグラデーションやその他の画像を生成できます。つまり、グラデーションを生成するために画像のサイズを知っている必要がないのです! たとえば、作業中の画像に合わせて正しいサイズの線形グラデーションを簡単に生成できます。 |
magick rose: -channel G -fx 'i/w' -separate gradient_fx_linear.gif
![[IM Output]](../static/img/canvas/gradient_fx_linear.gif)
| グレースケールのグラデーションを生成するとき、上記の例の 'G'(緑)チャンネルのように、単一の色チャンネルだけを生成するよう求めるだけで、-fx 演算子を 3 倍速くできます。このチャンネルはその後、Separated(分離)して、必要なグレースケール画像を形成できます。これは、特に非常に複雑な "[-fx](https://imagemagick.org/command-line-options/#fx)" の式を使う場合に、非常に大きな速度向上をもたらすことがあります。
---|---
気の利いた非線形のグラデーションを生成することさえできます。 |
magick rose: -channel G -fx '(i/w)^4' -separate gradient_fx_x4.gif
magick rose: -channel G -fx 'cos(pi*(i/w-.5))' \
-separate gradient_fx_cos.gif
![[IM Output]](../static/img/canvas/gradient_fx_cos.gif)
2 次元の円形線形放射状グラデーション(円錐)はどうでしょう。 |
magick -size 100x100 xc: -channel G \
-fx 'rr=hypot(i/w-.5, j/h-.5); 1-rr*1.42' \
-separate gradient_fx_radial.gif
![[IM Output]](../static/img/canvas/gradient_fx_radial.gif)
| "[-fx](https://imagemagick.org/command-line-options/#fx)" 関数 'rr=hypot(xx,yy)' は、非常によく使われる式 'rr=sqrt(xx*xx+yy*yy)' を高速化するために IM v6.3.6 で追加されました。また、放射状グラデーションを作成するときに 'xx=i/w-.5' のような余分な代入をする必要がなくなりました。
---|---
上記の値 '1.42'(または sqrt(2))は、画像の寸法に対するグラデーション全体のサイズを制御します。このようにして、グラデーションの半径(黒が中心からどれだけ離れているか)は隅までの対角距離になります。 式から('hypot()' 関数に組み込まれている)'sqrt()' を取り除いて、より興味深い球状のグラデーションを作ることさえできます。これは 3D Shading Effects に役立ちます。 |
magick -size 100x100 xc: -channel G \
-fx 'xx=i/w-.5; yy=j/h-.5; rr=xx*xx+yy*yy; 1-rr*4' \
-separate gradient_fx_spherical.gif
![[IM Output]](../static/img/canvas/gradient_fx_spherical.gif)
いくつかの代入式を使って、画像中心からの距離の計算を単純化してから、それをグラデーションへ変換している点に注目してください。この機能は IM v6.3.0 で追加されました。 高いべき乗関数を使うと、画像の長方形の端の周りで写真をフェードオフさせる効果を与えられます。べき乗の値 '4' を調整して、フェードの量を制御してください。 |
magick -size 100x100 xc: -channel G \
-fx '(1-(2*i/w-1)^4)*(1-(2*j/h-1)^4)' \
-separate gradient_fx_quad2.gif
![[IM Output]](../static/img/canvas/gradient_fx_quad2.gif)
次は、直接的な数学を使って生成した角度グラデーションです。 |
magick -size 100x100 xc: -channel G \
-fx '.5 - atan2(j-h/2,w/2-i)/pi/2' \
-separate gradient_fx_angular.gif
![[IM Output]](../static/img/canvas/gradient_fx_angular.gif)
'atan2(y,x)' 関数は -PI から +PI までのラジアンの角度を返す(その man ページを参照)ため、その出力を 0.0 から 1.0 の色の範囲に正しく合わせるには、スケーリングと平行移動が必要である点に注意してください。これが、上記が実際よりずっと複雑に見える理由です。この最後の例は、Distorting a Gradient によってより高速に生成できます。
より複雑な DIY グラデーション
余談: このセクションは Sparse Points of Color の追加より前に作成され、その作成に直接的な影響を与えました。 もちろん、FX 関数は色のグラデーションを生成できます。たとえば、これは距離の比に基づくグラデーションで、極めて複雑な FX 式を使っています。 |
magick -size 100x100 xc: +size xc:red xc:yellow -colorspace RGB \
-fx 'ar=hypot( i/w-.8, j/h-.3 )*4;
br=hypot( i/w-.3, j/h-.7 )*4;
u[1]*br/(ar+br) + u[2]*ar/(ar+br)' \
-colorspace RGB gradient_dist_ratio.gif
![[IM Output]](../static/img/canvas/gradient_dist_ratio.gif)
| このような強い原色をブレンドする際の 'sRGB 暗化' を避けるため、画像処理は線形色空間(RGB)で行いました。詳細は Processing Real Images を参照してください。
---|---
2 点から 3 点へ移ると、各「制御点」がどれだけの色を提供するかの比は少し複雑になり、逆距離加重(IDW)補間と呼ばれる手法を使います。この数学の詳細は Wikipedia, IDW で見られます。 次は 3 点に対する逆距離の例です。 |
magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
-fx 'ar=1/max(1, hypot(i-50,j-10) );
br=1/max(1, hypot(i-10,j-70) );
cr=1/max(1, hypot(i-90,j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_inverse.gif
![[IM Output]](../static/img/canvas/gradient_inverse.gif)
そして次は、IDW 補間でより一般的に使われる、逆距離の 2 乗を使った例です。これはシェパード補間法としても知られています。 |
magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
-fx 'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) );
br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) );
cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_shepards.gif
![[IM Output]](../static/img/canvas/gradient_shepards.gif)
距離の平方根を生成する必要がないため、上記では 'hypot()' 関数を使っていない点に注意してください。 上記は現在、Sparse Color の '[Inverse](#inverse)' および '[Shepard's](#shepards)' 法を使って実装されています。そのため、上記は今ではもっと簡単に次のように行えます…
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '50,10 red 10,70 yellow 90,90 lime' \
-colorspace sRGB gradient_inverse_alt.gif
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Shepards '50,10 red 10,70 yellow 90,90 lime' \
-colorspace sRGB gradient_shepards_alt.gif
'逆距離' または 'シェパード法'(逆 2 乗距離)を使うことの問題は、すべての「制御点」が画像全体にわたって大域的な効果を持つことです。その結果、点と点の間、特にすべての制御点から遠く離れた場所では、ある種の根底にある「平均色」が得られます。これが結果として、滑らかな色のグラデーションではなく、色の「斑点」を生じます。
DIY グラデーションと色相
-- (色相は扱いが難しい)
余談: これは興味深い虹の効果を生成しようとした、いわば失敗した試みでした。失敗でしたが、その失敗から多くを学びました。それをここで紹介します。 上記はうまく機能しますが、私はもっとよくしようと試みたくなりました。平均色に溶け込む斑点を生成するのではなく、点と点の間に明るい虹のグラデーションを生成できるのではないかと考えたのです。そこで色相グラデーションを生成するため、HSB 色空間で Inverse Distance Weighted Interpolation を行おうとしました。ただし、色相の周りで色をより均等に配置し、できればカラーホイールを生成する別の方法(上記の Gradients in Other Colorspaces を参照)を提供できるよう、黄色を青に切り替えました。 |
magick -size 100x100 xc: +size xc:red xc:blue xc:lime -colorspace HSB \
-fx 'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) );
br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) );
cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_shepards_HSB.gif
![[IM Output]](../static/img/canvas/gradient_shepards_HSB.gif)
ご覧のとおり、色相グラデーションだけを生成しているため、すべての色が素晴らしく明るくなりました。しかし、非常に奇妙にも見えます。これは「色相」色チャンネルの「循環的」な性質によって生じます。その結果、青と赤の間の領域は、紫の色相を経由する短い「剰余」の経路ではなく、緑の色相を経由する遠回りの経路をたどります。 多くの研究の末、Circular Mean(円周平均)を距離の加重平均に使うことで、上記を正しく行うために必要な剰余の数学をどう行うかをついに発見しました。これは、極角としての色相を X と Y の直交座標へ変換することを含みます。それにより線形の数学を実行でき、値の線形加重を適切に行えます。その結果を、それから角度の色相へ戻して変換します。 |
magick -size 100x100 xc: +size xc:red xc:blue xc:lime \
-colorspace HSB -channel R \
-fx 'aa=u[1]*2*pi; ba=u[2]*2*pi; ca=u[3]*2*pi;
ar=1/max(1, hypot(i-50,j-10) );
br=1/max(1, hypot(i-10,j-70) );
cr=1/max(1, hypot(i-90,j-90) );
nr=ar+br+cr;
mod(atan2( ( sin(aa)*ar + sin(ba)*br + sin(ca)*cr )/nr,
( cos(aa)*ar + cos(ba)*br + cos(ca)*cr )/nr
)/(2*pi)+1, 1)' \
-separate -background white -combine +channel \
-set colorspace HSB -colorspace sRGB gradient_circular_mean_hue.gif
![[IM Output]](../static/img/canvas/gradient_circular_mean_hue.gif)
注意: 上記は色相チャンネルだけに対して操作を行いました。実際の画像では、(通常どおり)彩度と輝度のチャンネルに対しても操作する必要があります。 ご覧のとおり、これで赤と青の間に正しいグラデーションが得られました。ただし、この方法を角度的な隔たりが大きい原色だけに適用すると、中央で非常に急激なグラデーション変化を生じる傾向があります。つまり、結果は正しいものの、色相効果の非常に大きな変化に対しては角度的な色相の変化が線形になりません。 近い色相を多数平均するにはうまく機能しますが、これらの大きく離れた原色に対してはそうではありません。私はさらに、より一般的な「逆 2 乗」や「シェパード」法(上記参照)ではなく、より強い「逆加重」を使うように切り替えてみましたが、いくらか改善はしたものの、非線形の効果のために色相変化はやはり中央で圧縮されていました。 入力色は定数なので、それらをあらかじめ色相 x と色相 y の座標へ変換し、それらのチャンネルに対してシェパード加重を行ってから、再び戻して変換すれば、実際には処理がさらに高速になるでしょう。すなわち、色を HSB 色空間から Hx,Hy,S,B 色空間へ変換して、この手法を適用するのです。これを行えば、中心点、さらには点と点の間の均等なグラデーションは白(HSB 色空間の中心点)に向かってシェーディングされます。これを HSL 色空間で行った場合は、その領域は中間調のグレーに向かってシェーディングされます。
この極座標の色相から X-Y 座標への変換は、ある意味で、計算を非極座標の RGB 空間で行うのと似ています。RGB 空間は同じグレーに向かうシェーディング効果を示します(前の例を参照)。そこで、Circular Mean を使うことで、実は単に HSB 色空間を高度に歪んだ変種の RGB へ変換しているだけなのなら、いっそ線形 RGB 色空間でこの作業を行い、色を彩度を上げて色相を生成すればよいのではないか!
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '50,10 red 10,70 blue 90,90 lime' \
-colorspace sRGB gradient_inverse_RGB.png
magick gradient_inverse_RGB.png -colorspace HSB \
-channel GB -evaluate set 100% +channel \
-colorspace sRGB gradient_inverse_RGB_Hue.gif
| このような強い原色をブレンドする際の 'sRGB 暗化' を避けるため、画像処理は線形色空間(RGB)で行いました。詳細は Processing Real Images を参照してください。
---|---
ご覧のとおり、複雑な「剰余の数学」をすべて取り除いたにもかかわらず、以前とほぼまったく同じ結果が得られます。 ただし、色の開始点の間で色相をより線形に分布させるという点では、まだ少しも近づけていません。 このすべての教訓は、色相を扱うのは難しいということです。「赤の不連続」のためだけでなく、色が非常に大きく離れているときに起きる非線形の効果のためにもです。そして結局のところ、結果は線形 RGB 空間で直接作業して色を彩度上げした場合と同じでした。 本質的に、HSB や HSL の色空間は面白いものの、線形でも、現実的でも、作業に実用的な色空間でもありません。これがおそらく、実際に色相を直接扱う操作がほとんどない理由でもあるでしょう。
完全なグラデーションを(数学的に)生成する
Fourier Transforms(循環的)、Image Mapping、さらには Gradient Mathematics のための、完全な数学的グラデーションを生成するには、これまで見てきたグラデーションとは異なる特別なグラデーションが必要です。 どういう意味かというと、ここに小さな 1x5 ピクセルの "gradient:" 画像があります。個々のピクセル色が見えるよう Scaled(拡大)してあります。 |
magick -size 1x5 gradient: -scale 2000% gradient.png
![[IM Output]](../static/img/canvas/gradient.png)
この画像は、最上行に沿った正確な '白' の色から、最下行に沿った正確な '黒' の色へと至るグラデーションを作成します。これは「理想化された」グラデーションであり、ユーザーが指定した実際の色を実際に含んでいるため、一般にはまさにユーザーが望むものです。 しかし、これはユーザーが期待するものではあっても、数学的に正しいグラデーションではありません。Image Coordinates vs Pixel Coordinates で議論したように、ピクセルは実際には面積を持ちます。そのため、画像上部の白いピクセルはそのピクセルの中心を表し、黒は最下部のピクセルの中心を表します。すなわち、画像の端ではなく、端から 1/2 ピクセル離れた位置です。数学的には、画像は端から始まります。 そのため、完全な数学的グラデーションを生成するには、ピクセル座標で、画像の端における色の位置を指定する必要があります。すなわち、画像座標では位置は 1/2 ピクセルずれており、画像サイズは(画像サイズより 1 ピクセル小さい位置ではなく)画像内のピクセル数そのもの(距離)になります。 数学的に完全なグラデーションを生成する一つの方法は、Barycentric Sparse Color(次のセクションで詳しく見ます)を使って、完全な端から端までのグラデーションを生成することです… |
magick -size 1x5 xc: \
-sparse-color Barycentric '0,-0.5 white 0,%[fx:h-.5] black' \
-scale 2000% gradient_math.png
![[IM Output]](../static/img/canvas/gradient_math.png)
使われている座標が -0.5 から画像の高さ引く 0.5 まで及んでいる点に注意してください。これは画像の実際の端のピクセル座標です。 そして結果をよく見ると、最上部と最下部のピクセルが 白や黒の色ではない ことが分かります。ピクセルは、そのピクセル中心におけるグラデーションの色になっています。 このグラデーションは数学的に正しいため、特別な「タイル状」または「循環的」な状況で使ったときに正しく「タイル」されます。前のグラデーション画像は正しく「タイル」されません。純白のピクセルが純黒のピクセルの隣に来るため、純白と純黒が通常等価な値と見なされる状況で、数学的な周期に 1 ピクセルの隙間すなわち「不連続」を生じます。 より簡単な方法は、1 ピクセル長い "[gradient:](#gradient)" 画像を生成し、(現在の "[-gravity](https://imagemagick.org/command-line-options/#gravity)" 設定に従って)どちらかの端から 1 ピクセルを切り落とすことです。 たとえば、ここでは最上部の白いピクセルを切り落としています。最終結果では黒いピクセル(またはゼロ値)を持つ方が望ましいことが多いためです。 |
magick -size 1x6 gradient: -chop 0x1 -scale 2000% gradient_chopped.png
![[IM Output]](../static/img/canvas/gradient_chopped.png)
結果のグラデーション画像は、その後必要に応じて Rotated(回転)して、後の画像処理に必要な画像を生成できます。 ただし、このグラデーションは正しく「循環」しますが、色の実際の位置は厳密には正しくありません。とはいえ、多くの場合はこれで十分です。「完全なグラデーション」が必要な場合は、sparse color グラデーションの使用をおすすめします。 要約すると… グラデーションに何を求めるかを少し考えるだけで、最終結果の正確さに大きな違いが生まれることがあります。しかし、それが重要でないなら、気にせず、手元の作業に最も簡単なものを使ってください。
色の疎な点
"[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color) " 演算子は IM v6.4.3-0 で追加されたもので、画像を受け取り、指定された浮動小数点の 'x,y' 座標それぞれに、指定した色を設定します。すなわち、次の形式です…
-sparse-color {method} 'x,y color x,y color x,y color ...'
残りのピクセル("[-channel](https://imagemagick.org/command-line-options/#channel)" 設定に従って制限される)は、これらの孤立した色の点との関係に従ってマッピングされ、点と点の間の色が滑らかにされます。method は、その関係がどうなるかを定義します。 当然ながら、間にある色がどうなるべきかを定義する方法はたくさんあり、どの方法を選ぶかは、あなたが何を達成しようとしているかに本当に依存します。 これは実際には、2 次元補間の完全に自由形式のバージョンとして分類することもできます(Interpolation, Wikipedia を参照)。画像の拡大、すなわち Resize は実際にはこの特殊な部分集合ですが、拡大すべきピクセルの完全な固定グリッドから始める点が異なります。残念ながら、グリッド状の点を扱うために特別に設計された Resize Filters や Interpolate Methods のうち、疎に離れた色の点の自由形式の集合へ直接変換できるものはほとんどありません。すなわち、不完全なグリッドを含むリサイズはうまくいかないということです。 これはまた、「地理情報システム(GIS)」の手法とも関連しています。GIS では、(めったに厳密なグリッドにはならない)疎に離れた高さの点を使って地形が測定され、残りの地形はそれらの孤立した点から決定されます。同様の状況で、気象学はしばしば孤立した気圧と気温の点を持ち、それを補間する必要があります。 通常、補間の後、地図はさらに処理されて、等しい値(高さ、気圧、気温)の点を示す「等値線」を生成し、ほとんどの人がよく知っているさまざまな天気図を作り出します。この場合、生成された画像を、入力データの単純なグレースケールの「高さマップ」と考えるか、あるいは 3 つの変数すべてを同時に、それぞれ別々の画像「チャンネル」に表したものと考えることができます。
Barycentric(三角形グラデーション)
"Barycentric" 法は、3 点(そして 3 点だけ)を線形の三角形の色にマッピングします。この三角形の外側の色は以前と同じように続きます。入力点を小さな円で印してあるので、見えている色はすべて Sparse Color Operator が生成した補間値です。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_barycentric.png
![[IM Output]](../static/img/canvas/sparse_barycentric.png)
| このような強い原色をブレンドする際の 'sRGB 暗化' を避けるため、画像処理は線形色空間(RGB)で行いました。詳細は Processing Real Images を参照してください。
---|---
4 点以上が与えられると、与えられたすべての点にわたって「最良適合」が行われ、その結果、実際の点がそれらの点に指定された正確な色を得られないことがあります。 ただし、グラデーションは単に「止まる」のではなく、それらの点を超えて変化し続ける点に注意してください。伝統的には、barycentric グラデーションは、それを生成するために使われた点を包む三角形の内側に限定されます。たとえば… |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
\( -size 100x100 xc:black -draw 'polygon 30,10 10,80 90,90' \) \
-alpha off -compose CopyOpacity -composite \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_triangle.png
magick -size 100x100 xc:none -draw "polygon 30,10 10,80 90,90" \
-colorspace RGB -channel rgb \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB sparse_bary_triangle_2.png
![[IM Output]](../static/img/canvas/sparse_bary_triangle_2.png)
| 上記で使われている三角形のマスクは、draw が形状の周りに余分な線を 1 本描く性質のために、1/2 ピクセル大きすぎます。詳細は Draw Fill Bounds を参照してください。これは、グラデーションの三角形メッシュを生成するときに問題になることがあります。
---|---
'barycentric' 法は、実際には 3 つの色チャンネルそれぞれに対して別々に線形アフィン方程式をマッピングするものです。そのため、上記の 3 点の例の各色チャンネルを分離すると、各色チャンネルで 3 つの単純な線形グラデーションが得られます。
magick sparse_barycentric.png -separate sparse_bary_%d.gif
上記のグラデーションがすべて三角形の辺の一つに平行にマッピングされたのは、原色を使ったからにすぎません。それは通常そうなるわけではありません。しかし、画像の各分離チャンネルでは必ず単純な線形グラデーションが得られ、3D 色空間では値の平坦な平面が得られます。
Barycentric と 2 色グラデーション
三角形 barycentric グラデーションのこの平行効果は、実は非常に有用です。2 つの点を同じ色に設定すると、それら 2 点が、それらと他の色の点との間のグラデーションの「角度」を定義します。たとえば、2 つの点を 'red' にすることで、グラデーションは 2 つの 'red' の点に平行になります… |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_gradient.png
![[IM Output]](../static/img/canvas/sparse_bary_gradient.png)
次は同じ例ですが、角度制御点の一つを動かして、それがどのようにグラデーションの角度を設定するかを示しています。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '50,70 red 10,80 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 50,70 50,72 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_gradient_2.png
斜めのグラデーション
これは、たった 2 色を使って任意の線形の斜めグラデーションを生成する簡単な方法を提供します。たとえば、これは任意のサイズの入力画像に対して、一方の隅から別の隅へ向かう斜めのグラデーションを作る、特に素敵な方法です。
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,0 skyblue -%w,%h skyblue %w,%h black' \
-colorspace sRGB diagonal_gradient.jpg
そして、他の 2 つの隅に合わせるには…
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,%h black -%w,0 black %w,0 skyblue' \
-colorspace sRGB diagonal_gradient_2.jpg
これらの「斜めグラデーション」は、上記のような長い画像でも自然に見えるグラデーションを生成します。3 つの色の点の位置、特に 2 つの隅の間のグラデーションの角度を定義する、等しい色の 2 点の位置をよく見てください。どちらの場合も、それらの点の一つが画像そのものの内側にすら位置していない点に注目してください! また、グラデーションが描かれる画像のサイズに合わせて位置が自動的に調整されるよう、Percent Escapes(パーセントエスケープ)を使っている点にも注意してください。
2 点グラデーション
色の点を 2 つだけ与えると、IM は 3 番目の点を自動生成し、角度が元の 2 点の間で垂直になるようにします。結果は、多くの制御が効く単純な線形グラデーションです。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 90,90 90,92' \
sparse_bary_two_point.png
![[IM Output]](../static/img/canvas/sparse_bary_two_point.png)
ただし、2 点グラデーションは、非常に「横長」または「縦長」の画像(高アスペクト比)の隅に適用するとあまりうまく機能しません。基本的に、上記の 3 点グラデーションとは異なり、グラデーションが斜めに揃いません。角度は付くものの、「面白く」なるほどには付かないのです。
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,0 skyblue %w,%h black' \
-colorspace sRGB sparse_bary_two_point_wide.jpg
Bilinear(4 点グラデーション)
この方法は 4 点に対して方程式を、3 つの色チャンネルすべてにわたって適合させ、点と点の間およびその先で一様な色のグラデーションを生成します。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Bilinear '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_bilinear.png
![[IM Output]](../static/img/canvas/sparse_bilinear.png)
この「4 点適合」は、上記の画像を取り、個々の色チャンネルのグラデーションを分離することで確認できます。
magick sparse_bilinear.png -separate sparse_bilin_%d.gif
方程式が曲線(実際には二次曲線)を生成する点に注目してください。ただし、4 点が平行な線を形成する場合、生成されるグラデーションは線形になります。 この方法は、4 点が直交(長方形)グリッドに揃っているとき、実際には Bilinear Interpolation 法(下記の Interpolated Lookup Gradients を参照)と等価です。 4 点未満が与えられると、上記の関数は 3 点の '[Barycentric](#barycentric)' 法(上記参照)に置き換えられます。4 点を超えると、すべての点の最良適合を行うため、実際には指定した点で指定した色に一致しないことがあります。これはおすすめしません。
Voronoi(最近色)
"Voronoi" 法は、各ピクセルを、あなたが提供した最も近い色の点にマッピングするだけです。これは基本的に、画像を各点の周りの一連の多角形の「セル」に分割します。たとえば… |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi.gif
![[IM Output]](../static/img/canvas/sparse_voronoi.gif)
ご覧のとおり、各点の周りの色付きの「セル」にアンチエイリアスをかける試みは行われていません。各セルの端は、実際には各点の最近接点のちょうど中間に落ちます。 これは、たとえば画像をさまざまな方法で切り分けるマスクを生成するのに使えます。1 つの点を白に、残りすべてを黒に割り当てれば、画像から 1 つの「セル」だけを抽出できます。 結果を滑らかに(アンチエイリアス)したい場合は、何らかの Super Sampling(スーパーサンプリング)を使って画像を滑らかにできます。たとえば、4 倍大きいものを生成し、"[-scale](https://imagemagick.org/command-line-options/#scale)" で望むサイズに戻します。 |
magick -size 400x400 xc: -colorspace RGB \
-sparse-color Voronoi '120,40 red 40,320 blue 270,240 lime 320,80 yellow'
\
-scale 25% -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_ssampled.png
![[IM Output]](../static/img/canvas/sparse_voronoi_ssampled.png)
| このような強い原色をブレンドする際の 'sRGB 暗化' を避けるため、すべての画像処理は線形色空間(RGB)で行いました。詳細は Processing Real Images を参照してください。
---|---
より簡単な方法(ただしあまりきれいではありません)は、単純に画像をごくわずかにぼかすことです… |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 1x0.7 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_smoothed.png
![[IM Output]](../static/img/canvas/sparse_voronoi_smoothed.png)
生成した画像を大きくぼかすことで、生成された「セル」の間に非線形のグラデーションを設定できます。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 0x15 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_blur.png
![[IM Output]](../static/img/canvas/sparse_voronoi_blur.png)
"[-blur](https://imagemagick.org/command-line-options/#blur)" が大きいほど、さまざまな「セル」の間のグラデーションが大きくなります。ただし、これは小さな色のセルを保持しなかったり、元の点が、異なる色のセルの端(や別の点)に近い場合に、与えられた色のままであることを保証しなかったりすることがある点に注意してください。 Fred Weinhaus 氏が開発した特別な「線形ブラー」手法を使えば、セルの間に固定幅の線形グラデーションを生成できます。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 10x65535 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_gradient.png
![[IM Output]](../static/img/canvas/sparse_voronoi_gradient.png)
ぼかしていない出力は、さまざまな Edge Detection(エッジ検出)手法に渡して、さまざまな境界の縁を生成することもできます。画像を Raster to Vector Convertor で再マッピングしてベクトル線を生成できます。ただし、デフォルトの 'autotrace' 設定は、隅をよりよく検出するために "-corner-threshold 120" で調整する必要があることが分かりました。
Shepards(色の斑点)
"Shepards" 法は、与えられた各点までの距離の逆 2 乗の比を使って、各点におけるキャンバスの色を決定します。数学がどのように行われるかの例については、上記の More Complex DIY Gradients を参照してください。 これは、各点に色のスポットライトがあって互いに作用し合い、光が広がるにつれて、無限遠ではすべての与えられた色の一様な平均に向かうのに少し似ています。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards.png
![[IM Output]](../static/img/canvas/sparse_shepards.png)
| このような強い原色をブレンドする際の 'sRGB 暗化' を避けるため、画像処理は線形色空間(RGB)で行いました。詳細は Processing Real Images を参照してください。
---|---
特定の領域を似た色で囲むことで、その特定の色の台地を生成できます。ただし、囲む点の間の境界は「漏れる」ことがあり、「台地」の中央は(他の色の点までの距離に応じて)たわんで浅い椀状になることがあります。 この方法はまた、Shepards Image Distortions で使われるような変位場を生成するために使われるものでもあります。その場合、マッピングされるのは色の R,G,B 値ではなく、X と Y の変位ベクトルです。
Inverse(鋭い色の点)
"Inverse" 法は "Shepards" とほぼ同じですが、与えられた点のより直接的な逆距離加重を使う点が異なります。数学がどのように行われるかの例については、上記の More Complex DIY Gradients を参照してください。これは ImageMagick バージョン 6.6.9-7 のかなり後の追加でした。たとえば… |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_inverse.png
![[IM Output]](../static/img/canvas/sparse_inverse.png)
ご覧のとおり、鋭い色の点を生成し、それが素早く背景の「平均色」に溶け込みます。これは、丸いスポットを生成し、色の点の周りに「平坦な」色を持つ Shepards Method と対照的です。 ただし、すべての制御点が線を形成する線形グラデーションを生成するときには、こちらの方がうまく機能します。すなわち、画像内の特定の線に沿った 1 次元のグラデーションを生成するときです。 しかし、もう一点述べておくべきことがあります。これらの色の点がほぼ「平均」レベルへ落ちる速さは、それらがどれだけ近いかによって制御されます。2 つの点源を近くに置くと、それらは素早く落ち、離れているほど、個々の色の影響が大きくなります。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '45,45 red 55,55 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 45,45 45,47 circle 55,55 55,57' \
sparse_inverse_near.png
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,30 red 70,70 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,30 30,32 circle 70,70 70,72' \
sparse_inverse_far.png
また、特定の点を同じまたは似た色で「重ねる」(ちょうど重ねるか、ごく近くに置く)と、その色の点を 2 倍強くできます。 |
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,30 red 75,65 lime 65,75 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,30 30,32 circle 75,65 75,67 circle 65,75 65,77 '
\
sparse_inverse_stronger.png
![[IM Output]](../static/img/canvas/sparse_inverse_stronger.png)
これらの効果は '[Shepards](#shepards)' 法にも当てはまります!
Shepards のべき乗係数
Shepards と Inverse の sparse color 法は、実際には同じものですが、逆距離加重に適用される「べき乗レベル」が異なります(それぞれ 2.0 と 1.0)。IM v6.8.0-10 以降では、操作用の define 'shepards:power' を使ってこのべき乗レベルを設定でき、これは '[Shepards](#shepards)' 法で使われます。たとえば
magick -size 100x100 xc: -colorspace RGB -define shepards:power=0.5 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow0.5.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=1 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow1.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=2 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow2.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=3 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow3.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=8 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow8.png
![[IM Output]](../static/img/canvas/sparse_shepards_pow0.5.png)
べき乗 0.5 | ![[IM Output]](../static/img/canvas/sparse_shepards_pow1.png)
べき乗 1.0
(inverse) | ![[IM Output]](../static/img/canvas/sparse_shepards_pow2.png)
べき乗 2.0
(shepards) | ![[IM Output]](../static/img/canvas/sparse_shepards_pow3.png)
べき乗 3.0 | ![[IM Output]](../static/img/canvas/sparse_shepards_pow8.png)
べき乗 8.0
---|---|---|---|---
ご覧のとおり、「色の斑点」は、非常に鋭い点から、丸いスポットへ、そして大きな色の領域へと広がっていきます。非常に高いべき乗レベルでは、最終的に Voronoi Sparse Color Method と同じパターンを再現します。 この -define は Shepards Sparse Color に影響するだけでなく、sparse color 法によって生成される計算された変位マップに基づく Shepards Distortion Method にも同様の効果を持ちます。 ただし、常に 1.0 のべき乗レベルを使う Inverse sparse color 法には影響しません。
Sparse Color 法の要約
ここに、比較のため、さまざまな 4 点の "[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)" 画像を再掲します。 ![[IM Output]](../static/img/canvas/sparse_voronoi.gif)
Voronoi | ![[IM Output]](../static/img/canvas/sparse_voronoi_blur.png)
Voronoi(ぼかし) | ![[IM Output]](../static/img/canvas/sparse_shepards.png)
Shepards | ![[IM Output]](../static/img/canvas/sparse_inverse.png)
Inverse | ![[IM Output]](../static/img/canvas/sparse_bilinear.png)
Bilinear
---|---|---|---|---
そして、さまざまな 3 点法の要約です。 ![[IM Output]](../static/img/canvas/sparse_voronoi_3pt.gif)
Voronoi | ![[IM Output]](../static/img/canvas/sparse_voronoi_blur_3pt.png)
Voronoi(ぼかし) | ![[IM Output]](../static/img/canvas/sparse_shepards_3pt.png)
Shepards | ![[IM Output]](../static/img/canvas/sparse_inverse_3pt.png)
Inverse | ![[IM Output]](../static/img/canvas/sparse_barycentric.png)
Barycentric
---|---|---|---|---
現時点では、'[Voronoi](#voronoi)'、'[Shepards](#shepards)'、'[Inverse](#inverse)' の各法だけが 4 点を超える場合に適しています。 より多くの "[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)" 法が計画されています。何かアイデアがあれば、私にメールしてください。
チャンネルと Sparse Color
"[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)" 演算子は "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定の影響を受けます。これは、その設定を使ってその効果を単一のチャンネルだけに限定したり、透明度チャンネルに拡張したりできることを意味します。 また、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定を使って、1 つのチャンネルだけに対して操作してから、そのチャンネルを "[-separate](https://imagemagick.org/command-line-options/#separate)" することで、グレースケール画像の処理を高速化することもできます(詳細は Channel Handling を参照)。たとえば… |
magick -size 100x100 xc: -channel G -sparse-color Shepards \
'30,10 gray70 10,80 black 70,60 white 80,20 gray(33.3333%)' \
-separate +channel -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_gray.gif
![[IM Output]](../static/img/canvas/sparse_shepards_gray.gif)
IM v6.6.8-5 以降では、変更されていないチャンネルが保持されるため、Sparse Color を "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定とともに使って、任意の画像に透明グラデーションを素早く簡単に追加できるようになりました。たとえば、ここでは透明な Diagonal Gradient を追加し、組み込みの "rose: 画像の対角線に沿って 50% の透明度になるよう揃えています。 |
magick rose: -alpha set -channel A \
-sparse-color Barycentric \
'0,0 opaque %w,-%h opaque %w,%h transparent' \
rose_alpha_gradient.png
![[IM Output]](../static/img/canvas/rose_alpha_gradient.png)
| 色 'Opaque' は 'Black' の別名にすぎません。基本的に、本当に欲しいのは完全に不透明な色を指定することだけで、実際の色そのものは重要でないときに使われます。色 'Transparent' も同様です。代わりに 'White' と 'None' をそれぞれ使うこともできました。
---|---
| IM v6.6.8-5 より前では、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定で選択されていないチャンネルはゼロ(黒)の値にリセットされました。これにより、その実効的な有用性が大きく制限されていました。
---|---
Sparse Color は、色名の代わりに正規化された浮動小数点値も受け付けます。色名を置き換えるために提供する必要がある値の数は、現在の "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定と、そのチャンネルが処理対象の画像内で「アクティブ」かどうかに依存します。最も簡単なのは、処理を単一のチャンネルに限定することです。 また、色名ではなく生の数値を使う場合、透明度の値は(IMv7 では)'alpha' 値(1 = 不透明)ではなく 'matte' 値(0 = 不透明)である点に注意してください。そのため、上記では色名の代わりに数値を使うこともできました…
-channel A -sparse-color Bilinear '0,0 1.0 -%w,%h 1.0 %w,%h 0.0'
これは、'colorname' 翻訳機能にアクセスできないかもしれない、プログラムされたスクリプトや API では扱いやすいかもしれません。
塗りつぶし演算子としての Sparse Color
Sparse Color Operator を作成した当初の理由の一つは、少数の固定された色の点だけを含む画像を与え、そこから残りの未定義の色を「埋める」ことができるようにするためでした。たとえば、ここでは少数のピクセルを描画しました。半透明や混合色が描かれないよう、"[+antialias](https://imagemagick.org/command-line-options/#antialias)" 設定を特別に無効化したので、画像には指定した正確な 4 色だけが含まれ、それ以外はありません。 |
magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
-stroke Gold -draw "path 'M 20,70 A 1,1 0 0,1 80,50'" \
-stroke DodgerBlue -draw "line 30,10 50,80" \
-stroke Red -draw "circle 80,60 82,60" \
sparse_source.gif
![[IM Output]](../static/img/canvas/sparse_source.gif)
さて、この画像に存在する少数の透明でないピクセルを抽出し、多点 sparse color 法 '[Shepards](#shepards)' を使って他のすべての色を埋めることができます。 |
magick sparse_source.gif sparse-color:- |\
magick sparse_source.gif -alpha off \
-sparse-color shepards '@-' sparse_fill.png
![[IM Output]](../static/img/canvas/sparse_fill.png)
上記の "sed" コマンドは、Enumerated Text File Format(列挙テキストファイル形式)を受け取り、最初のヘッダ行と透明度を含む任意の行を削除してから、それをピクセル座標と色のリストに再整形します。そのリストは、特別な "@-" 引数を使って Sparse Color Operator に「パイプライン」されます。 そう、上記は非常にトリッキーですが、機能します。少なくとも非常に少数の点に対しては。ただし、提供する点が多いほど、操作は遅くなります。これは、Sparse Color が、画像や Morphology 指向ではなく、「点」指向で処理を行うためです。 いずれは、上記の画像をそのまま与えて透明領域を自動的に埋めさせられるような、モルフォロジー指向の「穴埋め」法のセットを提供できればと考えています。 この点抽出手法は、EdgeIn Morphology Method と組み合わせて、オブジェクトや穴の端の周りのピクセルを抽出できます。それにより、欠けた背景や穴を「埋める」ことができます(Morphology and Channels で示されているように)。たとえば…
magick figure.gif -channel A -morphology EdgeIn Diamond
shape_edge_pixels.gif
magick shape_edge_pixels.gif txt:- |\
sed '1d; / 0) /d; s/:.* /,/;' | \
magick shape_edge_pixels.gif -alpha off \
-sparse-color shepards '@-' shape_edge_in_lights.png
magick shape_edge_in_lights.png figure.gif -composite shape_in_lights.png
結果の画像は入力とまったく同じですが、透明な背景が距離でぼかされた「端の色」に置き換えられている点に注意してください。これが、画像の端が不明瞭になっている理由です。 この画像は、よりよい「端の羽化(フェザリング)」手法を生成しようと試みるために特別に開発されました。他の羽化手法については Blur Feathering と Distance Feathering を参照してください。
Sparse Color Shepards、ブラーの代替
"[-sparse-color](https://imagemagick.org/command-line-options/#sparse-color)" を使う代わりの一つは、透明背景上のピクセルの画像を取り、それを Blur(ぼかす)ことです。その後、透明度を捨てます。
magick sparse_source.gif -channel RGBA -blur 0x15 \
-alpha off sparse_blur_simple.png
これの問題は、元の色が保持されないこと、そして正確にどの 'sigma' 値を使うべきかという問題があることです。また、各色がどれだけ「近い」かを考慮しないため、近くにある('sigma' 値より近い)2 つの色付きピクセルが互いを圧倒し、ぼかされて溶け合ってしまいます。
よりよい方法は、徐々に小さくなる 'sigma' 値でぼかした画像を複数層生成し、ぼかしていない元の画像を一番上に置くことです。
for sigma in 64 32 16 8 4 2 1 0; do
magick sparse_source.gif -depth 16 \
-channel RGBA -blur 0x$sigma miff:-
done |
magick - -background none -flatten -alpha off sparse_blur_layered.png
この層状ブラー手法は、同じ画像に対する '[Shepards](#shepards)' 法の結果と等価です。厳密ではありませんが、非常に近いものです。ただし、入力ピクセルが多数関わる場合は、個々の点を使って計算するのではなく画像(モルフォロジー)指向なので、はるかに高速である可能性が高いです。 もう一つの層状ブラー法は、Resize を使ってぼかした画像の「ピラミッド」を生成することです。この手法は Large Blurs using Resize で詳しく説明されています。 |
magick sparse_source.gif \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
-layers RemoveDups -filter Gaussian -resize 100x100\! -reverse \
-background None -flatten -alpha off sparse_blur_pyramid.png
![[IM Output]](../static/img/canvas/sparse_blur_pyramid.png)
これは、各ぼかしステップで大きな 'sigma' 値(そしてそれゆえ非常に低速)を必要とせずに、非常に大きな画像でも非常に高速に機能します。本質的には、前の例のぼかした層を生成するのに、より高速な画像リサイズ手法を使っています。厳密ではありませんが、正しい結果のよい近似を生成します。 ただし、これは画像が正方形で、サイズが 2 のべき乗のものに対して最もうまく機能し、そうでなければ精度が落ちます。 上記の特別な演算子 "[-layers](https://imagemagick.org/command-line-options/#layers) RemoveDups" は、複数の「clone-resize」操作によって生成された余分な「単一平均ピクセル」画像を取り除きます。その後、画像は Gaussian Resize Filter(ブラーと等価)を使って元のサイズにリサイズされます。次に、元の画像を一番上に、よりぼかした層を下に置くよう画像順序を逆にしてから、以前と同様にフラット化します。 これには、画像を一度だけ読み込めばよく、すべての作業を 1 つのコマンドで行えるという利点があります。また、特にリサイズが各ステップで画像を半分にするだけなので、大きな画像でも非常に高速に機能し、非常に大きな sigma での低速なぼかしを回避します。 この方法の唯一の欠点は、「ぼかした」画像を復元するために元の画像のおおよそのサイズを知っておく必要があること、そして生成するリサイズクローンの数のおおよその見当(最大の寸法の Log2 に 1 を足したもの)を付ける必要があることです。 ただし、リサイズクローンをやり過ぎても、入力画像がすでに最小の 1 ピクセル画像までリサイズされていれば、リサイズが単に「何もしない(no-op)」になるため、大きな性能上の打撃にはなりません。余分で無用な「リサイズされた画像層」は、その後 "[-layers](https://imagemagick.org/command-line-options/#layers) RemoveDups" を使って自動的に処理されます。唯一の本当の問題は、2 のべき乗でないサイズの画像を扱うとき、リサイズされた画像が「同期が外れる」可能性です。この問題がどれほど深刻かは分かりませんが、それらの画像は最もぼかされてもいるので、それほど大きくはないはずです。 もちろん、これにはまだ '[Shepards](#shepards)' 法の「漏れ」の問題があるので、この問題をもっと詳しく見てみましょう。
Shepards 法は「漏れる」
'[Shepards](#shepards)' 法は「境界」の理解を一切持たないため、ある「色の線」の向こう側の色は、その線を越えて漏れたり「染み出したり」します。最終的に、十分な距離では、すべてのピクセルの純粋な平均色が得られます。これは必ずしも望ましい結果ではありません(場合によっては望ましいこともありますが)。 この例では、'Red' の曲線が 'White' の線に近づくほど、色は 2 本の線を越えて向こう側へより多く「漏れ」、ピンク色を生じます。 |
magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
-stroke Red -draw "path 'M 26,0 A 55,61 0 0,1 26,100'" \
-stroke White -draw "line 50,0 50,100" \
sparse_lines_near_source.gif
magick sparse_lines_near_source.gif txt:- |\
sed '1d; / 0) /d; s/:.* /,/;' |\
magick -size 100x100 xc: -sparse-color shepards '@-' \
sparse_lines_near.png
![[IM Output]](../static/img/canvas/sparse_lines_near.png)
この色の漏れは、特に複数の穴が関わる場合に、「穴埋め」に Shepards Method を使う際の主な問題です。一つの穴に関わる色が、まったく別の穴の色へ漏れて影響を与え得る(そしてその逆も)からです。 境界の理解こそが、Shepards Method と、「カラー拡散」として知られる別の形の色「穴埋め」との違いを形作るものです。 基本的に「カラー拡散」では、色は他の定義された色の線を通り抜けられません。これは、効果を「視線」内の色か、端の外側を回って漏れる色だけに限定することで達成されます。これには、どの色がピクセルに影響するかを限定するために、最も近い色までの距離を使う必要があります。 「カラー拡散」の一つの主要な用途は、Diffusion Curves のウェブサイトで紹介されています。これはカラー拡散を多用するだけでなく、拡散を非常に高速に生成する手法に関する情報も含んでいます。 いつか、これを ImageMagick に実装できればと考えています。
プラズマ画像
プラズマグラデーション
グラデーションが滑らかな色の範囲を提供するのに対し、もう一つの画像作成演算子 "plasma:" は別種のグラデーションを提供します。画像のためのランダムな色の背景を生成するのに理想的に適したものです。 まず指摘しておくべきは、"plasma:" はランダム化された画像であるということです。そのため、実行するたびに異なる画像を生成し得ます(そして実際にそうなります)。たとえば、ここでは 3 つの別々の「標準的な」プラズマ画像を生成します。同じコマンドで生成したにもかかわらず、各画像は互いに異なります。
magick -size 100x100 plasma: plasma1.jpg
magick -size 100x100 plasma: plasma2.jpg
magick -size 100x100 plasma: plasma3.jpg
プラズマ画像もまた、ランダム化された色のグラデーションの一種であり、"gradient:" と同様に上が白、下が黒で始まることも分かります。 あまりよく文書化されていませんが、上記の線形グラデーションとまったく同じ方法で、プラズマグラデーションに色を指定できます。
magick -size 100x100 plasma:blue plasma_range1.jpg
magick -size 100x100 plasma:yellow plasma_range2.jpg
magick -size 100x100 plasma:green-yellow plasma_range3.jpg
magick -size 100x100 plasma:red-blue plasma_range4.jpg
magick -size 100x100 plasma:tomato-steelblue plasma_range5.jpg
また、'tomato' や 'steelblue' のような中間調の色は、'red' や 'blue' のような純色よりもうまく機能する傾向があることも分かります。 同じ色を 2 回使うことで、その色が支配的だが、元の色に近いランダムな色の斑点を伴う背景を生成できます。
magick -size 100x100 plasma:black-black plasma_black.jpg
magick -size 100x100 plasma:grey-grey plasma_grey.jpg
magick -size 100x100 plasma:white-white plasma_white.jpg
magick -size 100x100 plasma:yellow-yellow plasma_yellow.jpg
magick -size 100x100 plasma:tomato-tomato plasma_tomato.jpg
magick -size 100x100 plasma:steelblue-steelblue plasma_steelblue.jpg
繰り返しになりますが、ご覧のとおり、中間調の色は、黒・白・黄色のような極端な色よりも、結果の画像により多様な色を生成します。上記の 'grey' のプラズマは特に素敵で、虹色に輝く「真珠母」のような効果を与えます。基本的に grey は、"plasma:" が生成する色に完全な自由度があるためです。 完全な 50% グレーのプラズマを正規化すると、白と黒を含む全色域にわたる、特に一様な多色プラズマ画像が生成されます。 |
magick -size 100x100 plasma:grey50-grey50 -auto-level plasma_grey_norm.jpg
![[IM Output]](../static/img/canvas/plasma_grey_norm.jpg)
あるいは、色のコントラストを広げて、極端にならない程度に色を大胆にすることもできます。 |
magick -size 100x100 plasma:grey50-grey50 \
-sigmoidal-contrast 8x50% plasma_grey_contrast.jpg
![[IM Output]](../static/img/canvas/plasma_grey_contrast.jpg)
この画像を、下記の「フラクタルプラズマ」画像と比べてみてください。
フラクタルプラズマ
プラズマ生成器には、高度にカラフルな効果を生み出す特別なフラクタルモードもあります。生成される色は、より誇張された色の変化を生み出すよう強調されます。
magick -size 100x100 plasma:fractal plasma_fractal1.jpg
magick -size 100x100 plasma:fractal plasma_fractal2.jpg
magick -size 100x100 plasma:fractal plasma_fractal3.jpg
実はこれは、すでに見た定数色のプラズマ画像と非常に似ており、実際これらは同じ方法で生成されますが、より顕著な色の変化を伴います。
私はしばしば、プラズマ画像が少し「ノイジー」だと感じます。そのため、"[-blur](https://imagemagick.org/command-line-options/#blur)" を使った少しの平滑化が、たいてい有益です。 ここでは、上記の中央のプラズマ画像からノイズを取り除いて滑らかにしました。 |
magick plasma_fractal2.jpg -blur 0x2 plasma_smooth.jpg
![[IM Output]](../static/img/canvas/plasma_smooth.jpg)
"[-paint](https://imagemagick.org/command-line-options/#paint)" を使って、ランダムな色のしみを作れます。 |
magick plasma_fractal2.jpg -blur 0x1 -paint 8 plasma_paint.jpg
![[IM Output]](../static/img/canvas/plasma_paint.jpg)
あるいは、"[-blur](https://imagemagick.org/command-line-options/#blur)" を使って低レベルのノイズを取り除いてから、"[-emboss](https://imagemagick.org/command-line-options/#emboss)" 画像演算子を使って、色をより顕著で円形にできます。 |
magick plasma_fractal2.jpg -blur 0x5 -emboss 2 plasma_emboss.jpg
![[IM Output]](../static/img/canvas/plasma_emboss.jpg)
"[-blur](https://imagemagick.org/command-line-options/#blur)" に続けて "[-sharpen](https://imagemagick.org/command-line-options/#sharpen)" を使うと、"[-emboss](https://imagemagick.org/command-line-options/#emboss)" で生成したよりもパステル調の色のパターンを生成できます。 |
magick plasma_fractal2.jpg -blur 0x5 -sharpen 0x15 plasma_sharp.jpg
![[IM Output]](../static/img/canvas/plasma_sharp.jpg)
私は実際、渦巻かせたプラズマグラデーションを、背景パターンとして特に素敵だと感じます。 |
magick -size 160x140 plasma:fractal \
-blur 0x2 -swirl 180 -shave 20x20 plasma_swirl.jpg
グレースケールプラズマ
さて、プラズマ生成器は、純粋な黒の単色に対してさえ常に色を生成します。しかし、純粋なグレースケールのプラズマを生成したいことがよくあります。これには 2 つの簡単な方法があります。 最も簡単な方法は、プラズマ画像を取り、それをグレースケールに変換することです。 |
magick -size 100x100 plasma:fractal -blur 0x2 \
-colorspace Gray plasma_greyscale.jpg
![[IM Output]](../static/img/canvas/plasma_greyscale.jpg)
もう一つの方法は、より強い単層の効果のために、色チャンネルの一つを他の 2 つにコピーすることです。 |
magick -size 100x100 plasma:fractal -blur 0x2 \
-channel G -separate plasma_grey_copy.jpg
![[IM Output]](../static/img/canvas/plasma_grey_copy.jpg)
最後の手法は、プラズマに "[-shade](https://imagemagick.org/command-line-options/#shade)" を使うことです。 |
magick -size 100x100 plasma:fractal -blur 0x5 \
-shade 120x45 -auto-level plasma_grey_shade.jpg
![[IM Output]](../static/img/canvas/plasma_grey_shade.jpg)
おそらく多くの光と影の効果が得られると思うでしょうが、生のプラズマは非常にランダムなので、"[-shade](https://imagemagick.org/command-line-options/#shade)" はより「まだら模様のプラズマ」効果を生み出すだけのようです。 高度に誇張された色変化を持つフラクタルプラズマを使う代わりに、定数色プラズマ法を使ってグレースケールプラズマを作成できます。副作用として、この方法では生成されるグレースケールプラズマ画像の全体的な明るさも制御できます。
magick -size 100x100 plasma:black-black \
-blur 0x2 -colorspace Gray plasma_grey0.jpg
magick -size 100x100 plasma:grey25-grey25 \
-blur 0x2 -colorspace Gray plasma_grey1.jpg
magick -size 100x100 plasma:grey50-grey50 \
-blur 0x2 -colorspace Gray plasma_grey2.jpg
magick -size 100x100 plasma:grey75-grey75 \
-blur 0x2 -colorspace Gray plasma_grey3.jpg
magick -size 100x100 plasma:white-white \
-blur 0x2 -colorspace Gray plasma_grey4.jpg
これでは大胆さが足りない場合は、プラズマ画像をグレースケール化するチャンネルコピー法を使ってください。
magick -size 100x100 plasma:black-black \
-blur 0x2 -channel G -separate plasma_grey5.jpg
magick -size 100x100 plasma:grey25-grey25 \
-blur 0x2 -channel G -separate plasma_grey6.jpg
magick -size 100x100 plasma:grey50-grey50 \
-blur 0x2 -channel G -separate plasma_grey7.jpg
magick -size 100x100 plasma:grey75-grey75 \
-blur 0x2 -channel G -separate plasma_grey8.jpg
magick -size 100x100 plasma:white-white \
-blur 0x2 -channel G -separate plasma_grey9.jpg
これらのグレースケールプラズマ画像は、さらなる処理に非常に有用で、他の画像効果を生成できます。たとえば、Background Images(背景画像)のページを見てください。そこには、フラクタルプラズマを使って多数の興味深い効果を生み出した膨大な数の例があります。
プラズマ画像のシードまたは反復
"plasma:" は、ほぼ純粋な黒やほぼ純粋な白、あるいは他のどんな色(純色になる可能性は低いですが)の領域も生成し得ることを覚えておいてください。すべてが一色になった画像が得られる可能性は低いものの、それも起こり得る結果です。 そのため、よい結果が得られたときには、後で再利用するために保存したくなるかもしれません。このため、プラズマ画像を使うスクリプトは、そうしたランダム化された画像を生成して再利用するオプションを含めたくなるかもしれません。すなわち、再利用できるよう、プラズマ画像の生成を、その画像を使う他の部分から分離したくなるかもしれません。 ただし、より簡単な手法は、IM の乱数生成器を「シード」または初期化して、'plasma:' が同じ「ランダム化された」画像を生成するようにすることです。そうすれば、スクリプトやプログラムを調整して、よい、あるいは興味深い色合いや効果を、何度も繰り返し生成できます。 |
magick -size 100x100 -seed 4321 plasma: plasma_seeded.jpg
![[IM Output]](../static/img/canvas/plasma_seeded.jpg)
上記の画像は決して変わらないので、"[-seed](https://imagemagick.org/command-line-options/#seed)" の数値を変えない限り、右下隅には常に '赤' の領域があります。 興味深いことに、同じシードを異なる初期化色グラデーションとともに使うと、ランダムではあるものの、内部のパターンが似た画像のセットを生成できます。
magick -size 100x100 -seed 4321 plasma:grey-grey plasma_rnd1.jpg
magick -size 100x100 -seed 4321 plasma:white-blue plasma_rnd2.jpg
magick -size 100x100 -seed 4321 plasma:green-yellow plasma_rnd3.jpg
magick -size 100x100 -seed 4321 plasma:red-blue plasma_rnd4.jpg
magick -size 100x100 -seed 4321 plasma:tomato-steelblue plasma_rnd5.jpg
ご覧のとおり、上記のすべての画像に同じ色のパターンが存在しますが、根底にある色のベースが、共有されるパターンの一部を強調したり覆い隠したりすることがあります。 最後に一つだけ注意です。"[-fx](https://imagemagick.org/command-line-options/#fx)" の 'rand()' 関数、"[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)" の 'random' 設定、"[-random-threshold](https://imagemagick.org/command-line-options/#random-threshold)" ディザ演算子、"[-noise](https://imagemagick.org/command-line-options/#noise)" 演算子など、他の IM 演算子も乱数生成器を使うことがあります。そのため、乱数生成器を使う特定の用途の直前に生成器をシードするのがよい考えです。 IM v6.3.4-3 以降では、"[+seed](https://imagemagick.org/command-line-options/#seed)" を使って生成器を再ランダム化することもできます。そのため、「シードされたプラズマ」の後にこの設定を置くことで、後の演算子が、望むなら正しくランダム化された結果を生成するようにできます。デフォルトでは、IM の起動時にシードがランダム化されるので、ランダムな結果を得るために通常は "[+seed](https://imagemagick.org/command-line-options/#seed)" で自分でランダム化する必要はありません。
プラズマ使用時の問題
"plasma:" 画像で避けるべき一つの問題は、高アスペクト比で生成することです。これは通常のプラズマの色効果を歪め、色を針のような筋へ引き伸ばす傾向があります。
magick -size 200x50 plasma: plasma_high_aspect.jpg
これには単純な解決策がないので、これがあなたの望むものでない限り、注意が必要です。 また、プラズマ画像には、存在すべきでない左上から右下への明確な対角方向の歪みもあります。すなわち、アルゴリズムに何らかの「空間的バイアス」の欠陥があるのです。たとえば、Thomas Maus 氏
magick -size 60x60 plasma: \( +clone -flop \) +append plasma_flaw.jpg
これは起こるべきではありません。しかし、この問題は深すぎて、プラズマ生成器関数全体を基本的に完全に書き直すことなしには修正できないようです。
ランダム画像
生のランダムノイズ
IM v6.3.5 以降では、ノイズ生成器 "[+noise](https://imagemagick.org/command-line-options/#noise)" の 'Random' 法を使って、既存の画像から純粋にランダムな画像を生成できます。 |
magick -size 100x100 xc: +noise Random random.png
![[IM Output]](../static/img/canvas/random.png)
お使いの IM がこれより古い場合でも、より低速な DIY FX Operator、"[-fx](https://imagemagick.org/command-line-options/#fx)" を使って純粋なランダムノイズ画像を生成できます。 |
magick -size 100x100 xc: -fx 'rand()' random_fx.png
![[IM Output]](../static/img/canvas/random_fx.png)
あるいは速度のために、"[-spread](https://imagemagick.org/command-line-options/#spread)" 演算子を使ってグラデーション(3 つの色チャンネルそれぞれに別々に)や他の画像をランダム化できます。 |
magick -size 100x100 gradient: -separate \
-virtual-pixel tile -spread 200 -combine random_spread.png
![[IM Output]](../static/img/canvas/random_spread.png)
結果は非常にランダムに見えるかもしれませんが、より制御された色(または単に色の値)の範囲を生成します。
ランダムな斑点(ピクセルダスト)
散らばったランダムなピクセルの画像を生成することも、非常に有用です。ランダム画像の 3 つの Color Channels(色チャンネル)のそれぞれが、別々のランダムなグレースケール画像と考えられ、これらのチャンネルをさまざまな方法で統合できることを覚えておいてください。 たとえば、まず色チャンネル('G' すなわち緑チャンネル)を Thresholding(しきい値処理)し、それをグレースケール画像として分離することで、ランダムなドットのマスクを生成できます。 |
magick random.png -channel G -threshold 5% -separate \
+channel -negate random_mask.png
![[IM Output]](../static/img/canvas/random_mask.png)
各色は線形にランダムな値なので、上記で使ったしきい値のパーセンテージが、選択されるピクセルの密度を直接定義します。 さらに進んで、さまざまな Image Composition(画像合成)法を使い、ある色チャンネル('G' すなわち緑チャンネル)を使って別の色チャンネル('R' すなわち赤チャンネル)からランダムな値を選択できます。
magick random.png -channel G -threshold 5% -negate \
-channel RG -separate +channel \
-compose Multiply -composite random_black.png
magick random.png -channel G -threshold 5% \
-channel RG -separate +channel \
-compose Screen -composite random_white.png
magick random.png -channel G -threshold 5% -negate \
-channel RG -separate +channel \
-compose CopyOpacity -composite random_trans.png
これらの種類の画像は、Glitter Animations(きらめきアニメーション)を生成するために直接使えます。しかし、さらなる処理、特に黒背景版に対する処理によって、ドットをそのグレースケールの強度に基づいて拡大したり、それらのドットから筋や星のフレアを生成したりできます。例については Star Generators を参照してください。 Seeded Plasma Images と同様に、"[-seed](https://imagemagick.org/command-line-options/#seed)" 設定を使って乱数生成器を事前初期化することもできます。これにより、プラズマ画像と同様に、特定のマシンに対して同じランダム画像を繰り返し生成できます。
ぼかしたランダム画像(ランダムなブロブ)
さて、ランダム画像を直接使って斑点状の効果を作ることもできますが、純粋にランダムな画像は一般にあまり有用ではありません。しかし、純粋にランダムな画像を Blurring(ぼかす)ことで、ある種の「近傍」の秩序を導入し、近くのピクセルが関連するようにできます。たとえば、ここでは 1 つのランダム画像をぼかし、ランダムな値がより大きな「ブロブ」やまだらな色を生成するようにします。
magick random.png -virtual-pixel tile -blur 0x1 -auto-level random_1.png
magick random.png -virtual-pixel tile -blur 0x3 -auto-level random_3.png
magick random.png -virtual-pixel tile -blur 0x5 -auto-level random_5.png
magick random.png -virtual-pixel tile -blur 0x10 -auto-level
random_10.png
magick random.png -virtual-pixel tile -blur 0x20 -auto-level
random_20.png
ただし、Virtual Pixel Setting なしでは、"[-blur](https://imagemagick.org/command-line-options/#blur)" 演算子は強い端の効果を持つ点に注意してください。これは避けるのが最善です。 おまけに、"[-virtual-pixel](https://imagemagick.org/command-line-options/#virtual-pixel)" 設定を 'tile' に変えることで、ランダム化された画像はタイル可能なままになり、色が画像境界を越えて回り込みます。 このタイル化能力は、現在ランダムな Plasma Images では不可能なものであり、純粋なランダム画像がそもそも非常にランダムであることの本質的な結果です。 ぼかしたランダム色相 ぼかしたランダムノイズ画像の変換の一つで、私が特に気に入っているのは、値を HSB の色相にマッピングすることです。 |
magick random_10.png -set colorspace HSB \
-channel GB -evaluate set 100% +channel \
-colorspace RGB random_hues_cyan.png
![[IM Output]](../static/img/canvas/random_hues_cyan.png)
上記の問題は、ブラーが赤-黄色(低い値)と赤-マゼンタ(高い値)の斑点を作る傾向があり、その間に緑・シアン・青の帯ができることです。これは単に、色相値がぼかされてレベル調整された方法の結果です。 これに対する理想的な解決策は、色相値の循環的な性質を考慮する一種の剰余ブラーでしょう。しかし、そのような演算子は現在利用できず、おそらく決して利用できないでしょう。 私が知る最良の解決策は、単純に画像内の 3 つのランダムチャンネルすべてを(Modulus-Add Composition を使って)加算し、値の範囲を広げることです。これには、ぼかした斑点を小さくするという副作用もありますが、少なくとも今度はよりダイナミックレンジの広い虹色が得られます。誰かもっとよいアイデアはないでしょうか? |
magick random_10.png -separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB random_hues.png
![[IM Output]](../static/img/canvas/random_hues.png)
ランダム画像を処理するより多くの方法については、上記の Plasma Images や Generating Backgrounds を参照してください。 ぼかしたランダムグレー 上記から分かるように、さまざまな原色のブロブを持つ画像が得られます。これは、各チャンネルがグレースケール画像として互いに完全に別々に処理されているためです。 上記の各画像のチャンネルの一つを抽出して、ぼかした画像の構造を見てみましょう…
magick random.png -channel G -separate random_0_gray.png
magick random_1.png -channel G -separate random_1_gray.png
magick random_3.png -channel G -separate random_3_gray.png
magick random_5.png -channel G -separate random_5_gray.png
magick random_10.png -channel G -separate random_10_gray.png
magick random_20.png -channel G -separate random_20_gray.png
まず気づくべきことは、画像が一般に(常にではありませんが)おおよそ等量の黒と白の領域を含むということです。ランダム画像を 50% でしきい値処理すると、これが分かります。
magick random_0_gray.png -threshold 50% random_0_thres.png
magick random_1_gray.png -threshold 50% random_1_thres.png
magick random_3_gray.png -threshold 50% random_3_thres.png
magick random_5_gray.png -threshold 50% random_5_thres.png
magick random_10_gray.png -threshold 50% random_10_thres.png
magick random_20_gray.png -threshold 50% random_20_thres.png
ご覧のとおり、曲線的な線で分けられた、おおよそ 50% の白と 50% の黒の領域が得られます。また、この線の曲がり具合は、純粋なランダム画像のぼかしに使った 'sigma' 値に応じて変化します。個々のピクセルが黒と白の「雪」を生成するものから、画像が 2 つの黒と白の領域へ非常に一様に(とはいえまだランダムに)分離されるものまでです。 ランダム画像を使うより多くの例については、Background Images を参照するか、ランダム化されたキャンバスの生成については Random Spots of Solid Color を見てください。
ランダムな粒度(混沌の中の秩序)
さて、ぼかしたランダム画像はすべて同じ初期ランダム画像から生成されたので、すべて関連していることを覚えておいてください。しかし、新しく生成される各ランダム画像は、完全に異なるパターンを持ちます。ただし、パターンは構造的には多かれ少なかれ似て見えます。 まず、「ぼかしたランダム画像」を一から生成する完全な例を挙げましょう… |
magick -size 100x100 xc: -channel G +noise Random \
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate +channel random_5_gray.png
![[IM Output]](../static/img/canvas/random_5_gray.png)
操作を画像の 'Green' チャンネルに限定するための "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定の多用は、画像全体の生成を 3 倍速くするので重要です。Channel separate は、その後、純粋なグレースケールの結果が得られることを保証します。 望むなら、両方の "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定を省略することもできます。その結果、3 つの完全に別々で異なる「ぼかしたランダム画像」が生成されます。 この画像には重要な特徴がいくつかあります。画像を 3 つの等しい色のセットに分割すると(Posterization と呼ばれる手法を使って)、それがより明確に見えます。黒と白の各ゾーンの内側に、より多くの円形のブロブや「粒」が見えます。 たとえば… |
magick random_5_gray.png -ordered-dither threshold,3 random_5_blobs.png
![[IM Output]](../static/img/canvas/random_5_blobs.png)
まず指摘したいのは、画像内でおおよそ等量の明るい領域と暗い領域が得られるものの、それらの領域が、明るい領域と暗い領域の間に形成されるグラデーションの灰色の「中間」色によって相互につながっているということです。 さて、個々のブロブや「粒」は画像全体で領域ごとに変化しますが、それらはすべて、おおよそ初期ランダム画像をぼかすのに使った値の 3〜4 倍 の直径で平均します。このぼかし値は画像の「粒度」として知られ、非常に重要な値です。基本的に、ランダム画像が生成する円形構造の平均サイズを表すからです。 ときには画像の「曲がり具合(curviness)」と呼ばれることもあります。値が大きいほど、画像内のこれらの曲線は大きく、緩やかになります。これは、ぼかしたランダム画像を記述する最も重要な要素なので、非常に明確にしておきましょう…
ランダム画像の「粒度」(またはぼかし係数)は
内部の円形構造のサイズを決定する
もちろん、「ぼかし係数」または「粒度」が小さいほど、曲線は小さくきつくなり、値 '0' に達すると、画像内のすべての塊や「ブロブ」が消え、純粋にランダムな「ノイズ」「雪」「ピクセルダスト」のような効果が残ります。
余談: 実際、「粒」そのもののサイズは、それらを生成するために使ったしきい値係数によって変化することがあります。この係数が本当に記述しているのは、白い領域と黒い領域の中心間の平均距離です。値が大きいほど距離が大きくなり、その増した距離に対応するため、斑点は大きくより広がる必要があります。これは、下記の Random Ripples を見始めるとより明らかになります。
画像から、よく分離した黒と白の粒の両方を抽出するために、50% の Solarize 操作にいくらか追加の Level Adjustments を加えて試すのもよいでしょう。 たとえば、これは粒度 '8'、ブロブのしきい値 '25%' で、画像の黒い部分と白い部分の両方から白い斑点を生成する完全な例です。 |
magick -size 100x100 xc: -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \
-solarize 50% -separate +channel \
-threshold 25% -negate random_granules.png
![[IM Output]](../static/img/canvas/random_granules.png)
値が大きくなるにつれ、ぼかしたランダム画像を生成する時間も非常に非常に長くなる点に注意してください。また、値が最小の画像寸法の約半分に達すると、ランダム画像が単一の白と黒の斑点に落ち着くため、効果の増大は止まります。大きな値はおすすめしません。
締めくくりとして、左に示すのは、単一のランダム画像の「粒度」(ランダムなぼかし)を変化させた結果生じる Patrol Cycle Animation(巡回サイクルアニメーション)です。アニメーションはシェルスクリプト "[animate_granularity](../static/img/canvas/animate_granularity)" を使って生成しました。これはダウンロードして、学び、いじってみることができます。 同じランダム画像をソースとして使っているため、「粒」や斑点は実際にはあまり動かず、粒度の増加につれてより大きな「粒」を生成するよう、ただ寄り集まったり消えていったりするように見える点に注意してください。 また、アニメーションでは色の数を減らしてありますが、完全なランダム画像の構造は実際には、2 つの白と黒の粒のセットの間の滑らかなグラデーションであることを覚えておいてください。このグラデーションが、画像を他の手法で有用にするものです。
ランダムフラックス(アニメーションサイクル)
さて、上で見たように、粒や斑点は実際にはそれほど動きません。しかし、アニメーション効果のためには、時間とともに滑らかに動くパターンが欲しいものです。また、そのパターンが単に前後に動くだけでは困ります。そして最後に、アニメーションがループするときにそのパターンの動きが突然飛んだり跳ねたりしないでほしいものです。 そこで必要なのは、滑らかに繰り返すランダムなパターンを生成する何らかの方法です。難しい注文です。また、滑らかである必要があるため、すべてのパターンを同じ単一のランダム画像から生成する必要があります。 そのようなランダムパターンを生成できるアイデアをここに示します。各ランダムなピクセル値をランダムな強度と考える代わりに、その値を、そのピクセルが最大または最小の強度になる「時間」値を定義するものと考えます。すなわち、その値を「波」上の位置へ変換するのです。こうして各ピクセルは、正弦曲線の何らかの「位相」を表します。 これは複雑に聞こえますが、実際にはそうではありません。Random Image を Sinusoid Function のソース画像として使うだけです。そして、時間系列の各画像に対して、その時間サイクル内の特定の点に対する時間「位相」を設定します。
magick random.png -function Sinusoid 1,_{time}_ \
... 粒度のぼかしやその他の処理を行う ...
ここで '_{time}_' は、完全なアニメーションサイクルにわたって '0' から '360' まで変化します。その結果、各ピクセルが「静的な」ランダム値を持つ代わりに、時間の経過とともに黒と白の間をループで循環するピクセルを得ます。各ピクセルはこの同じサイクルに従いますが、各ピクセルは完全に異なる「位相」を持つため、他のすべてのピクセルとは独立して循環します。すなわち、画像はまだランダムですが、与えられた「時間」値とともに滑らかに変化します。 科学的な心を持つ人のために言うと、これは亜原子レベルに存在する「量子ゆらぎ」を見るのに少し似ています。そこでは、空間は通常のスケールで見られる「静的な」状態とはかけ離れています。そこから「ランダムフラックス」という名前が来ています。 たとえば、12 枚の画像の時間系列を生成してみましょう…
for i in `seq 0 30 359`; do
magick random.png -channel G -function Sinusoid 1,${i} \
-virtual-pixel tile -blur 0x8 -auto-level \
-separate flux_${i}.png
done
そして、あなたの 1 枚のランダム画像が、サイクルを形成する一連の画像全体を生成できるようになりました。 「時間」の抽出は、おそらく生成プロセス全体で最も遅い部分であるぼかしなどの他の処理の前に行う必要がある点に注意してください。 もう一つ気づくべきことは、位相 '180'(右下)で、実際には最初の画像(左上)の正確な負(ネガ)が得られることです。すなわち、'白' の粒が '黒' の粒になり、その逆も同様です。実際、アニメーションの後半全体が前半の負です。これは、単純な「ランダムフラックス」アニメーションの生成時間を削減するのに使えます。 画像が 180 度の位相で負になるため、各「白」の粒が、隣接する「黒」の粒とゆっくり場所を入れ替わるように動くことが分かります。しかし、後半全体が前半の負なので、単に前後に往復することはできず、元の画像に戻るために前進し続けるか、ループで円を描くか、あるいは単に適切にフェードして現れる必要があります。言い換えれば、白と黒の粒ははるかに複雑なサイクルで動きます。
右に示すのは、上記のフレームのアニメーションです… ゆらぐパターンは完全にランダムですが、フレームからフレームへ、そしてアニメーションがループするときに滑らかに変化します。結果に始まりも終わりも見えません。 ときには動きの渦巻きが見え、ときには「ガス」のようなブロブがすべて暗いゾーンに吸い込まれているように見えたり、現れては再びフェードしたりするように見えます。また、非常に速い動きの期間も、非常に遅い動きの期間もあります。完全にランダムです。 要約すると: Blurred Random Images に存在するのと同じ特性が、このアニメーションにも存在します。画像は白と黒のセグメントへのおおよそ等しい分割のままであり、画像のぼかしまたは Granularity の約 3 倍 のサイズのブロブを形成します。しかしこれに加えて、サイクルの半分が他の半分の負であるため、画像のすべての部分が明るい色と暗い色の両方の間で何らかのサイクルを形成することが保証されます。 気づかなかったかもしれない一つの点は、ランダムな線形値を正弦波形へ変換することにより、より鋭い白と黒の色の分離(コントラスト)が得られることです。そのため、Sigmoidal Contrast 演算子のコントラストを下げる側面を使って、結果の画像をあまり「ブロブ」的でなくし、粒そのものよりも粒の間のグラデーションを強調するのもよいでしょう。 さて、これは循環的なランダムアニメーションでできることの出発点にすぎません。Random Image でできること、たとえば Generating Backgrounds で説明されているようなことはすべて、「ランダムフラックスアニメーション」にも適用できます。 たとえば、'白' の粒だけの動きを示してみましょう… |
magick flux_anim.gif -threshold 70% flux_thres_anim.gif
![[IM Output]](../static/img/canvas/flux_thres_anim.gif)
あるいは、画像の上をゆっくり流れる、変化する電気フィラメントを生成します。 |
magick flux_anim.gif \
-sigmoidal-contrast 30x50% -solarize 50% -auto-level \
-set delay 20 filaments_anim.gif
![[IM Output]](../static/img/canvas/filaments_anim.gif)
サイクルの半分が前半の負であるという事実と、白と黒の色を半分に折りたたむために Solarize を使うことにより、サイクルは実際には 1 つのアニメーションサイクルにわたって 2 回繰り返されている点に注意してください。起きている非常に速い変化の一部を取り除くには、本当はもっと多くのフレームが必要です。
より長い循環系列のために動きをより予測しにくくするには、Gradient Math を使って、複数のランダム画像、あるいは同じランダム画像の他の色チャンネルからの複数の正弦波サイクルを組み合わせることもできます。
FUTURE: さらに予測しにくい、長時間の「調和」サイクルを作成する。
ランダムなさざ波
Blurred Random Image にもう一つの変化を加えることで、これらの画像をはるかに有用にし、Granularity を超えるもう一つの制御変数を与える複雑さのレベルを追加できます。 しかしまず、ランダム画像が明るい領域と暗い領域だけで構成されているのではなく、それらの領域の間の傾斜も含んでいることを覚えておく必要があります。その傾斜を Sinusoid Function への入力として使うことで、画像内の斑点の間にさざ波を生成できます。 ここでの Sinusoid Function の使い方が、前の Random Flux の例と異なる重要な点は、今回は関数がぼかしで滑らかにされた 後 の画像に適用されることであり、その前ではない点に注意してください。また、この場合は 2 番目の '位相' 値ではなく、'周波数' 値の方が重要です。たとえば…
magick random_10_gray.png -function Sinusoid 1,90 ripples_1.png
magick random_10_gray.png -function Sinusoid 2,90 ripples_2.png
magick random_10_gray.png -function Sinusoid 3,90 ripples_3.png
magick random_10_gray.png -function Sinusoid 4,90 ripples_4.png
ご覧のとおり、Sinusoid Function の '周波数' が大きいほど、「粒」の間のグラデーションに追加されるさざ波が多くなります。 '周波数' '1' は、基本的にソース画像の明るい「ブロブ」と暗い「ブロブ」の両方を白へ変換し、その間に暗い隙間を残します。 '周波数' '2' は、その暗い隙間に余分な「尾根」または「さざ波」を 1 つ押し込みます。 周波数が増すにつれ、元の画像の最も明るい領域と最も暗い領域の間にますます多くの「さざ波」が得られ、それがますます複雑になります。 尾根の数が増えるにつれ、画像内の元の「ブロブ」や「粒」を見失うことがあります。これは、さざ波を追加する前にグラデーションを変更することで修正できます。Level Adjustment を使ってグラデーションを「クリップ」するか、Sigmoidal Contrast を使って中間調を圧縮するかです。これにより「粒」に質量や面積が与えられ、さざ波の間に「穏やかな」領域が提供されます。
magick random_10_gray.png -level 25% random_enhanced.png
magick random_enhanced.png -function Sinusoid 4,90 ripples_4e.png
magick random_10_gray.png -sigmoidal-contrast 10,50% random_sigmoidal.png
magick random_sigmoidal.png -function Sinusoid 4,90 ripples_4s.png
どちらの方法にも長所と短所がありますが、本質的には粒を拡大します。ただし、白と黒の粒のセットの間の距離は拡大しません。この副作用として、当然 2 つの粒のセットの間のさざ波が圧縮されます。
上記の例で使った 2 番目の値 '90' は、Sinusoid Function の '位相' です。これは、ソース画像の '黒' の粒が「さざ波」画像で何色になるかを決定します。
magick random_enhanced.png -function Sinusoid 3,0 ripples_3e000.png
magick random_enhanced.png -function Sinusoid 3,90 ripples_3e090.png
magick random_enhanced.png -function Sinusoid 3,180 ripples_3e180.png
magick random_enhanced.png -function Sinusoid 3,270 ripples_3e270.png
'白' の粒の色は、'位相' と、適用された '周波数' の端数の両方に依存します。整数の '周波数' 値は、('位相' に従って)白と黒の両方の粒の色を一緒に変化させます。そのため位相 '90' では両方とも白になります。 しかし、たとえば '0.5' のような端数の '周波数' 値を適用すると、('位相' によって決まる)'白ソース' の粒は '黒ソース' の粒の負になります。 |
magick random_enhanced.png -function Sinusoid 3.5,90 ripples_3.5e.png
![[IM Output]](../static/img/canvas/ripples_3.5e.png)
'グレー' の '位相' 角度では、粒の一方が白い輪で囲まれ、他方が黒い輪で囲まれる点に注意してください。'0.5' の端数を持つ '周波数' 値が使われると、各斑点の周りの最初のさざ波は、使われた '位相' に応じてすべて白かすべて黒になります。 | _整数または '0.5' 以外の '周波数' は、2 つの粒のセットが何らかの形で同期しなくなるため、おすすめしません。
同様に、90 度の倍数以外の位相は、(下記の)「さざ波アニメーション」を生成する場合を除き、おすすめしません。
(下記の)「分散マップ」を生成するときは、位相値 '0' がおすすめです。これは、強調された「粒」の領域内の歪みを最小限にするためです。
---|---
前の Random Flux と同様に、'_位相' を時間とともに変化させて、一方の粒のセットから他方へ移動するさざ波のアニメーションを生成できます。これはコントラスト強調なしで特にうまく機能します。 |
for i in `seq 0 30 359`; do
magick random_10_gray.png -function Sinusoid 3.5,${i} miff:-
done |
magick miff:- -set delay 15 -loop 0 ripples_anim.gif
![[IM Output]](../static/img/canvas/ripples_anim.gif)
余談: 上記で使われている手法は「パイプライン化された MIFF:」として知られ、MIFF:" ファイル形式が画像を単純に「連結」して複数画像ファイルを生成できるために可能です。 一つの点として、このアニメーションは、上で作成した Flux Animation よりもずっとずっとゆっくり変化するように見えます。これは、1 つのアニメーションサイクルにわたってさざ波が短い距離しか進まないのに対し、「フラックス」アニメーションでは、変化がサイクルのちょうど半分で大きなスケールの白から黒の粒へ進み、再び戻るからです。 さて、上記のさざ波アニメーションを、同じランダム画像ソースから生成した根底にある「フラックス」アニメーションと組み合わせて、はるかにダイナミックで流れるような形を生成できますが、そのアニメーション速度の違いに注意してください。 たとえば、ここでは上で作成した前の Flux Animation を取り、それにさざ波を追加します。この場合、さざ波はフラックスアニメーションのグラデーションが動くことによってのみ動きます。 |
magick flux_anim.gif -function Sinusoid 3.5,0 flux_rippled_anim.gif
![[IM Output]](../static/img/canvas/flux_rippled_anim.gif)
アニメーション内でさざ波そのものをアニメーションさせることもできます。ただし、さざ波自体には、はるかに大きな「位相サイクルレート」('j = 5 * i' の式)を使う必要があるかもしれません。また、サイクル内のサイクルを生成しているため、はるかに長いアニメーション(この場合 60 フレーム)を生成する必要があります。ただし、それには大きな「フラックス」の動きも遅くするという利点があります。 |
for i in `seq 0 10 359`; do
j=`expr $i \* 5`
magick random.png -channel G \
-function Sinusoid 1,${i} \
-virtual-pixel tile -blur 0x8 -auto-level \
-function Sinusoid 2.5,${j} \
-separate +channel miff:-
done |
magick miff:- -set delay 15 -loop 0 ripples_flux_anim.gif
![[IM Output]](../static/img/canvas/ripples_flux_anim.gif)
2 番目の画像で、さざ波が最初にある点から出てきて、その後同じ点へ戻り始める様子に注目してください。ただし、それらは決して単純に方向を逆にするわけではありません。よりよいマルチサイクルのフラックスサイクル生成器は、根底にあるフラックスアニメーションの「負」効果を取り除くことで、このわずかな奇妙さを取り除くでしょう。
FUTURE: 分散マップ歪曲のためのさざ波付きランダム画像の使用。
タイル状のキャンバス
タイル画像は非常に大きいことも非常に小さいこともあり、横方向と縦方向に隣り合わせて並べることで、大きな空間を覆うよう設計されています。World Wide Web のおかげで、利用できるタイル画像が爆発的に増えました(欲しいものを見つけるのはまた別の問題です)。 以下は、これらの例ページ全体で使うために Anthony's Icon Library からコピーした一連のタイル画像です。 ![[IM Output]](../static/img/images/bg.gif)
bg.gif | ![[IM Output]](../static/img/images/tile_aqua.jpg)
tile_aqua.jpg | ![[IM Output]](../static/img/images/tile_water.jpg)
tile_water.jpg | ![[IM Output]](../static/img/images/rings.jpg)
rings.jpg | ![[IM Output]](../static/img/images/tile_disks.jpg)
tile_disks.jpg | ![[IM Output]](../static/img/images/tile_weave.gif)
tile_weave.gif
---|---|---|---|---|---
現在、画像を大きな領域にタイル状に敷き詰める方法はかなり多数あります。任意の画像を "[-tile](https://imagemagick.org/command-line-options/#tile)" して、("Copy" 合成演算子を使って)元の背景画像を完全に置き換えることができます。(詳細は Tile Compositing を参照してください。) |
magick composite -tile tile_weave.gif -size 60x60 xc:none tile_copy.gif
![[IM Output]](../static/img/canvas/tile_copy.gif)
もう一つの方法は、"tile:" コーダーを使ってタイル画像を読み込み、特定のサイズにタイル状に敷き詰めることです。 |
magick -size 60x60 tile:bg.gif tile_size.gif
![[IM Output]](../static/img/canvas/tile_size.gif)
| _"tile:" コーダーは、画像内の透明部分を現在の背景色に置き換える点に注意してください。これは、内部的に要求したサイズのキャンバスを生成し、タイル画像をそのキャンバスに「重ねる」ためです。
透明度を保持したい場合は、"-background none" を設定するか "-compose SRC" を設定してください(詳細は Src Compose Method を参照)。_
---|---
これを使って、必要よりはるかに大きいタイル画像を生成し、その後 "[-composite](https://imagemagick.org/command-line-options/#composite)" を使って元の画像の上に重ねることができます。タイル画像が部分的に透明な場合は、'[Over](compose.html#over)' の "[-compose](https://imagemagick.org/command-line-options/#compose)" 法を指定する必要があります。 これは、特に大きな画像では非常に遅いタイル化の方法であり、重ね合わせのためにどれだけ大きな画像を作成する必要があるかを判断するという問題もあります。 |
magick test.png -size 200x200 tile:tile_disks.jpg \
-composite tile_over.gif
![[IM Output]](../static/img/canvas/tile_over.gif)
タイルを "[-draw](https://imagemagick.org/command-line-options/#draw)" 演算子の「タイル塗りつぶしパターン」として指定することで、タイル画像を別の画像の上に描き、好きな形や図形を作れます。これは、"[-tile](https://imagemagick.org/command-line-options/#tile)" 設定が、draw が使う "[-fill](https://imagemagick.org/command-line-options/#fill)" 色設定のいずれをも上書きするためです。MVG Drawing Settings を参照してください。 |
magick -size 60x60 xc: -tile tile_aqua.jpg \
-draw "circle 30,30 2,30" tile_draw.gif
![[IM Output]](../static/img/canvas/tile_draw.gif)
これは "[-draw](https://imagemagick.org/command-line-options/#draw)" と、その機能を実行するために "[-draw](https://imagemagick.org/command-line-options/#draw)" も利用する "[-annotate](https://imagemagick.org/command-line-options/#annotate)" のような演算子に対してのみ機能します。"[label:](text.html#label)"、"[caption:](text.html#caption)"、"[text:](text.html#text)" のように "[-fill](https://imagemagick.org/command-line-options/#fill)" 色を直接使う画像演算子に対しては機能しません。 ただし、"[-draw](https://imagemagick.org/command-line-options/#draw)" には、画像内のすべてのピクセルを fill 色やタイルパターン(設定されている場合)に完全にリセットするなどの、特別な color primitives(色プリミティブ)が組み込まれています。 |
magick test.png -tile tile_water.jpg -draw "color 0,0 reset" \
tile_reset.gif
![[IM Output]](../static/img/canvas/tile_reset.gif)
これは実際には、Specific Color を使う一部の Solid Color Canvases 法とまったく同じ方法です。ここでは "[-fill](https://imagemagick.org/command-line-options/#fill)" 色の代わりに "[-tile](https://imagemagick.org/command-line-options/#tile)" を使っただけです。
より高度な方法は、(Defined Global Artifact と Percent Escapes を使って)元の画像のサイズに設定された特別な Distort Viewport 設定とともに Distort Operator を使うことです。これは基本的に、小さなタイルの周りを取り囲む小さなタイルの Virtual Pixels(仮想ピクセル)をマッピングして、より大きなタイル状のキャンバスを生成します。 |
magick rose: -set option:distort:viewport '%g' +delete \
tree.gif -virtual-pixel tile -filter point -distort SRT 0 \
tile_distort_sized.gif
![[IM Output]](../static/img/canvas/tile_distort_sized.gif)
すでにメモリ内にある画像をタイル化するためにこの同じ手法を見る、(下記の)Tiling via Distort を参照してください。
オフセットタイルキャンバス
ときには、背景テクスチャの正確な配置をもう少し制御する必要があります。タイルパターンを他の画像に揃えるためか、最終画像の他の部分との悪い相関を避けるためです。多くの標準的なタイル化法では、これは "[-tile-offset](https://imagemagick.org/command-line-options/#tile-offset)" 設定を使って達成できます。たとえば、ここでは "tile:" や "pattern:" を使ってタイル状のキャンバス画像を直接作成するために使われるタイル画像を「ロール(回転)」しています。
magick -size 80x80 -tile-offset +30+30 tile:rose: offset_tile.gif
magick -size 80x80 -tile-offset +20+20 \
pattern:checkerboard offset_pattern.gif
| Tile Offset 設定は、IM のバージョン 6.3.9-9 より前では壊れていました。'X' オフセットが 'X' と 'Y' の両方のオフセット値に使われていた(与えられた 'Y' 値は無視された)のです。これは、上記の例は機能した(X と Y のオフセットが同じ)ものの、2 つの値が異なる場合には期待した結果が得られないかもしれないことを意味します。
---|---
これは "magick montage" の背景 "[-texture](https://imagemagick.org/command-line-options/#texture)" 設定でも機能します。 |
montage tree.gif -geometry +24+24 \
-tile-offset +30+30 -texture rose: offset_texture.gif
![[IM Output]](../static/img/canvas/offset_texture.gif)
"[-tile](https://imagemagick.org/command-line-options/#tile)" や "[-fill](https://imagemagick.org/command-line-options/#fill)" 設定の前にこの設定を定義しても使えます。たとえば… |
magick -tile-offset +30+30 -tile rose: \
-size 80x80 xc: -draw 'color 30,20 reset' offset_tile_fill.gif
![[IM Output]](../static/img/canvas/offset_tile_fill.gif)
"[-tile](https://imagemagick.org/command-line-options/#tile)" 画像を定義する前、ただし他の画像を読み込んだ後に、"[-size](https://imagemagick.org/command-line-options/#size)" 設定がリセットされていることを確認してください。 |
magick -size 80x80 xc: \
-tile-offset +20+20 +size -tile pattern:checkerboard \
-draw 'color 30,20 reset' offset_pattern_good.gif
![[IM Output]](../static/img/canvas/offset_pattern_good.gif)
いずれにせよ、タイルオフセットとタイル画像は、最初に使う直前に定義するのがおそらく最善です。これは上記の解決策と同じ結果になります。
すでにメモリ内にある画像でタイル化する
メモリ内にある(作成または変更した)画像をタイル化するのは簡単ではなく、いくつかの間接的な方法しか利用できません。
タイル画像をクローンして連結する
タイル化した画像の正確なサイズを気にしないなら、画像を複数回連結するだけで済みます。たとえば、ここでは画像を 3x3 の配列でタイル化します。 |
magick tree.gif \
\( +clone +clone \) +append \
\( +clone +clone \) -append \
tile_clone.gif
![[IM Output]](../static/img/canvas/tile_clone.gif)
このタイル化の方法には、画像をフリップタイル(鏡映タイル)できるという利点があります。 |
magick tree.gif \
\( +clone -flop +clone \) +append \
\( +clone -flip +clone \) -append \
tile_clone_flip.gif
![[IM Output]](../static/img/canvas/tile_clone_flip.gif)
一般に、この方法はタイル化する画像の大きさがある程度分かっている場合にのみ実用的です。また、クローンは実際には非常に高速で効率的なので、これはかなり単純で高速なタイル化法です。特に、その結果を使ってより大きな画像をさらにタイル化する場合はそうです。
MPR:(Memory Program Register)を使ったタイル化
よりよい方法は、画像を特別な「メモリ内」ファイル形式 "[mpr:](files.html#mpr)"('memory program register' と呼ばれる)に保存することです。このレジスタから、"[-tile](https://imagemagick.org/command-line-options/#tile)" 設定を使うか、特別な "tile:" 画像ファイルリーダーを使えます。どちらも「保存された」画像ファイル形式からしか設定できません。 たとえば、"tile:" を使って特定のサイズのタイル画像を作成するには… |
magick tree.gif -write mpr:tile +delete \
-size 100x100 tile:mpr:tile tile_mpr.gif
![[IM Output]](../static/img/canvas/tile_mpr.gif)
| "tile:" コーダーは、画像内の透明部分を現在の背景色に置き換えることを覚えておいてください。(上記参照)
---|---
あるいは、"[-tile](https://imagemagick.org/command-line-options/#tile)" や "[-fill](https://imagemagick.org/command-line-options/#fill)" の塗りつぶしパターンを設定し、"[-draw](https://imagemagick.org/command-line-options/#draw)" を使って色リセットを行うことで、既存の画像の上にタイル化します(Color Fill Primitives を参照)… |
magick tree.gif -write mpr:tile +delete \
granite: -fill mpr:tile -draw 'color 0,0 reset' \
tile_mpr_reset.gif
![[IM Output]](../static/img/canvas/tile_mpr_reset.gif)
| 透明部分を含む画像でタイル化する場合は、"-alpha set" を使って、出力先の画像にも透明度があることを確認してください。そうしないと、結果の画像にタイルの「隠れた」透明色が表示されます。
---|---
あるいは、塗りつぶしパターンを使って、円のような他の Draw Primitive で描画します。 |
magick tree.gif -write mpr:tile +delete \
granite: -tile mpr:tile -draw 'circle 64,64 10,50' \
tile_mpr_fill.gif
![[IM Output]](../static/img/canvas/tile_mpr_fill.gif)
"[mpr:](files.html#mpr)" の後に与える名前は何でも構いません。これは画像を(メモリ内に)保存するために使われる 'mpr' レジスタ名のラベルにすぎません。ラベル、数値、色、さらにはファイル名でも構いません。
Distort 経由で仮想ピクセルを使ったタイル化
この方法では、Virtual Pixel Setting を使って大きなタイル状のキャンバスを生成します。この設定は、実際の画像を取り囲む領域(通常の画像の境界の外側)がどう見えるべきかを定義します。仮想ピクセルを抽出する最も簡単な方法は、特別な Distort Viewport 設定とともに Distort Operator を使うことです。 |
magick tree.gif -set option:distort:viewport 100x100+0+0 \
-virtual-pixel tile -filter point -distort SRT 0 \
tile_distort.gif
![[IM Output]](../static/img/canvas/tile_distort.gif)
'[Mirror](misc.html#mirror)' や、さらには '[CheckerTile](misc.html#checker_tile)' のような他のスタイルの仮想ピクセルタイル設定にもアクセスでき、ビューポート設定を使った良好なオフセットタイル制御も可能です。 |
magick tree.gif -set option:distort:viewport 100x100-10-10 \
-background firebrick -virtual-pixel CheckerTile \
-distort SRT 0 +repage tile_distort_checks.gif
![[IM Output]](../static/img/canvas/tile_distort_checks.gif)
このように General Distortion Operator を使うと、タイル化した画像を非常に複雑な方法で歪めるというおまけもあります。例は Distort Affine Tiling で見られます。 より複雑な例として、ここでは Arc Distortion を使って、ビューポートの中央にある原点の周りに tree をタイル化します。'45' は tree の幅が覆う角度を指定し、'50' は tree タイルの上端の半径を定義します。残りはこれから導かれます。 |
magick tree.gif -set option:distort:viewport 100x100-50-50 \
-virtual-pixel tile -distort Arc '45 0 50' +repage \
tile_distort_polar.gif
組み込み IM パターン/タイルの変更
ImageMagick Built In Images and Patterns の完全なリストを参照してください。そうしたパターンはたくさんありますが、ここでは 1 つか 2 つだけ見ます。 さて、組み込みパターンは一般に非常に非常に小さい画像で、タイル状に敷き詰めて大きな領域を覆えます。しかし、それ自体では非常に地味に見え、むしろ役に立ちません。たとえば、これは提供されているより大きく興味深いパターンの一つです… |
magick pattern:checkerboard pattern_default.gif
![[IM Output]](../static/img/canvas/pattern_default.gif)
パターン画像は通常、キャンバス作成の一部として "[-size](https://imagemagick.org/command-line-options/#size)" を設定するか、塗りつぶしタイルとして(上記の Tiled Canvases を参照)、より大きな領域にタイル状に敷き詰められます。サイズ設定なしでは、パターンのデフォルトのタイルサイズが使われます。この場合は 30x30 ピクセルです。 さて、現在 IM が提供しているパターンはすべて純粋な白黒で、唯一の例外が最後の例で使った 'checkerboard' パターンであることに、おそらく気づくでしょう。 これは、私がタイルパターンとして特に好んで使うパターンの一つです… |
magick -size 60x60 pattern:hexagons pattern_hexagons.gif
![[IM Output]](../static/img/canvas/pattern_hexagons.gif)
これらの色に満足できない場合は、"[-opaque](https://imagemagick.org/command-line-options/#opaque)" 画像演算子を使って置き換えられます。 |
magick -size 60x60 pattern:hexagons \
-fill blue -opaque black -fill skyblue -opaque white \
pattern_colored.gif
![[IM Output]](../static/img/canvas/pattern_colored.gif)
"checkerboard" パターンに色を付けたい場合は、まず "[-auto-level](https://imagemagick.org/command-line-options/#auto-level)" を使って 2 つのグレーを黒と白にマッピングしてから、それら 2 色を置換するのが最善です。ここでは "[-opaque](https://imagemagick.org/command-line-options/#opaque)" を使って色を置き換える代わりに、"[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" 演算子(IM v6.2.4-1 で追加)を使います。こちらの方が少し簡単に使えます。 |
magick -size 60x60 pattern:checkerboard -auto-level \
+level-colors red,blue pattern_color_checks.gif
![[IM Output]](../static/img/canvas/pattern_color_checks.gif)
"[-floodfill](https://imagemagick.org/command-line-options/#floodfill)" 演算子を使ってパターンに色を付けることもできます。ただし、これを正しく機能させるには、変更したパターンをタイル化する 前 に行う必要があります。この場合、私が望んだ規則的な色のパターンで色を付けるために、タイルを 3 倍に拡張する必要もありました。 |
magick -size 30x54 pattern:hexagons \
-fill tomato -opaque white \
-fill dodgerblue -draw 'color 10,10 floodfill' \
-fill limegreen -draw 'color 10,25 floodfill' \
-roll +15+27 \
-fill dodgerblue -draw 'color 10,10 floodfill' \
-fill limegreen -draw 'color 10,25 floodfill' miff:- |\
magick -size 100x100 tile:- pattern_color_hexagons.gif
![[IM Output]](../static/img/canvas/pattern_color_hexagons.gif)
上記では、色付きパターンの作成を、その実際の使用から分離するために、2 つのコマンドのパイプラインを使いました。これを 1 つのコマンドで行いたい場合は、上記の Tiling an Image In Memory を参照してください。 単純なタイルパターンをワープして歪め、興味深いバリエーションを生み出すこともできます。たとえば、六角形パターンに対する「しわ寄せ」効果(Font Image Generator の wrinkle IM 効果から拝借した手法)が、特に興味深いと感じました。 |
magick -size 160x100 pattern:hexagons \
-wave 3x100 -background white -rotate 90 -wave 4x66 -rotate -87 \
-gravity center -crop 120x90+0+0 +repage pattern_distorted.gif
タイル画像の変更
タイル(既存のタイルでも組み込みパターンの一つでも)を変更する際に人々が直面する最大の問題は、多くの画像操作が画像の「タイル化可能性」を破壊することです。たとえば、ここでは組み込みの 'hexagon' パターンを取り、それを変更して、幅の広い六角形の線のシェーディングされたグレースケールパターンを生成しようとしました。 |
magick pattern:hexagons -rotate 90 \
-blur 0x1 -edge 1 -negate -shade 120x45 \
miff:- |\
magick -size 100x100 tile:- tile_mod_failure.jpg
![[IM Output]](../static/img/canvas/tile_mod_failure.jpg)
最初のコマンドは「タイル画像」を生成し、2 番目は実際に画像をタイル化して、それらがどう組み合わさるかを見られるようにします。 ご覧のとおり、結果のタイル画像は正しくタイル化されず、タイル化された画像に人為的な端の歪みがはっきりと見えます。基本的に、画像の端に沿って、元のタイルの一様性を失ったのです。 一つの解決策は、特別な Virtual Pixels 設定を使うことです。これは、実際の画像の境界を超えた色をルックアップするとき、演算子に画像が端で回り込むと思わせるために使われます。 |
magick pattern:hexagons -rotate 90 -virtual-pixel tile \
-blur 0x1 -edge 1 -negate -shade 120x45 \
miff:- |\
magick -size 100x100 tile:- tile_mod_vpixels.jpg
![]()
これは、2 つの関連するタイルパターンを結合し、さまざまな効果を使って珍しいレンガ壁のタイルを作成する別の例です。 |
magick pattern:leftshingle pattern:rightshingle +append \
-virtual-pixel tile -blur 0x0.75 -resize 150% -shade 100x45 \
-fill Peru -tint 100% miff:- |\
magick -size 100x100 tile:- tile_slanted_bricks.jpg
代替方法
Virtual Pixels に頼る代わりの方法があります。基本的に、画像を操作する前に「仮想の端のピクセル」を自分で提供して、存在し得る端の効果を避けるのです。これは、まず画像をわずかに大きな領域にタイル化することで行います。画像を変更した後、タイルを再抽出して、導入された端の歪みを避けられます。 行われる画像操作の範囲に応じて、それほど大きくする必要はありません。15〜40 ピクセルあれば、最終結果のすべての端の効果を止められることが分かりました。 画像を再抽出するには、余分なピクセルを "[-shave](https://imagemagick.org/command-line-options/#shave)" で削り取るか、処理した画像の中央から元のタイルサイズを "[-crop](https://imagemagick.org/command-line-options/#crop)" で切り出せます。たとえば、ここでは組み込みの 'hexagons' パターンを使って 3D の "[-shade](https://imagemagick.org/command-line-options/#shade)" 効果を作成します。 |
magick -size 60x60 tile:pattern:hexagons -rotate 90 \
-blur 0x1 -edge 1 -negate -shade 120x45 \
-gravity center -crop 18x30+0+0 +repage miff:- |\
magick -size 100x100 tile:- tile_mod_success.jpg
![[IM Output]](../static/img/canvas/tile_mod_success.jpg)
抽出するタイルの正確な位置は重要でない点に注意してください。タイル化可能な画像は、歪んだ端から離れていて、元のタイルと同じサイズを使う限り、タイル化された画像のどこからでも切り出せます。 ここでは、画像をより大きな領域にタイル化する代わりに、「二重クローン」手法を使って、タイルが覆う面積を 2 倍にします。終わったら、画像の中央 50% を切り出して、変更したタイルを回収するだけです。これは、処理するタイルの正確なサイズを知る必要がないことを意味します。 |
magick pattern:circles \( +clone \) +append \( +clone \) -append \
-fill grey -opaque black -blur 0x0.5 -shade 120x45 \
-gravity center -crop 50% +repage miff:- |\
magick -size 100x100 tile:- tile_circles.jpg
![[IM Output]](../static/img/canvas/tile_circles.jpg)
タイル画像の生成。タイル状に組み合わせられる画像を生成する際に直面する最大の問題は、画像の端と隅をシームレスに組み合わせられるよう一致させることです。これが行われないと、得られるのは、画像のコピーが繰り返された四角い箱の集合だけになります。これは簡単なことではなく、非常にもどかしく髪をかきむしるような経験になり得ます。タイルの一方の端に現れるオブジェクトは、画像がタイル化されたときに全体を再形成するよう、画像の反対側に再び現れなければなりません。 コンピューター生成画像ではこれをかなり簡単に行えますが、実世界の写真を特徴とするよいタイル画像を作るのはほぼ不可能です。 もう一つの大きな問題は、タイルが繰り返しているように見えないようにしようとすることです。これに対する唯一の真の解決策は、タイル画像を、非常に似ているがそれでも異なる要素を十分に含むほど大きくして、繰り返しパターンが見えにくくすることです。このため、繰り返しているように見えない小さなタイルを生成するのは特に難しいです。
FUTURE: タイルパターンを生成するためのアイデアや提案? 誰か?
あるいは roll して、要素を追加して、roll して、要素を追加して、など…
あらゆる提案や例を歓迎します。
水・落ち葉・雲・スタッコ・レンガ細工などの繰り返しパターンの
実際の写真からタイルを生成するための提案…
エッシャー風のタイルパターンの生成。
ランダムノイズタイル
生のランダムノイズキャンバスは、そもそも端の特徴を持たない(すべてのピクセル色が隣接するどのピクセルからも完全に独立している)ため、端の歪みを心配せずにタイル化できます。基本的に、ピクセルレベルで極めてランダムなので、そもそも端が一致しておらず、タイル化しても何も失われません。 残念ながら、生のランダムノイズ画像をそのまま実用的な目的に使う状況はほとんどありません。ただただひどくランダムで、役に立たないのです。 しかし、画像に本来備わるタイル化可能性を保ちながら変更することで、望むほぼあらゆるランダム化されたタイルパターンを作れます。 たとえば、前の例で使った同じ「タイルの変更」手法を使って、元のタイルの基本的な "[-blur](https://imagemagick.org/command-line-options/#blur)" を見てみましょう。 |
magick -size 64x64 xc: +noise Random \
-virtual-pixel tile -blur 0x6 -auto-level tile_random.jpg
magick -size 128x128 tile:tile_random.jpg tiled_random.jpg
![[IM Output]](../static/img/canvas/tile_random.jpg)
![[IM Output]](../static/img/canvas/tiled_random.jpg)
この手法を使えば、生のランダムノイズ画像にほぼあらゆる変換を適用できます。たとえば… |
magick -size 64x64 xc: +noise Random \
-virtual-pixel tile -blur 0x6 -edge 1 -fx G \
-shade 280x45 -auto-level tile_random_pits.jpg
magick -size 128x128 tile:tile_random_pits.jpg tiled_random_pits.jpg
![[IM Output]](../static/img/canvas/tile_random_pits.jpg)
![[IM Output]](../static/img/canvas/tiled_random_pits.jpg)
ご覧のとおり、生のランダムノイズ画像を使ってランダム化されたタイルを作成する方がずっと簡単で、結果に端の歪みが一切生じません。この特定の画像変換は Background Images のページに掲載されており、「pits」と題されています。他の多くのランダム画像変換と、それらがどう見えるかの例については、そのページを参照してください。
六角形タイル
正方形の方法でタイル化する代わりに、「ランダムノイズ」画像を使うと、非常に異なる種類のタイルを生成できます。画像の寸法を 2 倍にして、余分な空間にタイルを半分ずらして敷き直すことで、基本的なランダムノイズの六角形タイルパターンを生成できます。 これは、ImageMagick の特別な "pattern:hexagons" 組み込みをタイル化したときに得られるのと同じ種類のタイル化効果です。 |
magick pattern:hexagons tile_hexagons.gif
magick -size 64x64 pattern:hexagons tiled_hexagons.gif
![[IM Output]](../static/img/canvas/tile_hexagons.gif)
![[IM Output]](../static/img/canvas/tiled_hexagons.gif)
ただし、このタイルが「六角形」に見えるためには、タイルは通常の正方形や、2 倍にした正方形でさえあってはなりません。最終的なタイルサイズは長方形である必要があります。 この長方形の正確な比は、実際には無理数を含みます。これはピクセル配列を使う画像作業にはあまり適していません。しかし、よい実用的な比は 4:3 で、ほとんどのコンピューターやデジタルカメラの画像で使われています。 ここでは、同じ「ランダムノイズ」画像(2:3 の比の長方形)をさらに 2 回重ねて、基本的な六角形パターン(4:3 の長方形)を生成します。六角形にタイル化されたランダムノイズタイルは、その後 Background Images のページの「paint_3s」変換を使って変換され、かなり素敵に見える六角形タイルパターンを生成します。 |
magick -size 48x64 xc: +noise Random -write mpr:rand \
-extent 96x64 -page +48-32 mpr:rand -page +48+32 mpr:rand \
-flatten tile_hex_random.jpg
magick tile_hex_random.jpg -virtual-pixel tile -blur 0x10 -paint 3 \
-shade 280x45 -auto-level tile_hex_layered.jpg
magick -size 160x160 tile:tile_hex_layered.jpg tiled_hex_layered.jpg
![[IM Output]](../static/img/canvas/tile_hex_layered.jpg)
![[IM Output]](../static/img/canvas/tiled_hex_layered.jpg)
タイルが生成するパターンを見ると、特定の特徴には、その同じ特徴のコピーが 6 つ、円状にそれを取り囲んでいることが分かります。これが、タイルが生成する「六角形」パターンです。他のすべてのタイル画像と同じ「正方形」パターンでタイル化されているにもかかわらずです。 上記の「ヘックスタイル」パターンの一つの変種は、上で行ったように水平方向ではなく、垂直方向にタイル画像を 2 倍にすることです。その結果、六角形パターンが 90 度回転します。ただし、それでも同じ種類のパターンです。 | _数学的には、上記は既存のタイルから新しい Wallpaper Group(壁紙群)を生成しているわけではありません。元の「非六角形」画像と最終版はどちらも、同じ 'p1' タイル群に属します。
上記で実際に行っているのは、菱形の「プロトタイル」タイルパターンを、同じタイルパターンのより大きな長方形の直交整列した「基本領域」に変換することです。こうすることで、標準的なタイル化法を使って画像をタイル化できます。
---|---
_Future: 余分な画像を裏返して、より大きなタイルパターン(pmg タイル群)を生成する。 Future: 隙間や重なりなく完璧にタイル化できるよう、画像から六角形を切り出す(マスクする)方法。
トリプルヘックスタイル
"hexagons" 組み込みパターンに色を付けたとき(上記の Modifying Built-in IM Patterns/Tiles を参照)と同じように、より大きなタイルを形成するために再マッピングする前に、初期タイルの 3 つの異なる変種を(たとえば回転を伴って)作れます。 もちろん、"hexagons" パターンに色を付けたときと同じように、繰り返す長方形のタイルパターンを生成するため、最終的なタイル画像は 3 倍大きく拡大する必要があります。 生成する 3 つのタイルのバリエーションは、あまり違いすぎてはならず、どんな後処理にも耐えるべきです。そうでないと、この手法の利点が得られません。これは、初期タイルもそれなりに大きくなければならないことを意味します。存在する明確な特徴が保持されるようにするためです。 たとえば、ここでは非常に単純な線画を取り、それを回転させて 3 つの似たバリエーションを作ります。これらの回転した画像は、その後より大きなキャンバスに 7 回(6 倍大きく)タイル化されて、トリプル画像の六角形パターンを生成します。 |
magick -size 24x24 xc: -draw "rectangle 3,11 20,12" tile_line.gif
magick tile_line.gif -gravity center \
\( +clone -rotate 0 -crop 24x18+0+0 -write mpr:r1 +delete \) \
\( +clone -rotate 120 -crop 24x18+0+0 -write mpr:r2 +delete \) \
-rotate -120 -crop 24x18+0+0 -write mpr:r3 +repage \
-extent 72x36 \( -page +0+0 mpr:r3 \) \
\( -page +24+0 mpr:r1 \) \( -page +48+0 mpr:r2 \) \
\( -page -12+18 mpr:r1 \) \( -page +12+18 mpr:r2 \) \
\( -page +36+18 mpr:r3 \) \( -page +60+18 mpr:r1 \) \
-flatten tile_hex_lines.jpg
magick -size 120x120 tile:tile_hex_lines.jpg tiled_hex_lines.jpg
![[IM Output]](../static/img/canvas/tile_line.gif)
![[IM Output]](../static/img/canvas/tile_hex_lines.jpg)
![[IM Output]](../static/img/canvas/tiled_hex_lines.jpg)
ただし、上記は元の画像の中央にある小さな形状をタイル化する場合にのみ機能します。一般的な画像に対してはうまく機能しません。 一般的な画像の六角形タイル化のためには、正三角形をマスクで切り出す必要もあります。その断片は、正三角形の端が鏡映されるよう回転されます。これは簡単な作業ではありません。
対角鏡映タイル
これは、任意の正方形画像を、中心点の周りに 8 枚の鏡映画像へ変換する一つの方法です。具体的には、複雑な 'p4m' タイルパターンを生成します。 まず Random Hue Image を生成し、ソース画像の左下半分を使って、対角方向に、その後水平・垂直方向に鏡映します。 |
magick -size 50x50 xc: +noise Random -virtual-pixel Tile -blur 0x5 \
-auto-level -separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_diag_source.jpg
magick tile_diag_source.jpg \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -flop -chop 1x0 \) +append \
\( +clone -flip -chop 0x1 \) -append \
tile_diag_mirror.jpg
![[IM Output]](../static/img/canvas/tile_diag_source.jpg)
![[IM Output]](../static/img/canvas/tile_diag_mirror.jpg)
対角鏡映は、Transpose を行い、その後 Voronoi, Sparse Color を使って生成したマスクを使うことで生成されます。 この対角鏡映は、正方形のピクセルジオメトリのために、鏡映を挟んで自動的に 1 ライン分のピクセルを同じように共有する点に注意してください。垂直・水平の Flips and Flops を作成する前に、端に沿った 1 セットのピクセルも取り除いています。 この画像を「タイル」として使う前に、上端と左端に沿ってもう 1 行と 1 列のピクセルを取り除くこともおすすめします。これは必須ではありませんが、その方が見栄えがよいと思います。1 行と 1 列の端のピクセルを取り除かないと、画像が結合する場所に、二重になったピクセルの醜い「継ぎ目」が生じます。 別の方法は、まず生のランダム画像をタイル化してから Background Pattern 変換を行うことです。これにより、鏡映線に沿った「切り取られた見た目」が生じにくくなり、より滑らかな遷移になります。 |
magick -size 51x51 xc: +noise Random \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -flop -chop 1x0 \) +append \
\( +clone -flip -chop 0x1 \) -append \
-chop 1x1 \
\
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_p4m.jpg
![[IM Output]](../static/img/canvas/tile_p4m.jpg)
最初の部分は「ランダムデータのタイル化」の生成で、後半でランダムデータを「色相」マッピングへ変換します。また、初期画像に余分なピクセルを追加し、それを後で適切に切り落としてタイル化画像を生成します。
タイル画像とその背後にある数学のより完全な入門については、Wikipedia: Wallpaper Group を参照してください。上で探求したのは、作成できる多くのタイルパターンのほんの一部にすぎません。
'p4g' は上記の 'p4m' タイル化とほぼまったく同じですが、フリップを使う代わりに、鏡映された正方形の 180 度回転を使って完全なタイル化画像を生成します。 ただし、画像が鏡映で結合されていないため、既存の画像をタイルソースとして使うことはできません。端が分断されて不連続になるからです。しかし、生のランダムデータをタイル化してから、結果のタイル画像を処理して、滑らかな結果を生成できます。 |
magick -size 50x50 xc: +noise Random \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -rotate -90 \) +append \
\( +clone -rotate 180 \) -append \
\
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_p4g.jpg
![[IM Output]](../static/img/canvas/tile_p4g.jpg)
タイル化が鏡映を伴わない性質のため、連結する前に端から重複した行や列のピクセルを取り除く必要がない点に注意してください。ただし、両方のケースで同じ種類のプロセスに従いたい場合は、取り除いても害はありません。
![[IM Output]](../static/img/canvas/canvas_rose_red.gif)
![[IM Output]](../static/img/images/test.png)
![[IM Output]](../static/img/canvas/color_pick_draw.png)
![[IM Output]](../static/img/canvas/color_pick_distort.png)
![[IM Output]](../static/img/canvas/black_threshold.png)
![[IM Output]](../static/img/canvas/black_level.png)
![[IM Output]](../static/img/canvas/black_fx.png)
![[IM Output]](../static/img/canvas/black_evaluate.png)
![[IM Output]](../static/img/canvas/black_gamma.png)
![[IM Output]](../static/img/canvas/black_alpha.png)
![[IM Output]](../static/img/canvas/white_threshold.png)
![[IM Output]](../static/img/canvas/white_level.png)
![[IM Output]](../static/img/canvas/white_fx.png)
![[IM Output]](../static/img/canvas/white_evaluate.png)
![[IM Output]](../static/img/canvas/white_alpha.png)
![[IM Output]](../static/img/canvas/trans_compose.png)
![[IM Output]](../static/img/canvas/color_matte.png)
![[IM Output]](../static/img/canvas/trans_fx.png)
![[IM Output]](../static/img/canvas/trans_evaluate.png)
![[IM Output]](../static/img/canvas/trans_threshold.png)
![[IM Output]](../static/img/canvas/grey_level.png)
![[IM Output]](../static/img/canvas/gradient_range1.jpg)
![[IM Output]](../static/img/canvas/gradient_range2.jpg)
![[IM Output]](../static/img/canvas/gradient_range3.jpg)
![[IM Output]](../static/img/canvas/gradient_range4.jpg)
![[IM Output]](../static/img/canvas/gradient_range5.jpg)
![[IM Output]](../static/img/canvas/rgradient_range1.jpg)
![[IM Output]](../static/img/canvas/rgradient_range2.jpg)
![[IM Output]](../static/img/canvas/rgradient_range3.jpg)
![[IM Output]](../static/img/canvas/rgradient_range4.jpg)
![[IM Output]](../static/img/canvas/rgradient_range5.jpg)
![[IM Output]](../static/img/canvas/gradient_trans_colorize.png)
![[IM Output]](../static/img/canvas/gradient_peak.jpg)
![[IM Output]](../static/img/canvas/gradient_swirl.jpg)
![[IM Output]](../static/img/canvas/gradient_arc.jpg)
![[IM Output]](../static/img/canvas/gradient_bird.jpg)
![[IM Output]](../static/img/canvas/gradient_venetian.jpg)
![[IM Output]](../static/img/canvas/gradient_colormap.jpg)
![[IM Output]](../static/img/canvas/gradient_rainbow.jpg)
![[IM Output]](../static/img/canvas/gradient_rainbow_2.jpg)
![[IM Output]](../static/img/canvas/gradient_rs_rainbow.jpg)
![[IM Output]](../static/img/canvas/gradient_interpolated.jpg)
![[IM Output]](../static/img/canvas/gradient_clut_recolored.jpg)
![[IM Output]](../static/img/canvas/gradient_clut.jpg)
![[IM Output]](../static/img/canvas/gradient_fx_x4.gif)
![[IM Output]](../static/img/canvas/gradient_inverse_alt.gif)
![[IM Output]](../static/img/canvas/gradient_shepards_alt.gif)
![[IM Output]](../static/img/canvas/gradient_inverse_RGB.png)
![[IM Output]](../static/img/canvas/gradient_inverse_RGB_Hue.gif)
![[IM Output]](../static/img/canvas/sparse_bary_triangle.png)
![[IM Output]](../static/img/canvas/sparse_bary_0.gif)
![[IM Output]](../static/img/canvas/sparse_bary_1.gif)
![[IM Output]](../static/img/canvas/sparse_bary_2.gif)
![[IM Output]](../static/img/canvas/sparse_bary_gradient_2.png)
![[IM Output]](../static/img/canvas/diagonal_gradient.jpg)
![[IM Output]](../static/img/canvas/diagonal_gradient_2.jpg)
![[IM Output]](../static/img/canvas/sparse_bary_two_point_wide.jpg)
![[IM Output]](../static/img/canvas/sparse_bilin_0.gif)
![[IM Output]](../static/img/canvas/sparse_bilin_1.gif)
![[IM Output]](../static/img/canvas/sparse_bilin_2.gif)
![[IM Output]](../static/img/canvas/sparse_inverse_near.png)
![[IM Output]](../static/img/canvas/sparse_inverse_far.png)
![[IM Output]](../static/img/images/figure.gif)
![[IM Output]](../static/img/canvas/shape_edge_in_lights.png)
![[IM Output]](../static/img/canvas/shape_in_lights.png)
![[IM Output]](../static/img/canvas/sparse_blur_simple.png)
![[IM Output]](../static/img/canvas/sparse_blur_layered.png)
![[IM Output]](../static/img/canvas/sparse_lines_near_source.gif)
![[IM Output]](../static/img/canvas/plasma1.jpg)
![[IM Output]](../static/img/canvas/plasma2.jpg)
![[IM Output]](../static/img/canvas/plasma3.jpg)
![[IM Output]](../static/img/canvas/plasma_range1.jpg)
![[IM Output]](../static/img/canvas/plasma_range2.jpg)
![[IM Output]](../static/img/canvas/plasma_range3.jpg)
![[IM Output]](../static/img/canvas/plasma_range4.jpg)
![[IM Output]](../static/img/canvas/plasma_range5.jpg)
![[IM Output]](../static/img/canvas/plasma_black.jpg)
![[IM Output]](../static/img/canvas/plasma_grey.jpg)
![[IM Output]](../static/img/canvas/plasma_white.jpg)
![[IM Output]](../static/img/canvas/plasma_yellow.jpg)
![[IM Output]](../static/img/canvas/plasma_tomato.jpg)
![[IM Output]](../static/img/canvas/plasma_steelblue.jpg)
![[IM Output]](../static/img/canvas/plasma_fractal1.jpg)
![[IM Output]](../static/img/canvas/plasma_fractal2.jpg)
![[IM Output]](../static/img/canvas/plasma_fractal3.jpg)
![[IM Output]](../static/img/canvas/plasma_swirl.jpg)
![[IM Output]](../static/img/canvas/plasma_grey0.jpg)
![[IM Output]](../static/img/canvas/plasma_grey1.jpg)
![[IM Output]](../static/img/canvas/plasma_grey2.jpg)
![[IM Output]](../static/img/canvas/plasma_grey3.jpg)
![[IM Output]](../static/img/canvas/plasma_grey4.jpg)
![[IM Output]](../static/img/canvas/plasma_grey5.jpg)
![[IM Output]](../static/img/canvas/plasma_grey6.jpg)
![[IM Output]](../static/img/canvas/plasma_grey7.jpg)
![[IM Output]](../static/img/canvas/plasma_grey8.jpg)
![[IM Output]](../static/img/canvas/plasma_grey9.jpg)
![[IM Output]](../static/img/canvas/plasma_rnd1.jpg)
![[IM Output]](../static/img/canvas/plasma_rnd2.jpg)
![[IM Output]](../static/img/canvas/plasma_rnd3.jpg)
![[IM Output]](../static/img/canvas/plasma_rnd4.jpg)
![[IM Output]](../static/img/canvas/plasma_rnd5.jpg)
![[IM Output]](../static/img/canvas/plasma_high_aspect.jpg)
![[IM Output]](../static/img/canvas/plasma_flaw.jpg)
![[IM Output]](../static/img/canvas/random_black.png)
![[IM Output]](../static/img/canvas/random_white.png)
![[IM Output]](../static/img/canvas/random_trans.png)
![[IM Output]](../static/img/canvas/random_1.png)
![[IM Output]](../static/img/canvas/random_3.png)
![[IM Output]](../static/img/canvas/random_5.png)
![[IM Output]](../static/img/canvas/random_10.png)
![[IM Output]](../static/img/canvas/random_20.png)
![[IM Output]](../static/img/canvas/random_0_gray.png)
![[IM Output]](../static/img/canvas/random_1_gray.png)
![[IM Output]](../static/img/canvas/random_3_gray.png)
![[IM Output]](../static/img/canvas/random_10_gray.png)
![[IM Output]](../static/img/canvas/random_20_gray.png)
![[IM Output]](../static/img/canvas/random_0_thres.png)
![[IM Output]](../static/img/canvas/random_1_thres.png)
![[IM Output]](../static/img/canvas/random_3_thres.png)
![[IM Output]](../static/img/canvas/random_5_thres.png)
![[IM Output]](../static/img/canvas/random_10_thres.png)
![[IM Output]](../static/img/canvas/random_20_thres.png)
![[IM Output]](../static/img/canvas/flux_0.png)
![[IM Output]](../static/img/canvas/flux_30.png)
![[IM Output]](../static/img/canvas/flux_60.png)
![[IM Output]](../static/img/canvas/flux_90.png)
![[IM Output]](../static/img/canvas/flux_120.png)
![[IM Output]](../static/img/canvas/flux_150.png)
![[IM Output]](../static/img/canvas/flux_330.png)
![[IM Output]](../static/img/canvas/flux_300.png)
![[IM Output]](../static/img/canvas/flux_270.png)
![[IM Output]](../static/img/canvas/flux_240.png)
![[IM Output]](../static/img/canvas/flux_210.png)
![[IM Output]](../static/img/canvas/flux_180.png)
![[IM Output]](../static/img/canvas/ripples_1.png)
![[IM Output]](../static/img/canvas/ripples_2.png)
![[IM Output]](../static/img/canvas/ripples_3.png)
![[IM Output]](../static/img/canvas/ripples_4.png)
![[IM Output]](../static/img/canvas/random_enhanced.png)
![[IM Output]](../static/img/canvas/ripples_4e.png)
![[IM Output]](../static/img/canvas/random_sigmoidal.png)
![[IM Output]](../static/img/canvas/ripples_4s.png)
![[IM Output]](../static/img/canvas/ripples_3e000.png)
![[IM Output]](../static/img/canvas/ripples_3e090.png)
![[IM Output]](../static/img/canvas/ripples_3e180.png)
![[IM Output]](../static/img/canvas/ripples_3e270.png)
![[IM Output]](../static/img/canvas/offset_tile.gif)
![[IM Output]](../static/img/canvas/offset_pattern.gif)
![[IM Output]](../static/img/canvas/tile_distort_polar.gif)
![[IM Output]](../static/img/canvas/pattern_distorted.gif)
![[IM Output]](../static/img/canvas/tile_slanted_bricks.jpg)