ImageMagickの例 --
画像のワーピング
- 目次
-
ImageMagickの例 前書きと目次
-
簡単な画像ワーピング (ピクセル順序の並べ替え)
- 画像の反転とミラーリング
- 転置と転回、対角線
- 長方形の回転
- 画像のローリング (壊れたテレビのように)
- 簡単な画像ワーピングの概要
-
回転とシアリング
-
円形ワーピング
-
アニメーション (楽しい例)
簡単な画像ワーピング
簡単な画像ワーピング演算子は、画像のピクセルを並べ替えるだけです。ピクセル数や画像のサイズさえも同じままです。重要な機能は、画像が情報を失わず、並べ替えられただけであり、品質を損なうことなく(保存時のJPEGのような不可逆圧縮を除く)非常に簡単に元に戻せることです。基本的には、元の画像の内容を破壊したり、上書きしたり、コピーしたり、色をマージしたり、その他の方法で変更したりすることなく、ピクセルを並べ替えるだけです。画像内のピクセル位置を移動するだけです。![[IM 出力]](../images/koala.gif)
反転とミラーリング
これらの例では、このかわいいコアラの画像を使用しましょう...最も簡単な画像の歪みは、画像のピクセルを並べ替えて「-flip 」で上下逆さまにすることです。
|
![]() |
または、「-flop 」を使用すると、鏡像を生成できます。
|
![]() |
![]() ![]() |
IM v6.6.6-5より前は、「-flip 」と「-flop 」の両方の演算子は、存在する可能性のあるより大きな仮想キャンバスに対する画像の仮想キャンバスオフセットを変更しませんでした。 |
転置と転回、対角線
「-transpose
」と「-transverse
」の画像操作は、画像の対角線ミラーを生成します。「-transpose 」は、画像の左上から右下への対角線に沿って画像をミラーリングします。
|
![]() |
一方、「-transverse 」は、画像の左下から右上への対角線に沿って画像をミラーリングします。
|
![]() |
![]() ![]() |
IM v6.6.6-5より前は、「-transpose 」と「-transverse 」の両方の演算子は、存在する可能性のあるより大きな仮想キャンバスに対する画像の仮想キャンバスオフセットを変更しませんでした。 |
長方形の回転
上記に示した4種類の操作はすべて、基本的に元の画像の鏡像を生成します。「-rotate
」演算子は、元の画像自体を含む、画像のミラーリングされていない他のバージョンを提供します。
magick koala.gif -rotate 0 rotate_0.gif magick koala.gif -rotate 90 rotate_90.gif magick koala.gif -rotate 180 rotate_180.gif magick koala.gif -rotate -90 rotate-90.gif magick koala.gif -rotate 360 rotate_360.gif |
![[IM Output]](rotate_0.gif)
![[IM Output]](rotate_90.gif)
![[IM Output]](rotate_180.gif)
![[IM Output]](rotate-90.gif)
![[IM Output]](rotate_360.gif)
-rotate
」は、回転角度が90度の倍数である場合にのみ、単純な歪みであることに注意してください。他の角度では、画像に他のより複雑なピクセルレベルの歪みが導入されます。以下の回転を参照してください。![]() ![]() |
回転の正の角度は時計回りであることに気付くかもしれません。これは論理的に正しくないように思われます。ただし、内部的には数学的に正しく、Y軸が否定されていることに起因します。つまり、Y軸は上部の0から下向きに正になります。このため、座標系が逆になり、したがって回転角度も数学的に逆になります。 |
![]() ![]() |
デジタル写真は、「-auto-orient 」演算子を使用することにより、記録されたカメラの向きに合わせて回転させることもできます。これはIM v6.2.7-8で追加されました。 |
壊れたテレビのような画像のローリング
画像を水平方向に「-roll 」することもできます(同期がずれているテレビのように)。ロールの量(画像の変位)はピクセル単位で指定されます。
|
![]() |
もちろん、画像を横にロールすることもできます...
|
![]() |
または、負のピクセル数を使用すると、逆方向にロールできます。
|
![]() |
-tile-offset
」設定が定義するものであり、「-tile
」オプションでタイル画像を読み込むときに適用するロールの量です。簡単な画像ワーピングの概要
これらの演算子すべての最も重要な点は、結果がまったく操作を実行しなかったかのように正確になるように、さまざまな方法でそれらをすべて一緒に追加できることです。
|
![]() |
回転とシアリング
単純な歪み演算子(上記)は画像のサイズと色を保持しますが、次のセットはそうではありません。これらの演算子の結果は、元のサイズ、さらには画像の元のラスターグリッドにも収まりません。画像の回転 --簡単な画像の回転
上記のように、「-rotate
」演算子は、画像を90度単位で回転させる場合、単純で画像を保持する歪みを実行できます。ただし、他の角度では、回転した画像は長方形の画像にうまく収まりません。したがって、画像データが失われないように、回転した画像を収容するのに十分な大きさになるように、最終的な画像のサイズが拡大されます。
|
![]() |
ImageMagickによって追加された余分なスペースは、現在の「-background 」色の設定で色付けされます。これにより、角に塗りつぶす色を指定できます。
|
![]() |
もちろん、透明色で塗りつぶしたい場合は、画像が透明度を処理できることを確認する必要があります(アルファチャネルの追加を有効にすることにより)、透明度を処理できる画像形式で保存する必要があります。
|
![]() |
![]() ![]() |
バージョン6.1.2より前は、「-rotate 」は透明度を正しく処理せず、回転した画像の角に黒と透明のストライプを生成していました。この問題の回避策はかなり複雑で、アルファチャネルを色とは別に回転させる必要がありました。 |
-crop
」を使用して画像を元のサイズに戻すことができます。元のサイズがわからない場合は、アルファ合成トリック(「Src
」合成メソッドを参照)を使用して、画像を元のサイズに戻すことができます。
|
![]() |
-rotate
」演算子は、2つの追加フラグも理解します。 '>
'記号が回転引数に追加された場合(数値の前または後)、画像が高さよりも広い場合にのみ、画像が回転します。つまり、「90>
」は、すべての画像が「縦長」スタイルになるように、「横長」スタイルの画像のみを「縦長」スタイルに回転させます。もう1つのフラグ'<
'は逆の操作を行い、幅よりも高い画像のみを回転させます。たとえば、「90<
」は、すべての画像が「横長」であることを確認します。このフラグのもう1つの用途は、「縦長」および「横長」の画像を異なる量で回転させることです。つまり、「縦長」をある方向に回転させ、「横長」を別の方向に回転させるように、2つの異なる「-rotate
」操作を実行できます。デジタル写真は、「-auto-orient
」演算子を使用することにより、画像のカメラの向き(画像のEXIFメタデータに基づく)に合わせて回転させることもできます。ただし、JPEG形式で保存し直すことはお勧めできないことに注意してください。回転演算子の内部構造
IMv7.7.3-4の時点で、回転演算子は歪み演算子とスケール-回転-並進(SRT)歪みを使用するようになりました。これが、基礎となるSRT歪みを使用した、より直接的な回転です。
|
![]() |
または、歪み演算子の「+」バージョンを使用して、キャンバスサイズを調整します。
|
![]() |
画像のシアリング --線形変位
「-shear
」演算子は、ピクセルの各行(または列)をスライドさせて、各行(または列)が隣接する行(または列)に対して同じ量だけ変位するようにします。その2つの引数は、角度で与えられます。「-rotate
」と同様に、この操作では、情報を失わないように結果の画像のサイズが大きくなります。ただし、シアリングは実際には二重操作であるため、より複雑です。
magick koala.gif -background Blue -shear 20 shear_rot.gif magick koala.gif -background Blue -shear 20x0 shear_x.gif magick koala.gif -background Blue -shear 0x50 shear_y.gif magick koala.gif -background Blue -shear 20x50 shear_xy.gif magick koala.gif -background Blue -shear 20x0 -shear 0x50 shear_xy2.gif magick koala.gif -background Blue -shear 0x50 -shear 20x0 shear_yx.gif |
![[IM Output]](shear_rot.gif)
![[IM Output]](shear_x.gif)
![[IM Output]](shear_y.gif)
![[IM Output]](shear_xy.gif)
![[IM Output]](shear_xy2.gif)
![[IM Output]](shear_yx.gif)
-shear
」(4番目の画像)は、実際には最初にXシアリングを行い、次にYシアリングを行う(適切な画像のトリミング付き)のと同じです(5番目または最後から2番目の画像に表示)。シアリングの順序によって結果が異なることに注意してください。引数に「x
」がない1つの数値のみが指定されている場合(最初の画像のように)、「-shear
」は、貧弱な回転のようなものとして、X方向とY方向の両方に適用します。「-background 」色の設定は、もちろん、追加された余分なスペースの色として使用されます。
|
![]() |
![]() ![]() |
IMバージョン6.1.2より前では、「-shear 」は透明度を処理しませんでした。この問題の回避策はかなり複雑で、アルファチャネルを色とは別にシアリングする必要がありました。 |
-shear
」を使用することは、画像を回転させるための正しい方法ではないことに注意してください。実際にシアリングを使用して画像を適切に回転させるには、「-shear {X}x{Y} -shear {X}x0 -crop ...
」の形式で複数のシアリング操作を実行する必要があります。ただし、「{X}
」、「{Y}
」、および最終的なトリミングに適切な値を求めるには、三角法が必要です。「回転演算子」は、実際にはこの方法で実装されていました。この操作を行うためのAPI関数はまだ利用可能ですが、コマンドラインからは利用できなくなりました。![]() ![]() |
X方向にシアリングしても画像の高さには影響せず、Y方向にシアリングしても画像の幅には影響しないことに注意してください。その結果、画像内のオブジェクトによってカバーされる領域は変化しません(画像を保持する周囲のコンテナのみ)。 |
![]() ![]() |
シアリング演算子は、ソース画像の直接的な「ワーピング」(個々の行と列のピクセルのみを歪ませる)として実装されます。その結果、補間設定または仮想ピクセル設定は使用されません。 結果として、画像に追加された領域は現在の「 -background 」色のみで塗りつぶされ、画像の元の色を保持する方法は提供されていません。 |
シアリングを使用した等角投影立方体
シアリングは、使用するのに最も素晴らしくも単純でもない演算子ですが、それによって凝ったことができないという意味ではありません。以下は、「-shear
」を使用して等角投影の立方体を作成する例です。Using IM under Windowsの貢献で作成した同様のWindowsバッチの例から開発されました。上記の画像は正しく結合されていないことに注意してください。プラスアルファ合成を使用する必要がありますが、代わりにオーバーを使用しています。詳細については、マスクされた2つの画像を位置合わせするを参照してください。その結果、3つの画像を正しく位置合わせする際に、ギャップや画像の重複が発生する可能性があります。位置合わせが整数位置合わせに制限されているため、この問題は特に深刻になる可能性があります。より管理しやすい座標で、数学を少しごまかして、はるかに大きなサイズを使用すると、この場合に役立ちます。画像を結合した後、結果を最終サイズに縮小すると、結合に沿ったわずかなずれがシャープになり、クリーンアップされます。同様の別の例ですが、アフィン歪みを使用し、正しいアルファ合成を使用すると、アフィンレイヤーを使用した3Dキューブです。上記のようなキューブを生成するために必要な画像処理を大幅に簡略化する方法です。画像を波状にする - 正弦波変位
「-wave 」演算子は、画像に「線形変位」を追加するという点で「-shear 」に似ています。ただし、この演算子は、正弦波関数に従ってピクセルの列を垂直方向にのみ変位させます。「-wave 」演算子には2つの引数があります。1つ目は、ピクセルが上下に変位する最大高さまたは振幅であり、2つ目はピクセル単位の正弦関数の波長です。
|
![]() |
ピクセルは指定された振幅まで変位できるため、そのスペースが実際に必要ない場合でも、画像の上下に必ずそれだけの余分なスペースが追加されることに注意してください。たとえば、波長が画像の幅の2倍になるように引数を調整することで、画像を円弧にすることができます。
|
![]() |
この場合、「-chop 」、「-shave 」、または場合によっては「-trim 」操作を使用して、未使用のスペースを削除できます。負の振幅を使用して円弧を反転させ、「-chop 」を使用して、「-wave 」演算子が追加した未使用のスペースを削除することで、前の例をクリーンアップしてみましょう。
|
![]() |
もちろん、「-background 」色の設定を使用して、画像に追加された余分なスペースを定義できます。
|
![]() |
上記の例からわかるように、「-wave 」は垂直方向または「Y」方向にのみ適用されます。X方向に波を追加する場合は、波を適用する前後に画像を回転させる必要があります。
|
![]() |
-wave
」のもう1つの制限は、波がゼロからのみ開始することです。つまり、左端の列は変位せず、次のいくつかの行は、(正のX方向)に下向きに変位します。ただし、初期の垂直オフセットに負の振幅を与えない限り。基本的に、「-wave 」演算子では、(現時点では)正弦関数の開始オフセットを指定することはできません。ただし、これは「-splice 」を使用して画像のオフセットを追加してから削除することで修正できます。
|
![]() |
-wave
」は、追加された領域の色を定義するために現在の仮想ピクセル設定を利用しませんが、現在の補間設定を調べて、ソースから生成された画像に色をマッピングします。これは、波が画像全体に垂直な帯でピクセルをわずかにぼかす傾向があることを意味します。円形の歪み
これまでの画像歪みは、画像のデータをわずかにストレッチ、拡大、または圧縮した程度であり、かなり穏やかなものでした。つまり、データはかなりそのままです。これらの次のいくつかの画像演算子を使用すると、元の画像が決定できないほど歪んだ画像になる可能性があります。色がぼやけた混乱にねじれています。また、これらの歪み効果は、画像の端で元の画像の歪みがほとんどない円形の領域に制限されます。つまり、領域演算子を使用してより小さな領域でこれらの演算子を使用できます。その結果は、切り取られ、歪められて、元の場所に貼り付けられたように見えずに、元の画像にブレンドされます。つまり、これらの演算子は、「ローカル」歪みとして知られています。これは、画像のより小さな領域を歪ませるために使用できるためです。画像のインプロージョン
「-implode 」演算子は、すべてのピクセルを中心に向かって引き寄せるように画像を歪ませます。それは、画像の中心に真空または「ブラックホール」を貼り付けて、ピクセルをそこに吸い込んでいるようなものです。ただし、最初は非常に小さい値のみを使用し、目的の結果が得られるまで徐々に値を増やすことをお勧めします。ほとんどの初心者は大きすぎる値を使用する傾向があり、結果に失望します。たとえば、これは一般的な画像の爆縮です...
|
![]() |
値を大きくしていくと、基本的には円内のすべてのピクセルが忘却の彼方に吸い込まれます。
|
![]() |
1.0
」よりも大きい「-implode
」値を使用すると、アルゴリズムが実際の画像自体の境界を超えて色を参照し始めるため、仮想ピクセル設定にも影響を受けることに注意してください。デフォルトでは、「-virtual-pixel
」設定は「edge」であるため、画像のエッジの色または周囲のフレームは結果に大きな影響を与える可能性があります。たとえば、これら2つの画像は同じですが、1つには白い境界線が追加されています。これは、基本的に、画像の適切な範囲を超えて検索された色を使用している領域を示しています。「-virtual-pixel
」設定によって通常定義される領域。
|
![]() ![]() |
Background
」などの異なる仮想ピクセル設定を使用すると、「-border
」を追加した場合と同じ効果が得られますが、画像を拡大することはありません。その他の仮想ピクセル設定は、中央の爆縮領域でより興味深い効果を生み出すことができます。たとえば、「Tile
」設定を使用すると、非常に歪んだ画像のコピーを追加できます。たとえば、この設定を使用して単純なボックス画像を爆縮します...
|
![]() |
-virtual-pixel
」効果については、仮想ピクセルの爆縮効果で調べられています。小さな領域に爆縮されるピクセルの数が増え、爆縮パラメータのサイズが非常に大きくなると、結果は「ピクセル化」されたように見え始めます。より優れた一貫した結果を得るには、スーパーサンプリングと呼ばれる手法を使用して、爆縮が処理するピクセルの数を増やすことができます。基本的には、より大きな画像を使用し(必要に応じてソース画像を拡大)、歪みを適用してから、結果を最終サイズに縮小することで、はるかに優れた結果が得られます。
|
![]() |
インプロードされる画像の周囲に、より大きな「-border 」を使用し、後でそれを再び削除することで、画像の端を内側に向かって中心に歪めることもできます。
|
![]() |
IMバージョン6.2.1以降では、透明な境界線や透明度のある画像を使用することもできます...
|
![]() |
画像のエクスプロージョン
「-implode 」演算子で負の値を使用すると、画像を爆発させることができます。ただし、これは真の爆発というよりも、画像の中心を拡大し、中間半径のすべてのピクセルを端に向かって押し出すようなものです。
|
![]() |
より大きな値を使用すると、基本的に、画像の中心にあるピクセルが、画像の最小寸法の3分の2の大きさの円に拡大されます。
|
![]() |
|
![]() |
渦巻く画像の渦
「-swirl 」演算子は、ケーキミキサーのように機能します。引数として指定した度数で、画像を円状に歪めます。
|
![]() |
境界線を追加し、「-implode 」と組み合わせることで、画像を無に吸い込む渦のような外観を与えることができます。
|
![]() |
アニメーション(楽しい例)
最後に、これらの歪みのいくつかのアニメーションGIFを作成してみましょう。これらについては、アニメーション画像を生成するための簡単なシェルスクリプトを作成しました。これは、独自のテスト画像を使用してダウンロードして試すことができます。ここで重要な点があります。これらの歪みを使用して一連の画像を生成する場合、常に元の開始画像から歪ませる方が、画像を繰り返し増分的に歪ませるよりも優れています。これは、個々の操作では最小限ですが、結果がぼやける回転画像の場合に特に当てはまります。しかし、それを何度も繰り返すと、この結果になります。すべてのスクリプトは、アニメーションを作成するために、「生成された「magick
」コマンド」手法を使用します。つまり、シェルスクリプトが長い単一のコマンドを作成し、それが実行されます。これにより、一時ファイルを作成する必要がなくなりますが、デバッグが難しい場合があります。別の方法は、MIFF画像ストリーミングとして知られる方法を使用することです。これは、ループ内で個々の画像を生成し、最終的な「マージ」コマンドに「パイプ」します。これは、例レイヤー画像のプログラムによる配置および地図上のピンでより明確に示されています。
![]() |
シェルスクリプト「animate_mixer 」では、各フレームは元の画像に「-swirl 」を使用することによって生成されます。渦巻きは一方向にアニメーション化され、次に連続したサイクルを形成するために戻ります。これは実際には、IMにおける非常に典型的なワーピングアニメーションの例です。このバリエーションは、アニメーションを別の類似した画像にアンラップすることです。 |
![]() |
シェルスクリプト「animate_whirlpool 」は、各画像フレームで「-swirl 」を使用するだけでなく、引数のサイズが増加した「-implode 」も使用します。追加されたスペースを示すために「lightblue 」の境界線色を使用しましたが、よりリアルな効果を得るためには、代わりに同じ白い背景色を使用するべきでした。 |
![]() |
画像の中央での爆発(スクリプト「animate_explode 」を参照)。画像は再び拡大され、画像全体が爆発し、最終的な色を定義するために中央に色のついた点が描画されます。 |
![]() |
シェルスクリプト「animate_flex 」を使用すると、「-wave 」関数の振幅を正と負の両方に変更することで、画像の中央が上下に曲げられます。 |
![]() |
シェルスクリプト「animate_flag 」を使用して、「オフセット波」アニメーションを作成し、画像を旗のように波立たせます。アニメーションは、画像の各フレームを垂直方向にオフセットして左端が一定のままになるようにし、おそらく旗竿を追加することによって改善できます。ただし、それにはオフセットを数学的に決定する必要があります。これは難しい場合があります。 |
![]() |
スクリプト「animate_rotate 」は、この回転アニメーションを生成しましたが、上記のように、元の画像サイズを保持するために各フレームを元の画像でトリミングします。
|
![]() |
比較として、デフォルト設定と「-distort SRT {angle} 」コマンドを使用して生成されたコアラの回転を示します。それを生成するために使用するスクリプトは、「animate_distort_rot 」です。この回転方法を使用すると画像がどれほど鮮明になるか、また、前のバージョンで明らかだった回転の「ジッター」がどれほど少ないかに注意してください。 |
ボーナスアニメーションとムービー
![[IM Output]](../images/swirl_video.gif)
-swirl
」歪み演算子を使用した素晴らしいビデオを作成しました。ビデオのフルバージョンをダウンロードするには、右側のGIFアニメーションを選択してください。歪みマップ技術を示す良いビデオを作成できますか?インターネット上のどこかで知っていますか?メールしてください。