ImageMagick の例 --
複数画像のレイヤー
- 目次
-
ImageMagick の例の序文と目次
-
レイヤーの紹介
-
画像の連結 (-append)
- 画像の配列を連結する
- オーバーラップさせて連結する
- スムージング連結 (-smush)
-
複数画像ペアの合成
- composite コマンドの使用 (composite, -geometry)
- convert の合成演算子 (-composite, -geometry)
- 複数画像の描画 (-draw 'image ..')
-
複数画像のレイヤー化
-
レイヤー画像の例
-
評価シーケンス複数画像マージ
-
Poly - 多項式を使用した複数画像のマージ
レイヤー画像の紹介
前述したように、ImageMagickは1つの画像だけでなく、画像のシーケンスまたはリストを処理します。これにより、2つの非常に特殊な画像処理技術でIMを使用できます。たとえば、リスト内の各画像を時間における単一のフレームと考えることができ、リスト全体をアニメーションと見なすことができます。これは、他のIMの例のページで詳しく説明します。アニメーションの基本を参照してください。または、シーケンス内の各画像を、一連の透明なオーバーヘッド透明シートのレイヤーと考えることができます。つまり、各画像は最終画像の小さな部分を表現しています。たとえば、最初の(最下位)レイヤーは背景画像を表すことができます。その上に、ぼやけた透明な影を配置できます。次に、次のレイヤー画像には、その影を落とすオブジェクトが含まれています。この上に、そのオブジェクトの上に書かれたテキストを含むレイヤーがあります。つまり、それぞれがより複雑な画像に1つずつピースを追加する画像または「レイヤー」のシーケンスを持つことができます。各画像レイヤーは、他のレイヤーとは完全に独立して移動、編集、または変更でき、複数画像ファイル(TIFF:、MIFF:、XCF:など)または個別の画像として保存して、将来の処理に使用することもできます。それが画像レイヤー化のポイントです。すべての画像レイヤーが作成された後にのみ、フラット化、モザイク、またはマージして、すべてのレイヤー画像を1つの最終画像にします。画像の連結
連結は、おそらく複数画像を処理するために提供される複数画像操作の中で最も単純です。基本的には、メモリ内の現在の画像シーケンスを、隙間なく列または行に結合します。「-append
」オプションは垂直に連結し、プラス形式の「+append
」は水平に連結します。たとえば、ここでは、個々の「グリフ」または「フォント」の文字が結合されるのと同様に、一連の文字画像を横に連結して、派手な単語を形成します。
magick font_A.gif font_P.gif font_P.gif font_E.gif font_N.gif \ font_D.gif font_E.gif font_D.gif +append append_row.gif |
![[IM Output]](append_row.gif)
+append
」演算子が、連結するすべての画像が現在の画像シーケンスに追加された後に最後の操作として実行されたことにも注意してください。これは、たとえば、画像にラベルを付ける場合に最適です。
|
![]() |
-background
」カラーを使用して、塗りつぶされていないスペースを塗りつぶしたことに注意してください。もちろん、すべての画像の幅が同じであれば、この塗りつぶしのスペースは残りません。IM v6.4.7-1以降、「-gravity
」設定を使用して、画像をどのように追加するかを指定できます。そのため、垂直連結では、「Center
」を設定すると、最終的な結果の画像に対して画像が中央揃えされます(「North
」または「South
」の設定でも同様です)。
|
![]() |
East
」の重力設定では、画像が右側に揃えられます。
|
![]() |
+append
」を使用する場合も、同様の垂直方向の配置を実現できます。![]() ![]() |
IM v6.4.7より前は、連結された画像を配置することははるかに困難であり、一般に、右揃えには「-flop 」を使用していました。または、「-extent 」または「-border 」を使用して、中央揃えの連結に合わせて画像の幅を調整していました。たとえば、これはIMの古い6.3.2バージョンで動作します。
|
|
![]() |
|
![]() |
![]() ![]() |
上記の括弧は、UNIXシェルで使用する場合、引用符で囲むか、バックスラッシュ( '\ ')でエスケープする必要があります。そうでない場合、シェルによってまったく異なるものとして解釈されます。 |
![]() ![]() |
2つの画像だけが関係しているため、括弧を使用する代わりに、「+swap 」または「-reverse 」を使用することもできます。 |
画像の配列を連結する
これをさらに進めて、画像の配列全体を作成し、行または列で構築できます。モンタージュ連結モードも参照してください。![]() ![]() |
「-append 」演算子は実際の画像のみを連結し、仮想キャンバス(画像ページ)サイズまたは画像オフセットは使用しません。ただし、仮想キャンバス情報は、キャンバスサイズが加算され、オフセットが未定義の値に設定されるという、奇妙な状態のままになっているようです。これはバグと見なされる可能性があり、入力画像または結果の仮想キャンバスを「 +repage 」を使用してリセットしてから保存するか、この情報が重要になる操作で画像を使用する必要があることを意味します。この状況は、将来の操作の拡張で修正される可能性があります。したがって、特にタイルクロップされた画像を再連結する場合は注意が必要です。 |
オーバーラップさせて連結する
IMフォーラムで、ユーザーは画像をある程度のオーバーラップで連結する簡単な方法を尋ねました。多くのソリューションが提供されました。これは、オーバーラップの量が1か所で指定されている、最も簡単なソリューションの1つでした。
|
![]() |
スムージング連結
画像を連結する別の方法は、スムージングです。「-smush 」演算子は、連結演算子(上記参照)とほぼ同じように機能しますが、画像間のスペース(またはアンチスペース)の量を引数として取ります。たとえば、前の例をより簡単に示すために使用してみましょう。
|
![]() |
A
」と「V
」を生成し、それらの間にできるだけ少ないスペースで「スムージング」します。
|
![]() |
-smush
」が行うように設計されていますが、多くの計算が必要になるため、連結(上記参照)よりもはるかに遅くなります。引数は、その最終位置のオフセットであり、通常はギャップを生成するための正の値ですが、オーバーラップを作成するための負の値にすることもできます。
|
![]() |
複数画像ペアの合成
合成は、2つの個々の画像をマージするために使用される低レベルの操作です。ほとんどすべてのレイヤー化技術は、最終的に画像が1つだけ残るまで、画像を2つずつマージすることに帰着します。そのため、まず画像ペアの低レベルの合成を行う方法を見てみましょう。composite コマンドの使用
ImageMagickを使用して2つの画像を組み合わせる従来の方法は、「magick composite
」コマンドを使用することです。このコマンドは、一度に2つの画像のみを組み合わせることができ、各操作の結果をファイルに保存します。もちろん、これによって、一度に1つずつ複数の画像をレイヤー化することができなくなります。
|
![]() |
![]() ![]() |
すべての入力画像は出力画像が開かれる前にImageMagickによって読み込まれるため、入力画像の1つに出力できます。これにより、上記のように、問題なく同じ画像を何度も操作できます。 「JPEG」のような非可逆画像形式でこれを行わないでください。形式エラーが累積し、ベース画像が急速に劣化するためです。 |
-geometry
」設定を使用して、オーバーレイされた画像のサイズを変更したり、配置したりすることもできます。
|
![]() |
magick composite
コマンドには、他にもいくつかの利点があります。-compose
オプションを使用して画像を背景に描画する方法を制御でき、相対位置は-gravity
設定の影響を受けます。また、オーバーレイを-tile
して、タイルの制限を指定することなく、背景画像を覆うこともできます。これは、magick composite
を使用する場合にのみ可能です。この方法の大きな欠点は、複数のコマンドを使用しているため、IMは次のコマンドが再び読み込むために、作業中の画像をパイプラインまたはディスクに書き出す必要があることです。画像の上に画像を重ねるためにmagick composite
コマンドを使用する例については、「画像のオーバーレイによる注釈」と「重力を使用した画像の位置決め」を参照してください。Convertの合成演算子
-composite
演算子は、magick
コマンド内で使用できます。詳細については、IMでの画像合成を参照してください。これにより、上記と同じ操作を1つのコマンドですべて実行できます。
|
![]() |
skyblue
」であるキャンバス画像を作成し、次に後の各画像を指定された場所にそのキャンバスに重ねます。ここで、-geometry
は、次の-composite
操作のオーバーレイ位置を設定するだけでなく、現在の画像シーケンスの*最後の*画像(最後の画像のみ)を-resize
する非常に特別な演算子です。
|
![]() |
-geometry
のこの「サイズ変更」の副作用は避けることをお勧めします。基本的には、下位互換性の影響の方が大きく、状況によっては他の影響が生じる可能性があるためです。より冗長な推奨事項は次のとおりです。
|
![]() |
複数の画像の描画
また、magick
を使用して、描画プリミティブを使用して、作業中のキャンバスに画像を重ねることもできます。
|
![]() |
|
![]() |
-gravity
の影響を受けます。複数画像のレイヤー化
画像の真のレイヤー化には、画像の各ペアを個別に合成することなく、複数の画像を組み合わせる方法が必要です。ここで、さまざまな-layers
演算子メソッドが独自のものになります。レイヤー化された画像の順序は重要になる場合があるため、特別な画像シーケンスまたはリスト演算子を理解することをお勧めします。「レイヤー化された画像」は、「アニメーションフレーム」の処理と実質的に同じです。そのため、個々の「レイヤー」または「フレーム」の処理に関するテクニックについては、アニメーションの基本とアニメーションの変更の両方を確認することをお勧めします。実際、アニメーションでは、画像の処理に同じ-layers
演算子がよく使用されます。背景画像へのフラット化
-layers flatten
画像リスト演算子(またはそのショートカット-flatten
)は、基本的に指定された各画像を背景に「合成」して、1つの画像を形成します。ただし、画像の位置は、現在の仮想キャンバス、またはページオフセットを使用して指定されます。たとえば、ここでは、素敵なキャンバスを作成し、そのキャンバスにオーバーレイする画像をそれぞれ指定します。
|
![]() |
![]() ![]() |
IM v6.3.6-2以降、-flatten 演算子は、-layers 'flatten' メソッドのエイリアスにすぎません。したがって、 -flatten オプションは、同名の-layers メソッドのショートカットと見なすことができます。 |
-flatten
にキャンバスを作成させることができます。キャンバスの色は現在の-background
色になり、サイズは最初の画像の仮想キャンバスサイズによって定義されます。
|
![]() |
![]() ![]() |
-gravity 設定は、-geometry 設定を使用して定義された画像の配置に影響を与えますが、-page 設定によって設定された仮想キャンバスオフセットを使用した画像の位置決めには影響を与えません。これは、このようなオフセットの定義の一部です。詳細については、ジオメトリとページオフセットを参照してください。-gravity を使用した配置が必要な場合は、上記の複数画像合成方法、または両方の配置方法を同時に処理できる特別なレイヤー合成方法を確認してください。 |
|
![]() |
|
![]() |
![]() ![]() |
生成されたシャドウ画像には負の画像オフセットが含まれる可能性があるため、Flattenを使用してシャドウ画像を追加することはお勧めしません。 シャドウ画像のセクションで説明されているように、推奨されるソリューションは、後で説明する、より高度なレイヤーマージ手法を使用することです。 |
|
![]() |
奇妙なことに、まったく同じ処理を使用して、元の画像よりも小さい仮想キャンバスに画像を「クリップ」またはトリミングできます。ただし、この場合は、トリミング「ウィンドウ」を配置するのではなく、画像をオフセットしているため、負のオフセットを使用してトリミングの位置を指定します。
|
![]() |
-flatten
が行うキャンバスの生成とオーバーレイの追加処理を行わずに、これを行うことができます。また、画像が that 表示ウィンドウに部分的にしか含まれていない場合、画像自体を「拡張」してビューポート全体を覆うこともありません。-flatten
演算子の一般的な誤用は、画像から透過性を削除することです。つまり、画像に存在する可能性のある透過性をなくすために、背景色に重ねます。ただし、これは複数の画像が関係する場合には機能しないため、推奨されなくなりました。モザイク - キャンバスの拡大
-layers mosaic
演算子(またはその-mosaic
ショートカット)は、Flatten演算子の拡張キャンバスバージョンに似ています。最初の画像のキャンバスサイズに基づいて最初のキャンバスを作成するだけではないモザイク演算子は、すべての画像を(正の方向のみ)保持するのに十分な大きさのキャンバスを作成します。たとえば、ここでは適切な仮想キャンバスを設定していませんが、-mosaic
演算子は、すべての画像レイヤーを保持するためにそのようなキャンバスがどれだけの大きさである必要があるかを計算します。
|
![]() |
![]() ![]() |
IM v6.3.6-2では、-mosaic 演算子は、-layers 'mosaic' のエイリアスにすぎません。したがって、 -mosaic オプションは、同名の-layers メソッドのショートカットと見なすことができます。 |
-mosaic
と-flatten
の両方が、「原点」または0,0ピクセルから始まるキャンバスを作成することに注意してください。これは、画像の「仮想キャンバス」または「ページ」の定義の一部であり、このため、両方の演算子の最終画像に仮想オフセットがなく、キャンバス全体が実際のピクセルデータで完全に定義されていることを確認できます。また、-mosaic
は、上端と左端が仮想原点に固定されているため、正の方向(下端または右端)にのみキャンバスを拡張することに注意してください。もちろん、これは、-mosaic
が負のオフセットを持つ画像をクリップし続けることを意味します...
|
![]() |
マージ - 新しいレイヤー画像の作成
「-layers merge
」演算子は、以前の演算子とほぼ同じで、IM v6.3.6-2 で追加されました。これは、指定されたすべての画像をそれぞれのオフセットで保持するのに十分な大きさのキャンバス画像のみを作成します。Mosaicと同様にキャンバスを拡張しますが、正方向だけでなく負方向にも拡張します。基本的に、レイヤー画像をマージする際に、クリッピング、オフセット、その他の側面を気にする必要がないことを意味します。すべての画像は、互いの位置を基準にしてマージされます。出力には、原点が拡張キャンバスの一部であることの保証や包含はされません。そのため、Layers Merge の出力には、正または負の「レイヤーオフセット」が含まれる場合があります。言い換えれば、Layers Merge はレイヤー画像をマージして新しい *レイヤー画像* を生成します。そのため、最終的にそのオフセットが不要な場合は、最終保存の前に「+repage
」演算子を含める必要があるでしょう。たとえば、これまでに使用したのと同じレイヤー画像セットを次に示します...
|
![]() |
|
![]() |
+repage
」演算子によって、最終画像の絶対仮想キャンバスオフセットが削除され、画像間の相対的な配置のみが保持されます。Webブラウザは、GIFアニメーションの一部でない限り、画像のオフセット、特に負の画像オフセットの処理に問題があることが多いため、オフセットは削除されました。ただし、オフセットを削除しないと、すべての画像が生成された単一のレイヤー画像内の仮想キャンバス上の正しい位置に残り、マージされた画像にさらに画像を処理して追加できます。通常は、マージされた画像の未使用領域を透明にするために、「-background
」の色を「None
」にします。単一の画像に適用すると、Layer Merging は画像内の透明部分を単色の背景に置き換えますが、画像の元のサイズと、その画像内のオフセットは保持されます。ただし、画像の仮想キャンバスサイズは、その画像のサイズとオフセットに「最適にフィット」するように調整される場合があります。この演算子の本来の目的は、個々の画像のオフセットに関係なく、ユーザーが複数の歪んだ画像を統一された全体に簡単にマージできるようにすることでした。たとえば、写真を並べて大きな「パノラマ」を形成する場合です。中央の歪みのないベース画像(オフセットなし)から始め、この演算子を使用して、中央の画像に合わせて位置合わせと歪みが調整された他の画像を(負または正のオフセットを使用して)開始点の周りにオーバーレイすることができます。この演算子を使用して共通の制御点に画像を歪ませて位置合わせする他の例については、3D アイソメトリック フォト キューブ と 3D パースペクティブ ボックス を参照してください。この演算子を使用するその他の例としては、オーバーラップする写真 の単純なシリーズを生成することがあります。The operation "-layers trim-bounds
" can be used to ensure all
images get a positive offset on a minimal canvas size, while retaining there
relative positions, and without actually layer merging the images into one
final image.
This lets you then perform further processing of the images before they are
actually merged, such as placing more images relative to the that image group
but looking up the resulting virtual canvas bounds.
However if images have a transparency, it is probably a good idea to trim
that transparency from images first, making the ideal usage...
-alpha set -bordercolor none -border 1x1 -trim -layers trim-bounds
This minimizes the image layers including any and all transparent areas of
actual image data, while ensuring everything is contained on a valid
virtual (positive) canvas of minimal size.
合体合成 - プログレッシブなレイヤー化
「-layers coalesce
」画像演算子(またはその「-coalesce
」ショートカット)は、GIFアニメーションを画像シーケンスに変換するために設計されています。たとえば、詳細については アニメーションの合体 を参照してください。ただし、これは「-flatten
」と密接に関連しており、この点でマルチレイヤー画像に非常に役立つ効果があります。たとえば、単一の画像に Coalesce を使用すると、「-background 」の色が「None 」または「Transparency 」の Flatten を使用した場合とまったく同じ処理が行われます。つまり、画像のキャンバスを透明ピクセルで「塗りつぶし」ます。
|
![]() |
magick \( -page 100x100+5+10 balloon.gif \) \( -page +35+30 medical.gif \) \ \( --page +62+50 present.gif \) \( -page +10+55 shading.gif \) \ -set dispose None -coalesce miff:- |\ montage - -frame 4 -tile x1 -geometry +2+2 \ -background none -bordercolor none coalesce_none.gif |
![[IM Output]](coalesce_none.gif)
-dispose
」設定を「None
」に「-set
」しました。これは事実上、「-coalesce
」に、各フレームを前のオーバーレイの結果の上にオーバーレイするように指示しています。その結果、最初の画像は透明な背景を持つ画像キャンバスの単なる「塗りつぶし」になります。次の画像は、そのレイヤーがオーバーレイされた前の画像です。以下同様に続きます。画像シーケンスの「プログレッシブ」フラット化です。したがって、シーケンスの最後の画像は、透明な背景で通常の「-flatten
」を実行した場合と同じになります。「-dispose
」設定で「Background
」を使用した場合、まったく異なる効果が得られます。この場合、「-coalesce
」は、各画像が完全に別々の画像であるかのように、各画像のキャンバスを「塗りつぶし」ます!
magick \( -page 100x100+5+10 balloon.gif \) \( -page +35+30 medical.gif \) \ \( --page +62+50 present.gif \) \( -page +10+55 shading.gif \) \ -set dispose Background -coalesce miff:- |\ montage - -frame 4 -tile x1 -geometry +2+2 \ -background none -bordercolor none coalesce_bgnd.gif |
![[IM Output]](coalesce_bgnd.gif)
-coalesce
」演算子は現在の「-compose
」アルファ合成設定を *使用しない* ことに注意してください。GIFアニメーションの処理に必要なため、「Over
」合成メソッドのみを使用します。より標準的な画像レイヤリング演算子で異なる「-compose
」メソッドを使用することは、次の例題の主題です。合成方法とレイヤー化
3つの レイヤリング メソッド:Flatten、Mosaic、Merge は、「-compose
」設定を使用して、シーケンス内の各画像をオーバーレイするために使用される合成メソッドを決定します。そのため、これらの関数は、指定された色の初期「-background
」キャンバスを設定できるマルチ画像「-composite
」演算子と考えることができます。ただし、デフォルトの アルファ合成「Over
」以外を使用するには、適用する前に少し検討する必要があります。そうでないと、予期しない結果が生じる可能性があります。また、これらの演算子によって開始キャンバスを生成するために使用される「-background
」の色の影響についても、各画像(最初の画像を含む)が合成される前に検討する必要がある場合があります。たとえば、'DstOver
' を使用して、各連続画像を前の画像の *下* に配置してみましょう...
|
![]() |
|
![]() |
ご覧のとおり、上記の画像処理は、各画像を順番に(透明な開始キャンバスで)下敷きにするだけで、通常影の生成で見られるよりもシンプルできれいでした。
もちろん、代わりに画像リストを 反転 することもできました。
|
![]() |
Xor
」合成メソッドを使用してオーバーレイすると、最小限の労力で、珍しい複雑なシンボルが得られます。
|
![]() |
レイヤー合成 - 2つのレイヤーリストをマージする
IM v6.3.3-7 では、「-layers
」メソッド「Composite
」が追加され、2つの完全に separate な画像セットを合成できるようになりました。コマンドラインでこれを行うには、最初の*宛先*画像リストの終了位置とオーバーレイされた*ソース*画像リストの開始位置を定義するために、特別な「null:
」マーカー画像が必要です。しかし、それがこの方法の唯一の本当の複雑さです。基本的に、最初のリストの各画像は2番目のリストの対応する画像と合成され、効果的に2つのリストがマージされます。通常の 合成演算子(上記参照)と同様に、ジオメトリオフセット を使用して、2番目のリストを最初のリストに対してグローバルに配置できます。重力は最初の画像のキャンバスサイズを使用して計算にも適用されます。その「グローバルオフセット」に加えて、画像のペアが合成されるため、画像の個々の仮想オフセットも保持されます。特別なケースも1つ処理されます。一方の画像リストに画像が1つしかない場合、その画像は他方のリストのすべての画像に対して合成されます。また、その場合、合成の宛先側ではない場合でも、大きい方のリストの画像メタデータ(アニメーションタイミングなど)が保持されます。このレイヤリング演算子は、時間方向のレイヤー画像リストと見なすことができる2つのアニメーションを合成する場合により一般的に使用されます。このため、例の アニメーションの変更 セクションで詳しく説明しています。詳細については、マルチ画像アルファ合成 を参照してください。
画像レイヤーの処理
上記の様々なレイヤー演算子を使って複数の画像を配置することは、非常に汎用性の高いテクニックです。多数の画像を個別に処理し、完成後にそれらをすべて単一の統一された全体に結合することができます。これまでは、複数の画像を様々な方法でマージ(合成またはレイヤー化)する様々な方法を紹介してきました。ここでは、これらのテクニックを実際にどのように活用するかの、より実践的な例をいくつか示します。サムネイル画像のレイヤー化
このテクニックは、複数のサムネイルを様々な複雑な方法でマージするためにも使用できます。ここでは、画像にソフトエッジを追加し、画像を読み込んで配置することで、タイル状のキャンバス上に、かなり素敵な画像の構成を生成できます。
magick -page +5+5 holocaust_tn.gif \ -page +80+50 spiral_stairs_tn.gif \ -page +40+105 chinese_chess_tn.gif \ +page \ -alpha Set -virtual-pixel transparent \ -channel A -blur 0x10 -level 50,100% +channel \ \( -size 200x200 tile:tile_fabric.gif -alpha Set \) -insert 0 \ -background None -flatten overlap_canvas.jpg |
![[IM Output]](overlap_canvas.jpg)
画像の計算による配置
仮想キャンバスオフセット(ページ)は、様々な方法で設定できます。具体的には、画像ごとにこの属性を"-set
"で設定し、さらに画像ごとに異なる位置を計算することもできます。例えば、ここでは、大きな画像セット(すべて同じサイズの小さなアイコン画像)を読み込み、円状に配置しています。
magick {balloon,castle,eye,eyeguy,ghost,hand_point,medical}.gif \ {news,noseguy,paint_brush,pencil,present,recycle}.gif \ {shading,skull,snowman,storm,terminal,tree}.gif \ \ -set page '+%[fx:80*cos((t/n)*2*pi)]+%[fx:80*sin((t/n)*2*pi)]' \ \ -background none -layers merge +repage image_circle.png |
![[IM Output]](image_circle.png)
t/n
')を使用して、個々の画像ごとに 0.0 から 1.0 未満の値を作成する "-set page
" 演算です。この値は、パーセントエスケープとしての FX 式を使用して、半径 80 ピクセルの円内に画像を(角度で)配置するためにマッピングされます。計算される位置は画像の左上隅(中心ではありませんが、簡単な調整で変更可能)であり、その後マージされて新しい画像が生成されます。配置は、オフセットが正か負かに関係なく行われます。これは、マージレイヤー演算子の強力な点です。つまり、互いに相対的な位置にあるすべての画像から新しい画像を生成しました。最後の "+repage
" は、マージされたレイヤー画像の最終的な負のオフセットを削除します。これはもはや必要なく、結果の画像を表示する際に問題を引き起こす可能性があるためです。最初の画像(結果の右端)は、他のすべての画像の下にレイヤー化されていることに注意してください。レイヤー化を真に循環させ、最後の画像を最初の画像の下に配置する場合は、最初の画像を半分に分割し、上半分をシーケンスの最後に配置する必要がある場合があります。これにより、最初の画像の上半分は最後の画像の上に重なり、下半分は2番目の画像の下に配置されます。このテクニックは強力ですが、画像を整数オフセットにしか配置できません。画像のより正確なサブピクセル配置が必要な場合は、仮想オフセットを調整するのではなく、画像を正確なサブピクセル位置に歪ませる(移動させる)必要があります。増分計算による位置
画像を処理する際に属性を設定しながら、FX 式を使用して他の画像の一部の画像属性にアクセスできます。つまり、各画像の位置を、前の画像の計算された位置を基準にして設定できます。例えば、これは各画像の位置を前の画像の右に設定します。つまり、前の画像の位置にその幅を加えたものです。
magick rose: netscape: granite: \ \ +repage -set page '+%[fx:u[t-1]page.x+u[t-1].w]+0' \ \ -background none -layers merge +repage append_diy.png |
![[IM Output]](append_diy.png)
page
'(仮想オフセット)属性を設定したため、実際に計算されたものです。結果は、DIY の追加演算子と同等であり、そこから独自のバリエーションを開発できます。シーケンス全体は、実際には最初の画像の位置計算中に設定された 'u[-1].w
' によってシフトされていることに注意してください。これは、現在の画像シーケンスの最後の画像の幅である必要があります。ただし、その全体的なずれは、最終的な "+repage
" によって破棄されます。追加の計算を使用してこのオフセットを無視させることもできますが、上記では必要ありません。![]() ![]() |
'u[t] ' のような画像インデックスを使用する場合、すべての画像セレクタ 'u '、'v '、および 's ' は、指定された '[index] ' に従ってすべて同じ画像を参照します。そのため、このインデックス動作のニーモニックとして(そしてこれが変更された場合に備えて)、'u '(最初またはゼロ番目の画像)を使用することをお勧めします。詳細については、FX、DIY 画像演算子を参照してください。 |
magick font_[0-9].gif \ -set page '+%[fx:u[t-1]page.x+u[t-1].w-8]+%[fx:u[t-1]page.y+4]' \ -background none -layers merge +repage append_offset.gif |
![[IM Output]](append_offset.gif)
画像の2段階配置
画像処理を2つのステップに分けることで、簡略化できます。1つのステップは、画像の生成、歪み、配置、およびフラッフの追加に使用し、最後のステップですべてをマージします。たとえば、フォトストアにある大きな元の画像からポラロイドサムネイルを作成し、それぞれを個別に処理してみましょう(その側面は個別にシンプルに保ちます)。
|
![[IM Output]](overlapped_polaroids.jpg)
-repage
" 演算子を使用して移動されます(キャンバスオフセットを参照)。これにより、生成される各画像は前の画像のちょうど 60 ピクセル右に配置されます。つまり、各画像の中心は、アスペクト比と回転によって変更された可能性のある画像の実際のサイズに関係なく、固定距離で配置されます。このスクリプトのもう1つの主なトリックは、各「レイヤー画像」を一時ファイルに保存するのではなく、MIFF: ファイル形式を使用して画像をパイプラインに書き込むことができることです。MIFF 画像ストリーミングとして知られる方法です。これは、"MIFF:
" ファイル形式では、複数の画像を単一のデータストリームに連結するだけで、仮想キャンバスオフセットなどのすべての画像メタデータを保持できるためです。このテクニックは、他の多くのスクリプトの良い出発点を提供します。画像は生成または変更でき、最終的なサイズと位置は任意の方法で計算できます。別の例は、スクリプト "hsl_named_colors
" です。これは、ImageMagick にある名前付き色のリストを取得し、それらを HSL 色空間の色チャートにソートします。その出力は色の指定で見ることができます。その他の可能性としては、...- 任意の種類のサムネイル(またはその他のフラッフ)を使用するか、単に生の小さなサムネイルを直接使用します。
- 最初の画像を中心にして、他の画像をピラミッドのようにその最初の画像の左右下に配置するように画像を生成します。
- 画像を互いに相対的な特定の X 座標と Y 座標に配置することにより、円弧、円、およびらせんに画像を配置します。たとえば、PhD Circle、Sunset Flower、Fibonacci Spiral などです。
- 色に応じて画像を配置します。たとえば、Book Covers などです。
- 時刻または送信時刻別に画像を配置します。たとえば、Year of Sunsets などです。
地図上のピン
典型的なレイヤー化の例として、特定の場所に色付きのピンを地図に配置する例を次に示します。![[IM Output]](../images/push_pin.png)
+18+41
にあります。また、ヴェネツィアの地図の画像があり、地図上の様々な場所にピンを配置したいと考えています。たとえば、「アカデミア」はピクセル位置 +160+283
にあります。プッシュピンをその位置に合わせるには、地図の位置からピンの端の位置を引く必要があります。これにより、私たちの「ピン」画像のオフセットは +142+242
になります。レイヤー化された画像を使用して、結果を次に示します。この例は、IM フォーラムのディスカッションConvert を使用した画像のレイヤー化からのものです。 **これをさらに自動化してみましょう。** 地図に配置したい各ピンの位置と色をリストしたファイルがあります。ファイル内の場所の名前は使用されず、リストされているピクセル位置の単なる参照コメントです。
このテキストファイルを読み込んで、ループ内で「ピン」を作成してみましょう。
|
![[IM Output]](map_venice_pins.jpg)
magick
" コマンドを生成します。画像ワーピングアニメーションのスクリプトはこの手法を使用しています。どちらの方法も一時的な画像を生成する必要がありません。影のレイヤー
重なり合う画像のセットで半透明のシャドウエフェクトを正しく処理することは、実際には見た目よりもはるかに困難です。シャドウ付きの写真を重ねるだけでは、シャドウが2回適用されます。つまり、2つの重なり合うシャドウは非常に暗くなりますが、実際には重なり合う画像と同じようには重なりません。画像のさまざまな部分は、単に影付きにするか、影付きにしない必要があります。つまり、シャドウは画像のどの部分にも一度だけ適用する必要があります。2つの別々の光源がない限り、暗い領域は発生しません。これはさらに困難になります。Tomas Zathurecky < tom @ ksp.sk > は、レイヤー画像のシャドウエフェクトを処理するという課題に取り組み、問題を処理するために画像アキュムレータ技術を開発しました。基本的には、各画像を一度に1つずつスタックの一番下に追加する必要があります。新しい画像を追加すると、前のすべての画像のシャドウが、スタックに追加される前に新しい画像を暗くする必要があります。ただし、新しい画像に落ちるシャドウのみを追加する必要があります。新しい画像に落ちないシャドウは、後で他の画像または背景(存在する場合)に落ちるまで無視する必要があります。次に例を示します...
|
![]() |
-size 1x1 xc:none
")から開始することもできます。画像スタックの一番下に新しい画像を追加するには、毎回同じ操作セットを適用します...- まず、サムネイル画像がメモリに読み込まれ、回転、相対配置(負の場合もあります)が適用されます。この例では既に実行されていますが、この時点で画像に他のサムネイル操作を適用することもできます。新しい画像は画像インデックス#1を形成します。
- 次に、前の画像スタック(#0)を取得し、適切な色、ぼかし、オフセット、および周囲光率でシャドウを生成します。
- このシャドウは新しい画像(#1)に重ねて表示されるため、新しい画像に「
ATop
」されるシャドウのみが保持されます。また、(オプションで)トリミング操作を結果に適用して、シャドウ操作から追加された余分なスペースを削除し、画像#2を形成します。 - これで、新しい画像(#2)を画像の累積スタック(#0)に簡単に追加できます。
- そして、最後を除くすべての以前の作業画像を削除します。
上記は多層画像のシャドウを正しく処理しますが、シャドウはオフセットされていますが、実際にはすべての画像で均等にオフセットされています!実際には、スタックの奥深くにある画像に落ちるにつれて、シャドウのオフセットが大きくなり、ぼやけが大きくなるはずです。つまり、一番上の画像は、一番下の画像と比較して、背景に非常にぼやけたシャドウを落とすはずです。これは実際には、画像のスタックを追跡する必要があるだけでなく、画像のスタックが大きくなるにつれてシャドウがどの程度「ぼやけている」かを追跡する必要があるため、実際にはより困難です。したがって、実際には2つのアキュムレータが必要です。画像スタック(上記のとおり)と、画像を追加するにつれてシャドウの累積です。たとえば、ここでは同じ画像セットを使用していますが、深さに応じてシャドウがぼやけています。
|
![]() |
70x0+0+0
」)。次に、新しい画像が画像の累積スタック(#0)に追加されます。しかし、新しい画像(#2)のシャドウを累積シャドウ(#1)に直接追加した後、再びぼかしやオフセットなしで、すべてのシャドウをぼかしてオフセットし、新しい累積シャドウ画像を形成します。言い換えれば、累積シャドウ画像は、スタックが厚くなるにつれてますますぼやけてオフセットされます。より深い画像のシャドウのみが、効果をそれほど蓄積していません。このプログラムは、本質的にシャドウの適用をインクリメンタルシャドウアキュムレータから分離します。これにより、次のようなものを制御できます...- 現実的なシャドウ(上記のとおり):70x0 + 0 + 0および100x2 + 4 + 7
- 一定のシャドウ(基本的な例として):70x2 + 4 + 7および100x0 + 0 + 0
- 一定のぼかし、ただし累積オフセット:70x2 + 0 + 0および100x0 + 4 + 7
- 一定および漸進的なオフセットの両方:60x0 + 4 + 7および100x0 + 1 + 1
- 累積周囲光効果:80x0 + 0 + 0および95x2 + 4 + 7
-compose ATOP
」コンポジションの前に「-background
」カラーを設定すると、シャドウのカラー(実際には色のついた周囲光)を定義できます。最終的な背景レイヤー(最後の「-background black
」設定)に最終的に落ちるシャドウに異なる色を使用したり、完全にオフにして画像が背景の上にない(つまり、空中に浮かんでいる)ように見せることもできます。それは非常に用途が広いです。Tomas Zathureckyは、レイヤー画像のリスト全体を処理することにより、レイヤー画像のシャドウを処理する別の方法を開発しました。私自身は可能だとは思っていませんでした。この方法の利点は、画像を1つずつ累積し、同じ操作ブロックを何度も繰り返すのではなく、画像のリスト全体を全体として処理できることです。まず、より単純な「一定のシャドウ」の問題を見てみましょう。
|
![]() |
-layers trim-bounds
」で始まります。境界トリミング操作は、すべての画像を含むようにすべての画像の仮想キャンバスを拡張し、すべてのオフセットが正になるようにします。これはクローン化され、合体され、シャドウ化されて、シャドウの個別の進行リストが作成されます。これで、レイヤーコンポジションを使用して、シャドウと元の画像リストをマージできます。ここでの問題は、マージする前に、2つのリストを分割するために特別な「null:
」マーカー画像を追加する必要があるだけでなく、シャドウリストをオフセットするために特別な空白画像「xc:none
」を追加する必要があることです。そうすれば、各シャドウ画像は元のリストの次の画像に「ATop
」オーバーレイされます。残っているのは、正しくシャドウ化された画像を下から上(逆)の順序でマージすることだけです。「深いシャドウ」を処理するには、レイヤー計算が必要です。
|
![]() |
![]() ![]() |
上記は、IMv7の「magick」コマンドを使用すると非常に簡単になります。これにより、「-shadow 」の引数に「fx計算」を直接使用できるようになり、深さに応じてシャドウのオフセットを大きく計算できるだけでなく、シャドウをより大きくすることもできます深さとともにぼやけます。 |
歪んだ遠近法画像の配置
歪んだ画像の整列は難しい場合があり、ここでは、特定の場所で一致するようにそのような画像を整列させる方法を検討します。ここでは、各画像の特定のポイントを強調表示する2つの画像があります。 2番目の画像は65%半透明であるため、青い画像に合成すると透けて見えるため、マークされたポイントが揃っているかどうかを確認できます。マークされたコントロールポイント自体は、それぞれ座標59,26
(青)と35,14
(赤)にあります。2つの画像を単純にオーバーレイする場合は、オフセットを減算し、2つの画像を互いに「合成」して、+ 24 + 12
のオフセットを生成するだけです。
|
![]() |
画像を歪めるときは、2つのピクセルが整列したままであることを確認する必要があります。これを行う最良の方法は、歪み制御点として整列させるポイントを使用することです。これにより、それらが適切に配置されます。
|
![]() |
|
![]() |
+repage
" を使用して行います。さらに処理を行う場合(Webに結果を表示せずに)、そのオフセットを保持します( "+repage
" を削除します)。これにより、画像の位置は、後で処理するために正しい既知の位置に維持されます。上記のテクニックは、パースペクティブなどのより複雑な歪みを実行する場合にも適用されます。
|
![]() |
|
![]() |
|
![]() |
null:
" 画像ファイル形式を使用して出力を取得します。歪みビューポートを使用して、生成される新しい画像のサイズが1ピクセルのみであることを歪みに指示します。そうすれば、歪みの準備と詳細なレポートが実行されますが、「出力先」ピクセルは1つだけ歪み、その後は破棄されます。これにより、処理時間を大幅に節約できます。実際、歪みが計算の一部としてソース画像メタデータ(パーセントエスケープ「%w
」および「%h
」に必要な)を使用しなかった場合、ソース画像「align_red.png
」さえ必要ありません。その場合、入力画像にも1ピクセルの "null:
" 画像を使用できます。また、この情報収集ステップでは、仮想ピクセル、背景などは実際には必要ないため、これらの機能の設定について心配する必要はありません。歪み情報を取得できるようになったので、出力の3行目と4行目から8つのパースペクティブ係数を抽出する必要があります。これらを使用して、赤い制御点を新しい歪んだ位置にマッピングし、そこから青い制御点を減算して、マークされた赤い座標を青い座標に揃えるために必要な実際の変換量を取得できます。
|
![]() |
tr
」テキストフィルターを使用して、出力から余分な引用符とコンマを削除しました。次に、「awk
」プログラムを使用して係数を抽出し、赤いマーカーを青いマーカーに一致させるために必要な浮動小数点演算を実行します。ピクセルの中心が計算に使用されるように、制御点の「ピクセル座標」に再び0.5を追加したことに注意してください。画像座標とピクセル座標を参照してください。これで、歪んだ画像に必要な変換量がわかったので、その変換を歪みに追加する方法は2つあります。パースペクティブ投影の係数を適切に変更する(簡単ではない)か、元のすべての出力先座標に変換量を追加する(非常に簡単)かのいずれかです。後者(出力先座標に変換を追加)の結果は次のとおりです...
|
![]() |
右側では、制御点の周囲の結果をトリミングして拡大縮小し、完全に揃っていることを示しています!
|
![]() |
同様の、しかしより単純な問題は、歪みを使用したテキストの配置で検討されています。
評価シーケンス - 直接複数画像マージ方法
"-evaluate-sequence
" メソッドは、同じサイズの複数の画像を非常に特定の方法でマージするように設計されています。ある意味では、評価および関数演算子と、上記で見てきた複数画像合成手法を組み合わせたものです。提供されているメソッドの多くは、通常の複数画像レイヤー合成手法を使用して実行できますが、すべてではありません。演算子は "-evaluate
" と同じメソッドを使用するため、 "-list Evaluate
" を使用してリストを取得できます。ただし、これらのいくつか(「Mean
」や「Medium
」など)は、この演算子と組み合わせて使用する場合にのみ役立ちます。 複数画像の平均値
基本的に、古い "-evaluate-sequence mean
" と新しい "-evaluate-sequence mean
" はどちらも、提供されたすべての画像の平均を作成します。たとえば、バラの画像のすべての反転および反転バージョンを使用した平均を次に示します。
|
![]() |
composite -blend 50%
" 画像操作を使用する方法があります。これは、サイズが異なる2つの画像で機能します。詳細については、2つの画像をブレンドするの例を参照してください。IMディスカッションフォーラムでは、10フレームずつシーケンスを平均化する方法について議論しました。コンピューターのメモリがいっぱいになることなく(非常に遅くなる)、何千もの画像を平均化するためです。これに関Liên quan đến điều này và chứa toán học có liên quan là cuộc thảo luận Không tải tất cả hình ảnh cùng một lúc. 'mean
' を使用する別の方法として、新しいポリ演算子を使用する方法があります。これは、各画像に個別に重み付けできます。 複数画像の最大値/最小値
「Max
」および「Min
」メソッドは、一連の画像から最大(明るい)値と最小(暗い)値を取得します。繰り返しますが、これらは基本的に明るくするおよび暗くする合成方法を使用することと同じですが、複数の画像を使用します。背景キャンバスの色を適切に選択することで、同等の合成方法でフラット化演算子を使用できます。
|
![]() |
|
![]() |
強度による中央ピクセル
「-evaluate-sequence Median
」は、指定されたすべての画像から、輝度が中央値のピクセルを探します。つまり、各位置について、各画像からピクセルの輝度を収集してソートします。そして、シーケンスの中央に位置するピクセルを選択します。これは、画像のコレクションのピクセルを単純に平均化する代わりに使用することもできます。これは、例えば、画像を上下2つの「制限」画像と組み合わせることで使用できます。ピクセルは中央の輝度になるので、元の画像のピクセルか、「制限」画像のピクセルのいずれかになります。言い換えれば、これを使用して元の画像の輝度を「クリップ」することができます。奇妙ですが、事実です。画像数が偶数の場合は、中央より明るい側のピクセルが選択されます。そのため、画像が2つしかない場合、この演算子はピクセル単位の「輝度による明るくする」ことに相当します。重要な点は、各ピクセルが完全に1つの画像から取得され、輝度によってソートされることです。各ピクセルの正確な色は、指定された画像のいずれかから完全に取得されるため、新しい色は生成されません。たとえば、すべての反転およびフロップバージョンを使用して、バラ画像の中央値輝度のピクセルを示します。ピクセルの輝度に基づいているため、滑らかではなく、鋭い境界が得られる可能性があることに注意してください。
|
![]() |
複数の画像を追加する
「Add
」メソッドは、もちろんすべての画像を単純に加算します。
magick ... -evaluate-sequence add ... |
magick ... -background black -compose plus -layers flatten ... |
複数の画像を減算する
「Subtract
」メソッドは、各画像を最初の画像から減算します。少なくとも、そうあるべきです。内部的には引数が入れ替えられており、次の画像から前の結果を減算しています。ああああ!ただし、Linear Burn合成メソッドの癖を利用することで、2番目以降の画像を最初の画像から減算できます。基本的に、最初の画像以外のすべてを反転し、「white
」(反転したゼロ)を開始背景色として設定することにより、Flattenを使用してすべての画像を最初の画像から減算できます。
magick ... \ -negate \( -clone 0 -negate \) -swap 0 +delete \ -compose LinearBurn -background white -flatten \ ... |
複数の画像の乗算/除算
「Multiply」と「Divide」は、「-evaluate-sequence
」でメソッドとして受け入れられますが、「-evaluate
」と同様に、正規化されたカラー値ではなく、画像の実際のカラー値を使用しているため、予期しない奇妙な結果が生成されます。その結果、乗算と除算のスケールが大きすぎます。これはバグと見なされる可能性があります。当面は、Multiplyの代わりに同等の「flatten」メソッドを使用することをお勧めします。これは期待どおりに機能します。
magick ... -background white -compose multiply -layers flatten ... |
Poly - 多項式を使用した複数の画像のマージ
「-evaluate-sequence
」と特に「mean」メソッド(画像の平均化)に密接に関連しているのは、「-poly
」演算子です(IM v6.8.0-5で追加)。この演算子には、メモリ内の各画像に対して2つの数値のリストが指定されます。1つは各画像に乗算的な重みを付け、もう1つは各画像にべき乗指数を付けます。これにより、各画像が多項式方程式の変数入力であるかのように、画像のリストをマージできます。各画像のカラー値は、正規化された0〜1の値として扱われます。値の各ペアでは、画像の色(正規化)が最初に2番目の「べき乗」指数で累乗され、次に最初の数値で重み付け(乗算)されます。指数が「1
」の場合、値は指定された重み付けで乗算されるだけです。ただし、指数が「0
」の場合、重みは最終値になり、正規化された色の定数加算(0.0〜1.0の値)が生成されます。現在の画像シーケンスに単一ピクセル画像を提供でき、各チャネルに異なる正規化カラー値を使用して、特定の色を追加するために使用できます。(重みと指数= 1.0を使用)。または、「NULL:
」画像(またはその他のジャンク画像)を提供し、0.0の指数を使用できます。これは、指定された重み係数を定数としてのみ追加します。FX DIY Operatorの場合と同様に、最終的な画像は最初の画像(およびそのサイズとその他のメタデータ)から生成されます。例えば...
|
![]() |
rose:
」(重み1とべき乗1を使用して変更なし)を取得し、これに「granite:
」画像のカラー値の2倍(重み= 2)を追加し、最後に「null:
」画像を使用して、指数0(画像入力を無視)と重み付け値-1.0を使用して値1を減算します。結果の画像は、次のようになります。rose + 2.0*granite - 1.0
rose + 2.0*(granite-0.5)
Hard_Light
」合成照明効果とまったく同じですが、花崗岩オーバーレイの重み付けが非常に明確です。他の複数画像操作との主な違いは、各画像に個別に重み付けできることですが、追加の中間画像を必要とせずに、すべての計算を単一の画像処理操作で実行できることです。これにより、非HDRIバージョンのImagMagickでは、量子丸め、クリッピング、または最終結果に対するその他の影響が回避されます。(量子効果を参照)。たとえば、小さな画像グループの平均化、次にそれらのグループの平均化など、多数の画像の加重平均を実行するために使用できます。