3

Jan Erik Solem によるProgramming Computer Vision with Pythonを読んでいますが、これはかなり良い本ですが、画像登録に関する質問を明確にすることができませんでした。

基本的に、少し位置合わせする必要がある画像 (顔) がたくさんあるので、最初に必要なのは相似変換を介して厳密な変換を実行することです。

x' = | sR t | x
     | 0  1 |

ここで、x はベクトル (この場合は座標のセット) であり、回転 R、平行移動 t、場合によってはスケーリング s によって x' に変換されます。

Solem は、回転行列 R と並進ベクトルを tx と ty として返す各画像のこの剛体変換を計算します。

R,tx,ty = compute_rigid_transform(refpoints, points)

ただし、彼は何らかの理由で R の要素を並べ替えます。

T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]])

その後、アフィン変換を実行します。

im2[:,:,i] = ndimage.affine_transform(im[:,:,i],linalg.inv(T),offset=[-ty,-tx])

この例では、このアフィン変換が各チャネルで実行されますが、それは関係ありません。im[:,:,i]は処理するイメージで、このプロシージャは別のイメージを返します。

Tアフィン変換でその行列を逆にするのは何ですか?なぜですか? そして、画像登録を達成するための通常の手順は何ですか?

アップデート

ここでは、Google ブックスでこのコードの関連部分を見つけることができます。67ページの下から始まります。

4

2 に答える 2

1

私にはコードのエラーのように見えます。Tの転置のように見えますがR、回転行列の場合は逆行列と同じです。次に、 への呼び出しで (再び) 逆を行いますndimage.affine_transformTまたはlinalg.inv(R)その関数に渡す必要があると思います。

于 2012-10-21T20:31:33.093 に答える
0

あなたの質問に答えて、本の間違い (?) を指摘しようと思います。(1) T = array([[R[1][1], R[1][0]], [R[0][1], R[0][0]]) を使用する理由 R,tx,ty = compute_rigid_transform(refpoints, points) は回転行列と変換を次の形式で計算するためです。

|x'| = s|R[0][0] R[0][1]||x| + |tx|             Equation (1)
|y'|    |R[1][0] R[1][1]||y|   |ty|

ただし、 OUT = ndimage.affine_transform(IN,A,b) には、(x,y) の順序ではなく、(y,x) の形式の座標が必要です。したがって、上記の式 (1) は次のようになります。

|y'| = s|R[1][1] R[1][0]||y| + |ty| = T|y| + |ty|        Equation(2)
|x'|    |R[0][1] R[0][0]||x|   |tx|    |x|   |tx|

次に、関数 ndimage.affine_transform() では、行列は linalg.inv(R) ではなく、linalg.inv(T) になります。

(2) アフィン変換 OUT = ndimage.affine_transform(IN,A,b) は実際には A*OUT + b => IN です。式 (2) に従って、次のように書き換えます。

|y| = inv(T)|y'| - inv(T)|ty|
|x|         |x'|         |tx|

したがって、関数 ndimage.affine_transform() のオフセットは [-ty -tx] ではなく、inv(T)[-ty, -tx] です。これは元のコードのバグだと思います。

于 2013-01-27T02:59:54.967 に答える