ImageMagick の例 --
複数画像のレイヤー

目次
ImageMagick の例の序文と目次
レイヤーの紹介
画像の連結 (-append)
複数画像ペアの合成
複数画像のレイヤー化
レイヤー画像の例

評価シーケンス複数画像マージ
平均値、  最小値/最大値、  中央値ピクセル、   加算、  乗算
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]
上記は、フォントの処理方法と(非常に基本的な方法で)似ています。実際のフォントとは異なり、2色だけに限定されず、個々の文字画像から非常に派手なカラフルなアルファベットを生成できます。これらの「画像フォント」の多くは、WWWからダウンロードできます。非常に小さなセットは、Anthony's Icon LibraryFonts for Text and Countersにあります。これは、上記のBlue Bubble Fontを見つけた場所でもあります。「+append」演算子が、連結するすべての画像が現在の画像シーケンスに追加された後に最後の操作として実行されたことにも注意してください。これは、たとえば、画像にラベルを付ける場合に最適です。

  magick rose: -background LawnGreen label:Rose \
          -background white  -append append_label.jpg
[IM Output]
-background」カラーを使用して、塗りつぶされていないスペースを塗りつぶしたことに注意してください。もちろん、すべての画像の幅が同じであれば、この塗りつぶしのスペースは残りません。IM v6.4.7-1以降、「-gravity」設定を使用して、画像をどのように追加するかを指定できます。そのため、垂直連結では、「Center」を設定すると、最終的な結果の画像に対して画像が中央揃えされます(「North」または「South」の設定でも同様です)。

  magick rose: -background LawnGreen label:Rose \
          -background white -gravity center -append \
          append_center.jpg
[IM Output]
当然、「East」の重力設定では、画像が右側に揃えられます。

  magick rose: -background LawnGreen label:Rose \
          -background white -gravity east -append \
          append_east.jpg
[IM Output]
+append」を使用する場合も、同様の垂直方向の配置を実現できます。
IM v6.4.7より前は、連結された画像を配置することははるかに困難であり、一般に、右揃えには「-flop」を使用していました。または、「-extent」または「-border」を使用して、中央揃えの連結に合わせて画像の幅を調整していました。

たとえば、これはIMの古い6.3.2バージョンで動作します。

  magick rose: -background SkyBlue label:Rose \
          -background White -gravity center -extent 200x \
          -append -trim +repage   append_center_old.jpg
[IM Output]
また、同じコマンド内で複数の連結操作を、操作の結果に関して競合や混乱なく使用することもできます(IM v6より前はそうではありませんでした)。

  magick font_{0,0,6,1,2}.gif +append  dragon_long.gif \
          -background none   -append   append_multi.gif
[IM Output]
画像の各行を連結し、その下に大きな画像を連結しました。これは非常にシンプルで簡単です。括弧を使用することにより、大きな画像の後に数字だけを連結できます。たとえば、ここでは、すべての数字を連結してから、数字の前に読み込んだドラゴン画像に垂直に連結します。

  magick dragon_long.gif  '(' font_{0,0,6,2,9}.gif +append ')' \
          -background none   -append   append_parenthesis.gif
[IM Output]
上記の括弧は、UNIXシェルで使用する場合、引用符で囲むか、バックスラッシュ( '\')でエスケープする必要があります。そうでない場合、シェルによってまったく異なるものとして解釈されます。
2つの画像だけが関係しているため、括弧を使用する代わりに、「+swap」または「-reverse」を使用することもできます。

画像の配列を連結する

これをさらに進めて、画像の配列全体を作成し、行または列で構築できます。

  magick \( font_1.gif font_2.gif font_3.gif +append \) \
          \( font_4.gif font_5.gif font_6.gif +append \) \
          \( font_7.gif font_8.gif font_9.gif +append \) \
          \( -size 32x32 xc:none  font_0.gif +append \) \
          -background none -append   append_array.gif
[IM Output]
技術的には、最初の括弧のセットは必要ありません。まだ画像が読み込まれていないためですが、全体が均一に見え、画像の配列を作成するというコマンドの意図が示されます。同じサイズの画像の配列を作成する別の方法については、モンタージュ連結モードも参照してください。
-append」演算子は実際の画像のみを連結し、仮想キャンバス(画像ページ)サイズまたは画像オフセットは使用しません。ただし、仮想キャンバス情報は、キャンバスサイズが加算され、オフセットが未定義の値に設定されるという、奇妙な状態のままになっているようです。

これはバグと見なされる可能性があり、入力画像または結果の仮想キャンバスを「+repage」を使用してリセットしてから保存するか、この情報が重要になる操作で画像を使用する必要があることを意味します。

この状況は、将来の操作の拡張で修正される可能性があります。したがって、特にタイルクロップされた画像を再連結する場合は注意が必要です。

オーバーラップさせて連結する

IMフォーラムで、ユーザーは画像をある程度のオーバーラップで連結する簡単な方法を尋ねました。多くのソリューションが提供されました。これは、オーバーラップの量が1か所で指定されている、最も簡単なソリューションの1つでした。

  magick granite: rose: -gravity east -background none \
          \( -clone 1 -chop 30x0 \) \( -clone 0,2 +append \) \
          -delete 0,2 +swap -composite append_overlap.gif
[IM Output]
上記では、より一般的なソリューションを表す画像サイズを含む画像配置計算を行う必要はありませんでした。以下の画像レイヤーの処理を参照してください。これは、オーバーラップする部分を切り取ってから、結果を最初の画像に連結して、最終的な画像サイズを作成しました。次に、元の画像を(重力を使用して)上に合成して、実際のオーバーラップを生成します。垂直方向のオーバーラップ、または右から左へのオーバーラップに比較的簡単に変更できます。

スムージング連結

画像を連結する別の方法は、スムージングです。「-smush」演算子は、連結演算子(上記参照)とほぼ同じように機能しますが、画像間のスペース(またはアンチスペース)の量を引数として取ります。たとえば、前の例をより簡単に示すために使用してみましょう。

  magick granite: rose: -background none -gravity Center \
          +smush -20 smush_overlap.png
[IM Output]
それは非常にうまく機能しますが、それは演算子が実際に設計されたものではなく、おそらくはるかに遅くなります。スムージングの実際の意味は、「形状のある画像」をできるだけ近づけることです。たとえば、ここでは、文字「A」と「V」を生成し、それらの間にできるだけ少ないスペースで「スムージング」します。

  magick -background none -pointsize 72 \
          -fill red label:A -fill blue label:V \
          +smush 0 smush_append.png
[IM Output]
2つの文字が連結よりもはるかに近くに連結され、画像の「形状」の空きスペースが利用されていることに注意してください。上記のギャップは、2つの文字のアンチエイリアスエッジピクセルによって引き起こされます。つまり、「-smush」が行うように設計されていますが、多くの計算が必要になるため、連結(上記参照)よりもはるかに遅くなります。引数は、その最終位置のオフセットであり、通常はギャップを生成するための正の値ですが、オーバーラップを作成するための負の値にすることもできます。

  magick -background none -pointsize 72 \
          -fill red label:A -fill blue label:V \
          +smush -15 smush_offset.png
[IM Output]
非常に大きな負の値を使用すると、画像が文書化されていない方法でクリップされる場合があります。

複数画像ペアの合成

合成は、2つの個々の画像をマージするために使用される低レベルの操作です。ほとんどすべてのレイヤー化技術は、最終的に画像が1つだけ残るまで、画像を2つずつマージすることに帰着します。そのため、まず画像ペアの低レベルの合成を行う方法を見てみましょう。

composite コマンドの使用

ImageMagickを使用して2つの画像を組み合わせる従来の方法は、「magick composite」コマンドを使用することです。このコマンドは、一度に2つの画像のみを組み合わせることができ、各操作の結果をファイルに保存します。もちろん、これによって、一度に1つずつ複数の画像をレイヤー化することができなくなります。

  magick -size 100x100 xc:skyblue composite.gif
  magick composite -geometry  +5+10 balloon.gif composite.gif composite.gif
  magick composite -geometry +35+30 medical.gif composite.gif composite.gif
  magick composite -geometry +62+50 present.gif composite.gif composite.gif
  magick composite -geometry +10+55 shading.gif composite.gif composite.gif
[IM Output]
すべての入力画像は出力画像が開かれる前にImageMagickによって読み込まれるため、入力画像の1つに出力できます。これにより、上記のように、問題なく同じ画像を何度も操作できます。

「JPEG」のような非可逆画像形式でこれを行わないでください。形式エラーが累積し、ベース画像が急速に劣化するためです。
-geometry」設定を使用して、オーバーレイされた画像のサイズを変更したり、配置したりすることもできます。

  magick -size 100x100 xc:skyblue comp_resize.gif
  magick composite -geometry 40x40+5+10  balloon.gif comp_resize.gif comp_resize.gif
  magick composite -geometry      +35+30 medical.gif comp_resize.gif comp_resize.gif
  magick composite -geometry 24x24+62+50 present.gif comp_resize.gif comp_resize.gif
  magick composite -geometry 16x16+10+55 shading.gif comp_resize.gif comp_resize.gif
[IM Output]
magick compositeコマンドには、他にもいくつかの利点があります。-composeオプションを使用して画像を背景に描画する方法を制御でき、相対位置は-gravity設定の影響を受けます。また、オーバーレイを-tileして、タイルの制限を指定することなく、背景画像を覆うこともできます。これは、magick compositeを使用する場合にのみ可能です。この方法の大きな欠点は、複数のコマンドを使用しているため、IMは次のコマンドが再び読み込むために、作業中の画像をパイプラインまたはディスクに書き出す必要があることです。画像の上に画像を重ねるためにmagick compositeコマンドを使用する例については、「画像のオーバーレイによる注釈」と「重力を使用した画像の位置決め」を参照してください。

Convertの合成演算子

-composite演算子は、magickコマンド内で使用できます。詳細については、IMでの画像合成を参照してください。これにより、上記と同じ操作を1つのコマンドですべて実行できます。

  magick -size 100x100 xc:skyblue \
          balloon.gif  -geometry  +5+10  -composite \
          medical.gif  -geometry +35+30  -composite \
          present.gif  -geometry +62+50  -composite \
          shading.gif  -geometry +10+55  -composite \
          compose.gif
[IM Output]
これは最初に、色が「skyblue」であるキャンバス画像を作成し、次に後の各画像を指定された場所にそのキャンバスに重ねます。ここで、-geometryは、次の-composite操作のオーバーレイ位置を設定するだけでなく、現在の画像シーケンスの*最後の*画像(最後の画像のみ)を-resizeする非常に特別な演算子です。

  magick -size 100x100 xc:skyblue \
          balloon.gif  -geometry 40x40+5+10   -composite \
          medical.gif  -geometry      +35+30  -composite \
          present.gif  -geometry 24x24+62+50  -composite \
          shading.gif  -geometry 16x16+10+55  -composite \
          compose_geometry.gif
[IM Output]
便利であっても、-geometryのこの「サイズ変更」の副作用は避けることをお勧めします。基本的には、下位互換性の影響の方が大きく、状況によっては他の影響が生じる可能性があるためです。より冗長な推奨事項は次のとおりです。

  magick -size 100x100 xc:skyblue \
          \( balloon.gif -resize 40x40 \) -geometry +5+10   -composite \
          \( medical.gif               \) -geometry +35+30  -composite \
          \( present.gif -resize 24x24 \) -geometry +62+50  -composite \
          \( shading.gif -resize 16x16 \) -geometry +10+55  -composite \
          compose_resize.gif
[IM Output]

複数の画像の描画

また、magickを使用して、描画プリミティブを使用して、作業中のキャンバスに画像を重ねることもできます。

  magick -size 100x100 xc:skyblue \
          -draw "image over  5,10 0,0 'balloon.gif'" \
          -draw "image over 35,30 0,0 'medical.gif'" \
          -draw "image over 62,50 0,0 'present.gif'" \
          -draw "image over 10,55 0,0 'shading.gif'" \
          drawn.gif
[IM Output]
もちろん、オーバーレイされた画像のサイズ変更も指定できます。

  magick -size 100x100 xc:skyblue \
          -draw "image over  5,10 40,40 'balloon.gif'" \
          -draw "image over 35,30  0,0  'medical.gif'" \
          -draw "image over 62,50 24,24 'present.gif'" \
          -draw "image over 10,55 16,16 'shading.gif'" \
          drawn_resize.gif
[IM Output]
「描画された」画像は、オーバーレイ処理中に回転、スケーリング、およびアフィン歪みを行うこともできます。ただし、思い通りに動作させるのは難しい場合があります。描画された画像は、テキストと同様に、-gravityの影響を受けます。

複数画像のレイヤー化

画像の真のレイヤー化には、画像の各ペアを個別に合成することなく、複数の画像を組み合わせる方法が必要です。ここで、さまざまな-layers演算子メソッドが独自のものになります。レイヤー化された画像の順序は重要になる場合があるため、特別な画像シーケンスまたはリスト演算子を理解することをお勧めします。「レイヤー化された画像」は、「アニメーションフレーム」の処理と実質的に同じです。そのため、個々の「レイヤー」または「フレーム」の処理に関するテクニックについては、アニメーションの基本アニメーションの変更の両方を確認することをお勧めします。実際、アニメーションでは、画像の処理に同じ-layers演算子がよく使用されます。

背景画像へのフラット化

-layers flatten画像リスト演算子(またはそのショートカット-flatten)は、基本的に指定された各画像を背景に「合成」して、1つの画像を形成します。ただし、画像の位置は、現在の仮想キャンバス、またはページオフセットを使用して指定されます。たとえば、ここでは、素敵なキャンバスを作成し、そのキャンバスにオーバーレイする画像をそれぞれ指定します。

  magick -size 100x100 xc:skyblue \
          -fill dodgerblue -draw 'circle 50,50 15,25' \
          \( -page +5+10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -layers flatten  flatten_canvas.gif
[IM Output]
IM v6.3.6-2以降、-flatten演算子は、-layers 'flatten'メソッドのエイリアスにすぎません。

したがって、-flattenオプションは、同名の-layersメソッドのショートカットと見なすことができます。
上記のように最初のキャンバスを作成する必要はありません。代わりに、-flattenにキャンバスを作成させることができます。キャンバスの色は現在の-background色になり、サイズは最初の画像の仮想キャンバスサイズによって定義されます。

  magick \( -page 100x100+5+10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( --page +62+50        present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -layers flatten  flatten_page.gif
[IM Output]
-gravity設定は、-geometry設定を使用して定義された画像の配置に影響を与えますが、-page設定によって設定された仮想キャンバスオフセットを使用した画像の位置決めには影響を与えません。これは、このようなオフセットの定義の一部です。詳細については、ジオメトリとページオフセットを参照してください。

-gravityを使用した配置が必要な場合は、上記の複数画像合成方法、または両方の配置方法を同時に処理できる特別なレイヤー合成方法を確認してください。
定義された仮想キャンバス領域に画像が表示されない場合は、必要に応じてクリップされるか無視されます。たとえば、ここでは小さいキャンバスサイズを使用しているため、後の画像がそのキャンバスに完全には表示されません。

  magick \( -page 75x75+5+10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -flatten  flatten_bounds.gif
[IM Output]
Flattenの通常の使い方は、画像の複数の「レイヤー」をマージすることです。つまり、通常は括弧を使用して画像演算子を生成される単一の「レイヤー」画像に制限し、最終結果をまとめてフラット化することで、大きな画像のさまざまな部分を生成できます。たとえば、典型的な使用方法の1つは、元の画像がフラット化されるシャドウ画像レイヤーを作成することです。例えば...

  magick balloon.gif \( +clone  -background navy  -shadow 80x3+5+5 \) +swap \
          -background none   -flatten   flatten_shadow.png
[IM Output]
元の画像の下に影が必要なので、2つの画像をスワップして正しい順序で配置する必要がありました。
生成されたシャドウ画像には負の画像オフセットが含まれる可能性があるため、Flattenを使用してシャドウ画像を追加することはお勧めしません。

シャドウ画像のセクションで説明されているように、推奨されるソリューションは、後で説明する、より高度なレイヤーマージ手法を使用することです。
仮想キャンバスはサイズのみで構成されているため、結果の画像は that サイズになりますが、仮想キャンバスオフセットはありません。そのため、最終画像に存在するオフセットについて心配する必要はありません。画像を重ねるキャンバスを定義するために仮想キャンバスをこのように使用すると、画像に周囲の境界線を追加するために使用できます。たとえば、ここでは、画像のサイズと仮想オフセットを設定して、画像を特定のサイズに「埋め込み」ます。

  magick medical.gif -set page 64x64+20+20 \
          -background SkyBlue   -flatten   flatten_padding.gif
[IM Output]
もちろん、IMが大きな領域で画像を自動的に中央に配置するように、画像を埋め込むためのより良い方法があります。
奇妙なことに、まったく同じ処理を使用して、元の画像よりも小さい仮想キャンバスに画像を「クリップ」またはトリミングできます。ただし、この場合は、トリミング「ウィンドウ」を配置するのではなく、画像をオフセットしているため、負のオフセットを使用してトリミングの位置を指定します。

  magick logo:  -repage 100x100-190-60  -flatten  flatten_crop.gif
[IM Output]
もちろん、ビューポートトリミングでも、-flattenが行うキャンバスの生成とオーバーレイの追加処理を行わずに、これを行うことができます。また、画像が that 表示ウィンドウに部分的にしか含まれていない場合、画像自体を「拡張」してビューポート全体を覆うこともありません。-flatten演算子の一般的な誤用は、画像から透過性を削除することです。つまり、画像に存在する可能性のある透過性をなくすために、背景色に重ねます。ただし、これは複数の画像が関係する場合には機能しないため、推奨されなくなりました。

モザイク - キャンバスの拡大

-layers mosaic演算子(またはその-mosaicショートカット)は、Flatten演算子の拡張キャンバスバージョンに似ています。最初の画像のキャンバスサイズに基づいて最初のキャンバスを作成するだけではないモザイク演算子は、すべての画像を(正の方向のみ)保持するのに十分な大きさのキャンバスを作成します。たとえば、ここでは適切な仮想キャンバスを設定していませんが、-mosaic演算子は、すべての画像レイヤーを保持するためにそのようなキャンバスがどれだけの大きさである必要があるかを計算します。

  magick \( -page +5+10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -layers mosaic  mosaic.gif
[IM Output]
IM v6.3.6-2では、-mosaic演算子は、-layers 'mosaic'のエイリアスにすぎません。

したがって、-mosaicオプションは、同名の-layersメソッドのショートカットと見なすことができます。
-mosaic-flattenの両方が、「原点」または0,0ピクセルから始まるキャンバスを作成することに注意してください。これは、画像の「仮想キャンバス」または「ページ」の定義の一部であり、このため、両方の演算子の最終画像に仮想オフセットがなく、キャンバス全体が実際のピクセルデータで完全に定義されていることを確認できます。また、-mosaicは、上端と左端が仮想原点に固定されているため、正の方向(下端または右端)にのみキャンバスを拡張することに注意してください。もちろん、これは、-mosaicが負のオフセットを持つ画像をクリップし続けることを意味します...

  magick \( -page -5-10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -mosaic  mosaic_clip.gif
[IM Output]

マージ - 新しいレイヤー画像の作成

-layers merge」演算子は、以前の演算子とほぼ同じで、IM v6.3.6-2 で追加されました。これは、指定されたすべての画像をそれぞれのオフセットで保持するのに十分な大きさのキャンバス画像のみを作成します。Mosaicと同様にキャンバスを拡張しますが、正方向だけでなく負方向にも拡張します。基本的に、レイヤー画像をマージする際に、クリッピング、オフセット、その他の側面を気にする必要がないことを意味します。すべての画像は、互いの位置を基準にしてマージされます。出力には、原点が拡張キャンバスの一部であることの保証や包含はされません。そのため、Layers Merge の出力には、正または負の「レイヤーオフセット」が含まれる場合があります。言い換えれば、Layers Merge はレイヤー画像をマージして新しい *レイヤー画像* を生成します。そのため、最終的にそのオフセットが不要な場合は、最終保存の前に「+repage」演算子を含める必要があるでしょう。たとえば、これまでに使用したのと同じレイヤー画像セットを次に示します...

  magick \( -page +5+10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -layers merge  +repage layers_merge.gif
[IM Output]
ご覧のとおり、画像は互いに相対的に配置されたすべての画像を保持するのに十分な大きさであり、仮想キャンバスの原点に対する結果の画像のオフセットは破棄されています。クリッピングや不要な余分なスペースなしで相対位置を維持できることが、このバリアントを非常に強力なものにしています。画像の1つに負のオフセットを与えて、もう一度試してみましょう...

  magick \( -page -5-10  balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( -page +62+50 present.gif \)   \( -page +10+55 shading.gif \)  \
          -background dodgerblue  -layers merge  +repage layers_merge_2.gif
[IM Output]
ご覧のとおり、「風船」はクリップされず、他の画像からさらに離れて移動し、他の画像との相対距離が維持されています。もちろん、上記の例では「+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 \) -layers coalesce  coalesce_canvas.gif
[IM Output]
複数のレイヤーで構成される画像を扱う場合、Coalesce を使用して画像の「プログレッシブレイヤリング」を生成できます。ただし、これを行うには、演算子による「GIFアニメーション」処理を無効にするために、いくつかの予防措置を講じる必要があります。

   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]
上記では、すべての「-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]
FlattenMosaicMerge とは異なり、「-coalesce」演算子は現在の「-compose」アルファ合成設定を *使用しない* ことに注意してください。GIFアニメーションの処理に必要なため、「Over」合成メソッドのみを使用します。より標準的な画像レイヤリング演算子で異なる「-compose」メソッドを使用することは、次の例題の主題です。

合成方法とレイヤー化

3つの レイヤリング メソッド:FlattenMosaicMerge は、「-compose」設定を使用して、シーケンス内の各画像をオーバーレイするために使用される合成メソッドを決定します。そのため、これらの関数は、指定された色の初期「-background」キャンバスを設定できるマルチ画像「-composite」演算子と考えることができます。ただし、デフォルトの アルファ合成Over」以外を使用するには、適用する前に少し検討する必要があります。そうでないと、予期しない結果が生じる可能性があります。また、これらの演算子によって開始キャンバスを生成するために使用される「-background」の色の影響についても、各画像(最初の画像を含む)が合成される前に検討する必要がある場合があります。たとえば、'DstOver' を使用して、各連続画像を前の画像の *下* に配置してみましょう...

  magick \( -page 100x100+5+10 balloon.gif \)   \( -page +35+30 medical.gif \)  \
          \( --page +62+50       present.gif \)   \( -page +10+55 shading.gif \)  \
          -background none  -compose DstOver  -flatten  flatten_dstover.gif
[IM Output]
ここでは、背景は透明に設定されています。そうでない場合、他のすべての画像がこの初期キャンバスの「下」に配置されるため、結果には背景キャンバスのみが表示されます!これは、既存の画像に合わせてサイズ変更されたキャンバス に示すように、特定の色で画像を「ブランク」にする方法を提供します。より実用的な例を次に示します。画像処理の状況によっては扱いにくく不自然な、背景キャンバスを最初にレイヤー化するのではなく、画像をトップダウンまたは前景から背景の順序で生成できます。

  magick rose: -repage +10+10 \
          \( +clone -background black -shadow 60x3+5+5 \) \
          \( granite: -crop 100x80+0+0 +repage \) \
          -background none  -compose DstOver -layers merge layer_dstover.gif
[IM Output]
最初の3行はそれぞれ1つのレイヤー画像を生成し、最後の行はすべてのレイヤーを前のレイヤーの下にマージして、事実上順序を反転させます。

ご覧のとおり、上記の画像処理は、各画像を順番に(透明な開始キャンバスで)下敷きにするだけで、通常影の生成で見られるよりもシンプルできれいでした。

もちろん、代わりに画像リストを 反転 することもできました。

  magick rose: -repage +10+10 \
          \( +clone -background black -shadow 60x3+5+5 \) \
          \( granite: -crop 100x80+0+0 +repage \) \
          -reverse -layers merge layer_reverse.gif
[IM Output]
ただし、これは既存の画像の順序を変更するだけで、レイヤリングメソッドが作成する「開始背景キャンバス」には影響しないことに注意してください。合成メソッドを使用して、興味深い効果を生み出すこともできます。たとえば、3つの円を描画し、「Xor」合成メソッドを使用してオーバーレイすると、最小限の労力で、珍しい複雑なシンボルが得られます。

  magick -size 60x60 \
          \( xc:none -fill blue   -draw 'circle 21,39 24,57' \) \
          \( xc:none -fill red    -draw 'circle 39,39 36,57' \) \
          \( xc:none -fill green  -draw 'circle 30,21 30,3'  \) \
          -background none  -compose Xor   -flatten  flatten_xor.png
[IM Output]

レイヤー合成 - 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]

画像の計算による配置

仮想キャンバスオフセット(ページ)は、様々な方法で設定できます。具体的には、画像ごとにこの属性を"-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]
上記の例の鍵は、正規化された画像インデックス(FX 式 '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]
各画像は、その位置を調べ、その画像の幅を追加することで、前の画像の位置に追加されます。この前の位置は、IM が各画像をループして '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]
他の画像の属性にアクセスするこの機能には、他の画像のピクセルデータも含まれます。つまり、カラー値が他の画像の「マッピングされた位置」を表す特別な画像を作成できます。もちろん、その「マッピング」画像も配置され、オーバーレイを実行する前に削除する必要があります。特別な「マッピングされた位置」画像を作成することがどれほど役立つかは別の問題です。それは単なる別の可能性です。

画像の2段階配置

画像処理を2つのステップに分けることで、簡略化できます。1つのステップは、画像の生成、歪み、配置、およびフラッフの追加に使用し、最後のステップですべてをマージします。たとえば、フォトストアにある大きな元の画像からポラロイドサムネイルを作成し、それぞれを個別に処理してみましょう(その側面は個別にシンプルに保ちます)。

  center=0   # Start position of the center of the first image.
             # This can be ANYTHING, as only relative changes are important.

  for image in ../img_photos/[a-m]*_orig.jpg
  do

    # Add 70 to the previous images relative offset to add to each image
    #
    center=`magick xc: -format "%[fx: $center +70 ]" info:`

    # read image, add fluff, and using centered padding/trim locate the
    # center of the image at the next location (relative to the last).
    #
    magick -size 500x500 "$image" -thumbnail 240x240 \
            -set caption '%t' -bordercolor Lavender -background black \
            -pointsize 12  -density 96x96  +polaroid  -resize 30% \
            -gravity center -background None -extent 100x100 -trim \
            -repage +${center}+0\!    MIFF:-

  done |
    # read pipeline of positioned images, and merge together
    magick -background skyblue   MIFF:-  -layers merge +repage \
            -bordercolor skyblue -border 3x3   overlapped_polaroids.jpg

[IM Output]
上記のスクリプトは複雑に見えますが、実際にはそうではありません。単純にループ内で各サムネイル画像を生成し、同時に中央にパディングを追加し(Extentを使用)、各画像をトリミングして、画像の「中心」が仮想キャンバス上の既知の位置にあるようにします。実際にはその位置を計算できますが、一時ファイルが必要になる場合があるため、すべての画像で既知の位置にあることを確認することをお勧めします。次に、画像は相対的な "-repage" 演算子を使用して移動されます(キャンバスオフセットを参照)。これにより、生成される各画像は前の画像のちょうど 60 ピクセル右に配置されます。つまり、各画像の中心は、アスペクト比と回転によって変更された可能性のある画像の実際のサイズに関係なく、固定距離で配置されます。このスクリプトのもう1つの主なトリックは、各「レイヤー画像」を一時ファイルに保存するのではなく、MIFF: ファイル形式を使用して画像をパイプラインに書き込むことができることです。MIFF 画像ストリーミングとして知られる方法です。これは、"MIFF:" ファイル形式では、複数の画像を単一のデータストリームに連結するだけで、仮想キャンバスオフセットなどのすべての画像メタデータを保持できるためです。このテクニックは、他の多くのスクリプトの良い出発点を提供します。画像は生成または変更でき、最終的なサイズと位置は任意の方法で計算できます。別の例は、スクリプト "hsl_named_colors" です。これは、ImageMagick にある名前付き色のリストを取得し、それらを HSL 色空間の色チャートにソートします。その出力は色の指定で見ることができます。その他の可能性としては、...
  • 任意の種類のサムネイル(またはその他のフラッフ)を使用するか、単に生の小さなサムネイルを直接使用します。
  • 最初の画像を中心にして、他の画像をピラミッドのようにその最初の画像の左右下に配置するように画像を生成します。
  • 画像を互いに相対的な特定の X 座標と Y 座標に配置することにより、円弧、円、およびらせんに画像を配置します。たとえば、PhD CircleSunset FlowerFibonacci Spiral などです。
  • 色に応じて画像を配置します。たとえば、Book Covers などです。
  • 時刻または送信時刻別に画像を配置します。たとえば、Year of Sunsets などです。
基本的に、仮想キャンバス上の画像の配置は完全に自由であり、IM にすべての画像を保持するために必要なキャンバスの最終サイズを決定させることができます。

地図上のピン

典型的なレイヤー化の例として、特定の場所に色付きのピンを地図に配置する例を次に示します。[IM Output] 左側に「プッシュピン」画像があります。ピンの端は位置 +18+41 にあります。また、ヴェネツィアの地図の画像があり、地図上の様々な場所にピンを配置したいと考えています。たとえば、「アカデミア」はピクセル位置 +160+283 にあります。プッシュピンをその位置に合わせるには、地図の位置からピンの端の位置を引く必要があります。これにより、私たちの「ピン」画像のオフセットは +142+242 になります。レイヤー化された画像を使用して、結果を次に示します。

  magick map_venice.jpg    -page +142+242 push_pin.png \
          -flatten  map_push_pin.jpg
[IM Output]
この例は、IM フォーラムのディスカッションConvert を使用した画像のレイヤー化からのものです。 **これをさらに自動化してみましょう。** 地図に配置したい各ピンの位置と色をリストしたファイルがあります。ファイル内の場所の名前は使用されず、リストされているピクセル位置の単なる参照コメントです。
[Data File]
このテキストファイルを読み込んで、ループ内で「ピン」を作成してみましょう。


  pin_x=18  pin_y=41

  cat map_venice_pins.txt |\
    while read x y color location; do

      [ "X$x" = "X#" ] && continue   # skip comments in data

      x=$(( x - pin_x ))    # magick x,y to pin image offsets
      y=$(( y - pin_y ))

      # magick 'color' to settings for color modulate (hue only)
      # assumes a pure 'red' color for the original push pin
      mod_args=$(
         magick xc:$color -colorspace HSL txt: |
           tr -sc '0-9\012' ' ' |\
             awk 'NR==1 { depth=$3 }
                  NR==2 { hue=$3;
                          print  "100,100,"  100+200*hue/depth
                        }'; )

      # re-color and position the push pin
      magick push_pin.png -repage +${x}+${y} -modulate $mod_args miff:-

    done |\
      # read pipeline of positioned images, and merge together
      magick map_venice.jpg  MIFF:-  -flatten  map_venice_pins.jpg

[IM Output]
オリジナルのピンの色が赤(色相0)であると仮定し、モジュレート演算子を使用して、適切なスケーリング計算で他の色に再着色することに注意してください。色相を変更しない場合のモジュレート引数は100で、200の値(擬似パーセンテージ値のようなもの)で循環します。今後:遠近法による歪みマップ、マップの「深度」に合わせてピンサイズを調整、歪みによるピン位置の変化を計算し、歪んだマップに「ピン留め」する。上記では、MIFF画像ストリーミングと呼ばれる方法を使用しました。各画像はループ内で個別に生成され、「パイプ」されて「レイヤー」コマンドに送られ、最終的な画像が生成されます。代替方法(一般的にPHPスクリプトで使用される)は、「生成されたコマンド」技術を使用することです。これは、シェルスクリプトを使用して実行する長い "magick" コマンドを生成します。画像ワーピングアニメーションのスクリプトはこの手法を使用しています。どちらの方法も一時的な画像を生成する必要がありません。

影のレイヤー

重なり合う画像のセットで半透明のシャドウエフェクトを正しく処理することは、実際には見た目よりもはるかに困難です。シャドウ付きの写真を重ねるだけでは、シャドウが2回適用されます。つまり、2つの重なり合うシャドウは非常に暗くなりますが、実際には重なり合う画像と同じようには重なりません。画像のさまざまな部分は、単に影付きにするか、影付きにしない必要があります。つまり、シャドウは画像のどの部分にも一度だけ適用する必要があります。2つの別々の光源がない限り、暗い領域は発生しません。これはさらに困難になります。Tomas Zathurecky < tom @ ksp.sk > は、レイヤー画像のシャドウエフェクトを処理するという課題に取り組み、問題を処理するために画像アキュムレータ技術を開発しました。基本的には、各画像を一度に1つずつスタックの一番下に追加する必要があります。新しい画像を追加すると、前のすべての画像のシャドウが、スタックに追加される前に新しい画像を暗くする必要があります。ただし、新しい画像に落ちるシャドウのみを追加する必要があります。新しい画像に落ちないシャドウは、後で他の画像または背景(存在する場合)に落ちるまで無視する必要があります。次に例を示します...

  magick \
    \( holocaust_tn.gif -frame 10x10+3+3 \
          -background none  -rotate 5 -repage +0+0 \) \
    \
    \( spiral_stairs_tn.gif -frame 10x10+3+3 \
          -background none -rotate -15 -repage -90+60 \) \
    \( -clone 0   -background black -shadow 70x3+4+7 \
       -clone 1   -background black -compose DstATop -layers merge \
       -trim \) \
    \( -clone 2,0 -background none  -compose Over -layers merge \) \
    -delete 0--2 \
    \
    \( chinese_chess_tn.gif -frame 10x10+3+3 \
          -background none -rotate 20 -repage +60+90 \) \
    \( -clone 0   -background black -shadow 70x3+4+7 \
       -clone 1   -background black -compose DstATop -layers merge \
       -trim \) \
    \( -clone 2,0 -background none  -compose Over -layers merge \) \
    -delete 0--2 \
    \
    \( +clone -background black -shadow 70x3+4+7 \) +swap \
    -background none -compose Over -layers merge +repage \
    layers_of_shadows.png
[IM Output]
上記のプログラムは複雑に見えますが、実際には非常に簡単です。最初の画像は、画像の累積スタックを開始するために使用されます(画像インデックス#0)。最初の画像を使用してスタックを初期化しない場合は、実際には単一の透明ピクセル( "-size 1x1 xc:none")から開始することもできます。画像スタックの一番下に新しい画像を追加するには、毎回同じ操作セットを適用します...
  • まず、サムネイル画像がメモリに読み込まれ、回転、相対配置(負の場合もあります)が適用されます。この例では既に実行されていますが、この時点で画像に他のサムネイル操作を適用することもできます。新しい画像は画像インデックス#1を形成します。
  • 次に、前の画像スタック(#0)を取得し、適切な色、ぼかし、オフセット、および周囲光率でシャドウを生成します。
  • このシャドウは新しい画像(#1)に重ねて表示されるため、新しい画像に「ATop」されるシャドウのみが保持されます。また、(オプションで)トリミング操作を結果に適用して、シャドウ操作から追加された余分なスペースを削除し、画像#2を形成します。
  • これで、新しい画像(#2)を画像の累積スタック(#0)に簡単に追加できます。
  • そして、最後を除くすべての以前の作業画像を削除します。
画像を追加するには、基本的に上記の操作ブロックを繰り返します。すべての画像がスタックに追加された後、累積された画像スタックで通常のシャドウ操作を実行するだけです。残りの画像オフセットを削除します(多くのWebブラウザは嫌いです)。マージを使用すると、仮想オフセット、特に負のオフセットを自動的に処理できるため、前の画像配置を基準にして画像を好きな場所に配置できます。また、負のオフセットを持つ大きな画像を適切に生成できるシャドウを適用することもできます。
上記は多層画像のシャドウを正しく処理しますが、シャドウはオフセットされていますが、実際にはすべての画像で均等にオフセットされています!実際には、スタックの奥深くにある画像に落ちるにつれて、シャドウのオフセットが大きくなり、ぼやけが大きくなるはずです。つまり、一番上の画像は、一番下の画像と比較して、背景に非常にぼやけたシャドウを落とすはずです。これは実際には、画像のスタックを追跡する必要があるだけでなく、画像のスタックが大きくなるにつれてシャドウがどの程度「ぼやけている」かを追跡する必要があるため、実際にはより困難です。したがって、実際には2つのアキュムレータが必要です。画像スタック(上記のとおり)と、画像を追加するにつれてシャドウの累積です。たとえば、ここでは同じ画像セットを使用していますが、深さに応じてシャドウがぼやけています。

  magick xc:none xc:none \
    \
    \( holocaust_tn.gif -frame 10x10+3+3 \
          -background none  -rotate 5 -repage +0+0 \) \
    \( -clone 1   -background black -shadow 70x0+0+0 \
       -clone 2   -background black -compose DstATop -layers merge \
       -clone 0   -background none  -compose Over    -layers merge \) \
    \( -clone 2,1 -background none  -compose Over    -layers merge \
                  -background black -shadow 100x2+4+7 \) \
    -delete 0-2 \
    \
    \( spiral_stairs_tn.gif -frame 10x10+3+3 \
          -background none -rotate -15 -repage -90+60 \) \
    \( -clone 1   -background black -shadow 70x0+0+0 \
       -clone 2   -background black -compose DstATop -layers merge \
       -clone 0   -background none  -compose Over    -layers merge \) \
    \( -clone 2,1 -background none  -compose Over    -layers merge \
                  -background black -shadow 100x2+4+7 \) \
    -delete 0-2 \
    \
    \( chinese_chess_tn.gif -frame 10x10+3+3 \
          -background none -rotate 20 -repage +60+90 \) \
    \( -clone 1   -background black -shadow 70x0+0+0 \
       -clone 2   -background black -compose DstATop -layers merge \
       -clone 0   -background none  -compose Over    -layers merge \) \
    \( -clone 2,1 -background none  -compose Over    -layers merge \
                  -background black -shadow 100x2+4+7 \) \
    -delete 0-2 \
    \
    \( -clone 1 -background black -shadow 70x0+0+0 \
       -clone 0 -background none -compose Over -layers merge \) \
    -delete 0-1 -trim +repage \
    layers_of_deep_shadows.png
[IM Output]
結果をよく見てください。シャドウのオフセットとぼやけは、画像のさまざまな部分で異なります。隣接するレイヤーの画像間では非常に薄いですが、画像またはさらに深い背景に落ちると非常に厚くなります。もちろん、この例では、シャドウのオフセットが大きすぎる可能性がありますが、結果は非常に現実的で、レイヤーの奥行きがよりよく感じられます。シャドウの操作を2つのステップに分割する方法に注目してください。累積シャドウ(画像インデックス#1)を新しい画像(#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
それらのほとんどはおrscheinlich unrealistisch sind、aber in anderen Situationen gut aussehen können。また、「-compose ATOP」コンポジションの前に「-background」カラーを設定すると、シャドウのカラー(実際には色のついた周囲光)を定義できます。最終的な背景レイヤー(最後の「-background black」設定)に最終的に落ちるシャドウに異なる色を使用したり、完全にオフにして画像が背景の上にない(つまり、空中に浮かんでいる)ように見せることもできます。それは非常に用途が広いです。
Tomas Zathureckyは、レイヤー画像のリスト全体を処理することにより、レイヤー画像のシャドウを処理する別の方法を開発しました。私自身は可能だとは思っていませんでした。この方法の利点は、画像を1つずつ累積し、同じ操作ブロックを何度も繰り返すのではなく、画像のリスト全体を全体として処理できることです。まず、より単純な「一定のシャドウ」の問題を見てみましょう。

  magick \
    \( holocaust_tn.gif -frame 10x10+3+3 \
          -background none  -rotate 5 -repage +0+0 \) \
    \( spiral_stairs_tn.gif -frame 10x10+3+3 \
          -background none -rotate -15 -repage -90+60 \) \
    \( chinese_chess_tn.gif -frame 10x10+3+3 \
          -background none -rotate 20 -repage +60+90 \) \
    \
    -layers trim-bounds \
    \
    \( -clone 0--1 -dispose None -coalesce \
       -background black -shadow 70x2+4+7 \
       xc:none +insert null: +insert +insert xc:none \) \
    -layers trim-bounds -compose Atop -layers composite \
    \
    -fuzz 10% -trim \
    -reverse -background none -compose Over -layers merge +repage \
    coalesced_shadows.png
[IM Output]
最初の演算子ブロックは、レイヤー画像のリストを生成しているだけです。前に示したように、別のプログラムされたループにすることができます。操作は「-layers trim-bounds」で始まります。境界トリミング操作は、すべての画像を含むようにすべての画像の仮想キャンバスを拡張し、すべてのオフセットが正になるようにします。これはクローン化され、合体され、シャドウ化されて、シャドウの個別の進行リストが作成されます。これで、レイヤーコンポジションを使用して、シャドウと元の画像リストをマージできます。ここでの問題は、マージする前に、2つのリストを分割するために特別な「null:」マーカー画像を追加する必要があるだけでなく、シャドウリストをオフセットするために特別な空白画像「xc:none」を追加する必要があることです。そうすれば、各シャドウ画像は元のリストの次の画像に「ATop」オーバーレイされます。残っているのは、正しくシャドウ化された画像を下から上()の順序でマージすることだけです。
「深いシャドウ」を処理するには、レイヤー計算が必要です。

  magick \
    \( holocaust_tn.gif -frame 10x10+3+3 \
          -background none  -rotate 5 -repage +0+0 \) \
    \( spiral_stairs_tn.gif -frame 10x10+3+3 \
          -background none -rotate -15 -repage -90+60 \) \
    \( chinese_chess_tn.gif -frame 10x10+3+3 \
          -background none -rotate 20 -repage +60+90 \) \
    \
    \( -clone 0--1 \
       -set page '+%[fx:page.x-4*t]+%[fx:page.y-7*t]' -layers merge \) \
    -layers trim-bounds +delete \
    \
    \( -clone 0--1 \
       -set page '+%[fx:page.x-4*t]+%[fx:page.y-7*t]' \
            -dispose None -coalesce \
       -set page '+%[fx:page.x+4*t]+%[fx:page.y+7*t]' \
            -background black -shadow 70x2+4+7 \
       xc:none +insert null: +insert +insert xc:none \) \
    -layers trim-bounds -compose Atop -layers composite \
    \
    -fuzz 10% -trim \
    -reverse -background none -compose Over -layers merge +repage \
    coalesced_deep_shadows.png
[IM Output]
以前に使用されたのと同じセットのブロックが表示されますが、初期の境界トリミングを設定し、後で「プログレッシブシャドウリスト」に必要なオフセットを計算するための計算ははるかに複雑です。ただし、シャドウは現在、深さとともにぼやけていません。
上記は、IMv7の「magick」コマンドを使用すると非常に簡単になります。これにより、「-shadow」の引数に「fx計算」を直接使用できるようになり、深さに応じてシャドウのオフセットを大きく計算できるだけでなく、シャドウをより大きくすることもできます深さとともにぼやけます。

歪んだ遠近法画像の配置

歪んだ画像の整列は難しい場合があり、ここでは、特定の場所で一致するようにそのような画像を整列させる方法を検討します。ここでは、各画像の特定のポイントを強調表示する2つの画像があります。
[IM Output] [IM Output]
2番目の画像は65%半透明であるため、青い画像に合成すると透けて見えるため、マークされたポイントが揃っているかどうかを確認できます。マークされたコントロールポイント自体は、それぞれ座標59,26(青)と35,14(赤)にあります。2つの画像を単純にオーバーレイする場合は、オフセットを減算し、2つの画像を互いに「合成」して、+ 24 + 12のオフセットを生成するだけです。

  magick align_blue.png align_red.png -geometry +24+12 \
          -composite align_composite.png
[IM Output]
このオフセットは負になる可能性があることに注意してください!そして、それは私たちがまもなく対処することです。これは、座標が整数ピクセル座標である場合にのみ機能します。一致する座標がサブピクセル位置(写真のモンタージュで一般的な場合)である場合、単純な合成は機能しません。また、何らかの歪みが関係している場合(これも現実の画像では一般的です)もうまく機能しません。そして、これが私たちが探求する問題です。
画像を歪めるときは、2つのピクセルが整列したままであることを確認する必要があります。これを行う最良の方法は、歪み制御点として整列させるポイントを使用することです。これにより、それらが適切に配置されます。

  magick align_blue.png \
          \( align_red.png -alpha set -virtual-pixel transparent \
             +distort SRT '35.5,14.5  1 75  59.5,26.5' \
          \) -flatten  align_rotate.png
[IM Output]
歪み(distort)は「キャンバスオフセット」を持つ「レイヤー画像」を生成するため、画像を重ね合わせるために単純に合成(Composite)を使用することはできません(低レベルすぎるため)。代わりに、歪みによって生成されたオフセットを使用して画像を配置するように、フラット化(Flatten)演算子を使用する必要があります。「ピクセル」座標に0.5の値を追加した方法にも注目してください。これは、ピクセルには面積があるのに対し、数学的な点には面積がないためです。そのため、ピクセルの中心を合わせたい場合は、ピクセル内の中心「点」の位置に0.5を追加する必要があります。詳細については、画像座標とピクセル座標を参照してください。上記のもう1つの問題は、重ねられた画像が青い背景のキャンバス画像によって「クリップ」されたことです。合成演算子と同様に。つまり、「青い」画像が合成中の結果の「クリッピングビューポート」を提供したということです。これを防ぐために、代わりにレイヤーマージ(Layer Merge)を使用します。これは、合成されるすべての画像を保持するのに十分な大きさの「ビューポート」キャンバスを自動的に計算します。

  magick align_blue.png \
          \( align_red.png -alpha set -virtual-pixel transparent \
             +distort SRT '35.5,14.5  1 75  59.5,26.5' \
          \) -background none -layers merge +repage  align_rotate_merge.png
[IM Output]
「マージ」の結果、画像には「負の」オフセットが設定されます(画像のレイヤー位置を保持するため)。結果を表示するには、多くのブラウザが画像の負のオフセットを処理しないため、そのオフセットを削除する必要がありました。これは、最終的な画像を保存する前に "+repage" を使用して行います。さらに処理を行う場合(Webに結果を表示せずに)、そのオフセットを保持します( "+repage" を削除します)。これにより、画像の位置は、後で処理するために正しい既知の位置に維持されます。
上記のテクニックは、パースペクティブなどのより複雑な歪みを実行する場合にも適用されます。

  magick align_blue.png \
          \( align_red.png -alpha set -virtual-pixel transparent \
             +distort Perspective '35.5,14.5  59.5,26.5
                       0,0 32,4    0,%h 14,36    %w,%h 72,53  ' \
          \) -background none -layers merge +repage  align_perspective.png
[IM Output]
この手法の問題点は、内部制御点を使用してパースペクティブ歪みの位置を指定することです。つまり、画像内部の1点と、エッジ周辺の3点です。制御点のわずかな動きが「自由なコーナー」を大きく動かす可能性があるため、実際のパースペクティブ形状を制御するのが難しい場合があります。この状況は、より正確な「最小二乗適合」を使用して画像を配置するために、多数の「登録点」のリストを使用している場合、さらに悪化する可能性があります。その場合、関心のある点は、画像を歪ませるために使用される制御「登録点」の1つの近くにない可能性があります。代わりに、必要な方法で画像を歪ませてから、目的の点を揃えるために結果の画像をどのように変換する必要があるかを把握するだけです。これが機能するためには、「関心のある点」が歪みの結果としてどのように移動したかを知る必要があります。これは、画像、特に実際の画像を歪ませたり配置したりする場合の実際の問題です。たとえば、ここでは4つのコーナーすべてを使用して画像を歪ませ、特定の(想定される)歪み形状を作成しますが、この時点では制御点を揃えようとせず、歪みを適用するだけです...

  magick align_blue.png \
          \( align_red.png -alpha set -virtual-pixel transparent \
             +distort Perspective '0,0  10,12  0,%h 14,40
                               %w,0 68,6  %w,%h 63,48 ' \
          \) -background none -layers merge +repage  align_persp_shape.png
[IM Output]
赤い画像が歪んでいる間、赤い制御点の位置は、揃えたい青い制御点の近くにはありません。赤い点は正確なピクセル位置にある可能性は低く、サブピクセルオフセットが含まれるため、これら2つの点を単純に測定することはできません。最初に、赤い点の正確な位置を計算する必要があります。そのためには、詳細出力を有効にして上記の歪みを再実行し、パースペクティブの前方マッピング係数を取得します。これらは、パースペクティブ投影歪みで説明されているように、計算に使用できます。

  magick align_red.png  -define distort:viewport=1x1  -verbose \
          +distort Perspective '0,0  10,12  0,%h 14,40
                                %w,0 68,6  %w,%h 63,48 ' null:
[IM Text]
必要なのは、歪みによって使用される計算された係数だけです。そのため、出力画像を必要としないため、 "null:" 画像ファイル形式を使用して出力を取得します。歪みビューポートを使用して、生成される新しい画像のサイズが1ピクセルのみであることを歪みに指示します。そうすれば、歪みの準備と詳細なレポートが実行されますが、「出力先」ピクセルは1つだけ歪み、その後は破棄されます。これにより、処理時間を大幅に節約できます。実際、歪みが計算の一部としてソース画像メタデータ(パーセントエスケープ「%w」および「%h」に必要な)を使用しなかった場合、ソース画像「align_red.png」さえ必要ありません。その場合、入力画像にも1ピクセルの "null:" 画像を使用できます。また、この情報収集ステップでは、仮想ピクセル、背景などは実際には必要ないため、これらの機能の設定について心配する必要はありません。
歪み情報を取得できるようになったので、出力の3行目と4行目から8つのパースペクティブ係数を抽出する必要があります。これらを使用して、赤い制御点を新しい歪んだ位置にマッピングし、そこから青い制御点を減算して、マークされた赤い座標を青い座標に揃えるために必要な実際の変換量を取得できます。

  bluex=59; bluey=26
  redx=35; redy=14

  magick align_red.png  -verbose \
             +distort Perspective '0,0  10,12  0,%h 14,40
                               %w,0 68,6  %w,%h 63,48 ' null: 2>&1 |\
    tr -d "',"  |\
      awk 'BEGIN   { redx='"$redx"'+0.5;   redy='"$redy"+0.5';
                     bluex='"$bluex"'+0.5; bluey='"$bluey"'+0.5; }
           NR == 3 { sx=$1; ry=$2;  tx=$3; rx=$4; }
           NR == 4 { sy=$1; ty=$2;  px=$3; py=$4; }
           END { div =  redx*px + redy*py + 1.0;
                 dx = ( redx*sx + redy*ry + tx ) / div;
                 dy = ( redx*rx + redy*sy + ty ) / div;
                 printf "red point now at %f,%f\n", dx, dy;
                 printf "translate shape by %+f %+f\n", bluex-dx, bluey-dy; }'
[IM Text]
上記では、「tr」テキストフィルターを使用して、出力から余分な引用符とコンマを削除しました。次に、「awk」プログラムを使用して係数を抽出し、赤いマーカーを青いマーカーに一致させるために必要な浮動小数点演算を実行します。ピクセルの中心が計算に使用されるように、制御点の「ピクセル座標」に再び0.5を追加したことに注意してください。画像座標とピクセル座標を参照してください。これで、歪んだ画像に必要な変換量がわかったので、その変換を歪みに追加する方法は2つあります。パースペクティブ投影の係数を適切に変更する(簡単ではない)か、元のすべての出力先座標に変換量を追加する(非常に簡単)かのいずれかです。後者(出力先座標に変換を追加)の結果は次のとおりです...

  magick align_blue.png \
          \( align_red.png -alpha set -virtual-pixel transparent \
             +distort Perspective '0,0   31.408223,15.334305
                                   0,%h  35.408223,43.334305
                                   %w,0  89.408223, 9.334305
                                   %w,%h 84.408223,51.334305 ' \
          \) -background none -layers merge +repage  align_persp_move.png
[IM Output]
右側では、制御点の周囲の結果をトリミングして拡大縮小し、完全に揃っていることを示しています!

  magick align_persp_shape.png -crop 19x19+50+17 +repage \
          -scale 500%   align_persp_shape_mag.png
[IM Output]
ご覧のとおり、2つのピクセルは完全に揃っており、どちらの側にもサブピクセルのオーバーフローはありません。わずかなずれでも、中央ピクセルの両側に非対称な色として表示されます。このスケーリングでは、パースペクティブ歪みによって、赤い十字の左右の間にわずかな非対称差が見られます。つまり、このピクセルレベルのビュテストの精度です。
同様の、しかしより単純な問題は、歪みを使用したテキストの配置で検討されています。

評価シーケンス - 直接複数画像マージ方法

"-evaluate-sequence" メソッドは、同じサイズの複数の画像を非常に特定の方法でマージするように設計されています。ある意味では、評価および関数演算子と、上記で見てきた複数画像合成手法を組み合わせたものです。提供されているメソッドの多くは、通常の複数画像レイヤー合成手法を使用して実行できますが、すべてではありません。演算子は "-evaluate" と同じメソッドを使用するため、 "-list Evaluate" を使用してリストを取得できます。ただし、これらのいくつか(「Mean」や「Medium」など)は、この演算子と組み合わせて使用​​する場合にのみ役立ちます。

複数画像の平均値

基本的に、古い "-evaluate-sequence mean" と新しい "-evaluate-sequence mean" はどちらも、提供されたすべての画像の平均を作成します。たとえば、バラの画像のすべての反転および反転バージョンを使用した平均を次に示します。

  magick rose: -flip rose: \( -clone 0--1 -flop \) \
          -evaluate-sequence mean  average.png
[IM Output]
同じ固定シーンの何百もの画像の平均化は、移動する人々などのほとんどの一時的な効果を削除して、重要度を下げるために使用できます。ただし、一時的な効果がたくさんある領域には、「幽霊のようなぼかし」が残っている可能性があり、削除するのが非常に難しい場合があります。ビデオシーケンスは個々のフレームを見ると非常にノイズが多いため、連続しているが変化のない複数のフレームを平均化して、よりクリーンで鮮明な結果を作成できます。アリゾナ大学のマット・リーは、この手法を使用して顕微鏡画像の解像度を向上させたと報告しています。彼は同じ「ターゲット」の複数の画像を撮影し、それらをすべて平均化して、結果の信号対雑音比を向上させます。彼は、他の人もこの目的のために役立つかもしれないと示唆しています。2つの画像を平均化する別の方法として、 "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」メソッドは、一連の画像から最大(明るい)値と最小(暗い)値を取得します。繰り返しますが、これらは基本的に明るくするおよび暗くする合成方法を使用することと同じですが、複数の画像を使用します。背景キャンバスの色を適切に選択することで、同等の合成方法でフラット化演算子を使用できます。

  magick rose: -flip rose: \( -clone 0--1 -flop \) \
          -evaluate-sequence max  max.png
[IM Output]

  magick rose: -flip rose: \( -clone 0--1 -flop \) \
          -evaluate-sequence min  min.png
[IM Output]
警告:これはピクセルの選択(強度による)ではなく、値の選択です。つまり、出力画像では、異なる画像からの個々の赤、緑、青の値が得られる可能性があり、入力画像のいずれにも見つからない新しい色が生成される可能性があります。強度によって最大/最小で選択されたピクセルが必要な場合は、強度による明るくする合成方法を参照してください。

強度による中央ピクセル

-evaluate-sequence Median」は、指定されたすべての画像から、輝度が中央値のピクセルを探します。つまり、各位置について、各画像からピクセルの輝度を収集してソートします。そして、シーケンスの中央に位置するピクセルを選択します。これは、画像のコレクションのピクセルを単純に平均化する代わりに使用することもできます。これは、例えば、画像を上下2つの「制限」画像と組み合わせることで使用できます。ピクセルは中央の輝度になるので、元の画像のピクセルか、「制限」画像のピクセルのいずれかになります。言い換えれば、これを使用して元の画像の輝度を「クリップ」することができます。奇妙ですが、事実です。画像数が偶数の場合は、中央より明るい側のピクセルが選択されます。そのため、画像が2つしかない場合、この演算子はピクセル単位の「輝度による明るくする」ことに相当します。重要な点は、各ピクセルが完全に1つの画像から取得され、輝度によってソートされることです。各ピクセルの正確な色は、指定された画像のいずれかから完全に取得されるため、新しい色は生成されません。たとえば、すべての反転およびフロップバージョンを使用して、バラ画像の中央値輝度のピクセルを示します。ピクセルの輝度に基づいているため、滑らかではなく、鋭い境界が得られる可能性があることに注意してください。

  magick rose: -flip rose: \( -clone 0--1 -flop \) \
          -evaluate-sequence median  median.png
[IM Output]

複数の画像を追加する

Add」メソッドは、もちろんすべての画像を単純に加算します。

  magick ... -evaluate-sequence add ...
これは、Flattenを使用してすべての画像をPlus Composeするよりも高速な(より直接的な)バージョンです...

  magick ... -background black -compose plus -layers flatten ...
この方法で画像を追加すると、画像の量子範囲を簡単にオーバーフローさせる可能性があり、HDRIバージョンのIMを使用しない限り、「クリップ」される可能性があることに注意してください。そのため、代わりに平均またはMeanが一般的に使用されます。これは、結果の画像がクリップされないように、すべての画像を均等に分割するためです。もう1つの代替手段は、新しいPoly Operatorを使用することです。これは、各画像に個別に重み付けできます。

複数の画像を減算する

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の場合と同様に、最終的な画像は最初の画像(およびそのサイズとその他のメタデータ)から生成されます。例えば...

  magick rose: granite: null: -poly '1,1 2,1 -1.0,0' poly_rose.png
[IM Output]
これは、「rose:」(重み1とべき乗1を使用して変更なし)を取得し、これに「granite:」画像のカラー値の2倍(重み= 2)を追加し、最後に「null:」画像を使用して、指数0(画像入力を無視)と重み付け値-1.0を使用して値1を減算します。結果の画像は、次のようになります。
rose + 2.0*granite - 1.0
または
rose + 2.0*(granite-0.5)
言い換えれば、バラの画像にはノイズの多い花崗岩のテクスチャオーバーレイ(50%グレーのバイアスあり)が与えられます。これは実際には、非常に強い「Hard_Light」合成照明効果とまったく同じですが、花崗岩オーバーレイの重み付けが非常に明確です。他の複数画像操作との主な違いは、各画像に個別に重み付けできることですが、追加の中間画像を必要とせずに、すべての計算を単一の画像処理操作で実行できることです。これにより、非HDRIバージョンのImagMagickでは、量子丸め、クリッピング、または最終結果に対するその他の影響が回避されます。(量子効果を参照)。たとえば、小さな画像グループの平均化、次にそれらのグループの平均化など、多数の画像の加重平均を実行するために使用できます。