1. ホーム
  2. image

[解決済み] Matlabでアフィン変換

2022-02-14 17:29:14

質問

質問ですが、アフィン変換で乗算(回転、拡大縮小、y軸の剪断、x軸の剪断、並進)を行って、以下の式にする必要がある場合。

次のコードは、上記の式を正しく実装したものでしょうか?

rotation=[cos(theta) sin(theta) 0; -sin(theta) cos(theta) 0; 0 0 1];
scaling=[lamdax 0 0; 0 lamda2 0; 0 0 1];
shearingY=[1 0 0; alphay 1 0; 0 0 1];
shearingX=[1 alphax 0; 0 1 0; 0 0 1];
translation=[1 0 0; 0 1 0; dx dy 1];
T=rotation*scaling*shearingY*shearingX*translation;
T = maketform('affine',T);
I2_hat=imtransform(I2,T);

ありがとうございました。

どのように解決するのですか?

はい、そうです......しかし......あなたは 必須 翻訳を <強い 最後の のステップになります。 回転や剪断などの操作は これが行われることを前提にしています 原点 . そのため、必要なすべての操作を行い、変換行列を使用した後に変換した画像を移動します。 最初に平行移動した場合(元の変換行列で行っていたように)、他のすべての変換は、原点を基準としてこれらを実行しており、平行移動のために原点が移動していると仮定しています。 したがって、平行移動後の点は、原点を基準にしているとみなされます。 (0,0) であり (dx,dy) であるため、それ以外の操作が正しく行われないことになります。

になるように翻訳を移動させるだけです。 フロント という表現があります。

T = translation*rotation*scaling*shearingY*shearingX;

この結果、翻訳が最後に実行されるようになり、それはあなたが望むことです。 残りの変換は、どこにも移動させる必要はありません。 これらはすべて独立した変換なので、どのような順序でもかまいません。翻訳は最後まで残しておかなければなりません。


マイナーノート

maketformimtransform は現在非推奨です。 可能な限り affine2d の代わりに maketform imwarp の代わりに imtransform .