matlab中的仿射变换

Affine transformation in matlab

我的问题是,如果我需要执行涉及乘法(旋转、缩放、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);

非常感谢您

是的。您可以按原样保留转换的组合。最后一点,您必须将翻译作为最后步骤。旋转、剪切和其他操作假定这是在 原点 处完成的。因此,执行所需的所有操作,然后在使用平移矩阵后移动转换后的图像。在 MATLAB 中,因为运算是使用预乘而不是 post 乘法执行的,所以转换链应该从左到右出现。如果您要使用 imtransform,则这是必需的。在其他平台上,转换链应该从右到左出现。在这种思维模式下,第一个转换从右边开始,第二个出现在它的左边,依此类推。具体来说,在 MATLAB 中,如果您进行了 N 变换,则最终的变换矩阵应为:

T = T1 * T2 * ... * TN;

在其他平台上,它将是:

T = TN * ... * T2 * T1;

您需要确保最后一个变换 TN 是平移变换。如果您先进行翻译(即进行 T1 翻译变换),则所有其他变换都假定您正在相对于原点执行这些变换,并且原点已因翻译而移动。因此,翻译后的点将被假定为相对于原点 (0,0) 而不是 (dx,dy) 所在的位置,因此其余操作将不正确。

你在这里表现得很好,所以你可以离开它。其余的转换不需要将它们移动到任何地方。这些可以按任何顺序排列,因为它们都是独立的转换。你必须把翻译留到最后。


小注

maketformimtransform 目前已弃用。如果可能的话,使用 affine2d in place of maketform and imwarp 代替 imtransform.