15

プロジェクトでは、DVD ケースの前面テンプレートに合わせて画像の遠近歪みを作成しようとしています。したがって、ImageMagick (CLI) を使用してこれを自動化したいのですが、この変換の数学的側面を理解するのに苦労しています。

convert \
  -verbose mw2.png \
  -alpha set \
  -virtual-pixel transparent \
  -distort Perspective-Projection '0,0 0,0   0,0 0,0' \
   box.png

このコードは空の座標セットです。ドキュメントをよく読みましたが、どのパラメータがどのポイントを表しているのか理解できないようです。ドキュメントには変数と名前が記載されていますが、それらが実際に何を意味するのかわかりません (おそらく数学の首謀者にとってはより便利です)。したがって、私が何をしているのかわからないので、誰かがこの件について私に説明してくれたら (視覚的に好まれるか、有用な情報へのリンクを教えてください)。パラメータをいじるだけでは、この仕事はうまくいきません。これらのポイントを計算する必要があります。

ここでは、(CLI ツールを使用して) 私が達成しようとしていることの簡単なイメージを見つけることができます。

入力例の画像

アップデート:

   convert \
        -virtual-pixel transparent \
        -size 159x92 \
        -verbose \
        cd_empty.png \
        \(mw2.png -distort Perspective '7,40 4,30   4,124 4,123   85,122 100,123   85,2 100,30'\) \
         -geometry +3+20 \
        -composite cover-after.png

出力として私に与えます:

cd_empty.png PNG 92x159 92x159+0+0 8-bit sRGB 16.1KB 0.000u 0:00.000
convert: unable to open image `(mw2.png': No such file or directory @ error/blob.c/OpenBlob/2641.
convert: unable to open file `(mw2.png' @ error/png.c/ReadPNGImage/3741.
convert: invalid argument for option Perspective : 'require at least 4 CPs' @ error/distort.c/GenerateCoefficients/807.
convert: no images defined `cover-after.png' @ error/convert.c/ConvertImageCommand/3044.

Kurt Pfeifle による訂正:

ImageMagick で要求されるように、両側の (少なくとも 1 つの) 空白で区切り文字\(と区切り文字を囲んでいないため、このコマンドには構文エラーがあります。\)

ソース イメージへのリンクが提供されていないため、この修正されたコマンドの結果をテストすることはできません。

   convert                         \
        -virtual-pixel transparent \
        -size 159x92               \
        -verbose                   \
         cd_empty.png              \
           \(                      \
           mw2.png -distort Perspective '7,40 4,30  4,124 4,123  85,122 100,123  85,2  100,30' \
           \)                      \
        -geometry +3+20            \
        -composite                 \
         cover-after.png
4

1 に答える 1

22

ImageMagick の歪みアルゴリズムの非常に詳細な説明を見ましたか? イラストもかなりの量で付いてきます。

サンプル画像を見ると、 Four Point Distortion Methodを使用してそこに到達できると思います。

もちろん、0,0 0,0 0,0 0,0パラメーターを使用して指定した例では、希望どおりの結果が得られません。

ImageMagick で利用可能な歪みメソッドの多くは、次のように機能します。

  • この方法では、コントロール ポイントのペアのセットを使用します。
  • 値は数値です (整数だけでなく、浮動小数点の場合もあります)。
  • コントロール ポイントの各ペアは、ピクセル座標を表します。
  • 4 つの値の各セットは、ソース イメージ座標を表し、その直後に宛先イメージ座標が続きます。
  • 各ソース イメージ コントロール ポイントの座標を、それぞれのパラメーターで指定されたとおりに、それぞれの宛先イメージ コントロール ポイントに転送します。
  • 指定された歪み方法に従って、他のすべてのピクセルの座標を転送します。

例:

S x1 ,S y1 D x1 ,D y1   S x2 ,S y2 D x2 ,D y2   S x3 ,S y3 D x3 ,D y3   ... S xn ,S yn D xn ,D yn  

xX座標を表すために使用されます。
yY 座標を表すために使用されます。
123、 ...nは、1 番目、2 番目、3 番目、... n 番目のピクセルを表すために使用されます。
Sここでは、ソース ピクセルに使用されます。
Dここでは宛先ピクセルに使用されます。

最初: メソッド-distort perspective

歪みメソッドperspectiveは、ソース画像の直線が宛先画像でも直線のままであることを確認します。他の方法は、好むと好まざるとにbarrelかかわらbilinearforwardず、直線を曲線に歪めます。

には、少なくとも4 つの事前計算されたピクセル座標のペアの-distort perspectiveセットが必要です(最後のペアはゼロの場合があります)。ピクセル座標のペアが 4 つを超えると、より正確な歪みが得られます。たとえば、次のように使用した場合:

-distort perspective '1,2  3,4     5,6  7,8     9,10  11,12     13,14  15,16'

(読みやすさの理由から、必要以上にマッピング ペアの間に {optional} 空白を使用する) とは、次のことを意味します。

  1. ソース イメージから座標 (1,2) のピクセルを取得し、それを宛先イメージの座標 (3,4) にペイントします。
  2. ソース イメージから座標 (5,6) のピクセルを取得し、それを宛先イメージの座標 (7,8) にペイントします。
  3. ソース イメージから座標 (9,10) のピクセルを取得し、それを宛先イメージの座標 (11,12) にペイントします。
  4. ソース イメージから座標 (13,14) のピクセルを取得し、それを宛先イメージの座標 (15,16) にペイントします。

垂直線 (建物の壁の角など) がまったく垂直に見えない写真画像を見たことがあるかもしれません (スナップを撮るときにカメラが傾いているため)。メソッド-distort perspectiveはこれを修正できます。

元の写真の「正しい」遠近法で表示される建物の 1 つの面を「まっすぐにする」または「修正する」などのことを達成することもできます。

元の画像 ==> 歪んだ画像

この歪みに使用されるコントロール ポイントは、元の画像の上に描画された赤 (ソースコントロール) と青の四角形 (宛先コントロール) の角によって示されます。

ソース管理点: 「赤」の角 ==> 目的地のコントロール ポイント: 「青」の角

この特定の歪みを使用

-distort perspective '7,40 4,30   4,124 4,123   85,122 100,123   85,2 100,30'

コピー アンド ペーストを楽しむための完全なコマンド:

convert                                                                      \
  -verbose                                                                   \
   http://i.stack.imgur.com/SN7sm.jpg                                        \
  -matte                                                                     \
  -virtual-pixel transparent                                                 \
  -distort perspective '7,40 4,30  4,124 4,123  85,122 100,123  85,2 100,30' \
   output.png

2番目: メソッド-distort perspective-projection

この方法-distort perspective-projectionは、より理解しやすい方法から派生していperspectiveます。とまったく同じ歪みの結果が得-distort perspectiveられますが、パラメーターとして (少なくとも) 4 組の座標値 (少なくとも 16 個の整数) を使用せず、8 つの浮動小数点係数を使用します。

それは使用しています...

  1. 正確に 8 つの事前計算された係数のセット。
  2. これらの各係数は浮動小数点値です (値として整数-distort perspectiveのみが許可されるとは異なります)。
  3. これらの 8 つの値は、次の形式の行列を表します。

     sx   ry   tx
     rx   sy   ty
     px   py

    これは、次の式に従ってソース ピクセルからデスティネーション ピクセルを計算するために使用されます。

    X-of-destination = (sx*xs + ry+ys +tx) / (px*xs + py*ys +1)
    Y-of-destination = (rx*xs + sy+ys +ty) / (px*xs + py*ys +1)
    
    (TO BE DONE -- 
        I've no time right now to find out how to
        properly format + put formulas into the SO editor)
    

再利用可能な -distort perspective-projection メソッドに必要な 8 つの係数の (より難しい) 計算を避けるために、次のことができます...

  • 最初に、(より簡単に) の座標を計算します -distort perspective
  • 2番目に、パラメータを追加してこれ-distort perspective 実行し、-verbose
  • 最後に、 stderr に出力された出力から 8 つの係数を読み取ります

(上で引用した) 完全なコマンド例は、次の情報を吐き出します:

Perspective Projection:
  -distort PerspectiveProjection \
    '1.945622, 0.071451, -12.187838, 0.799032, 
     1.276214, -24.470275, 0.006258, 0.000715'
于 2012-09-05T09:47:16.710 に答える