我的问题是,如果我需要执行一个仿射变换,涉及乘法(旋转,缩放,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 :(得分:1)
是的确如此......但是必须使翻译成为最后步骤。旋转,剪切和其他操作假设这是在原点处完成的。这样,执行所需的所有操作,然后在使用翻译矩阵后移动变换后的图像。如果您首先进行翻译(就像您在原始变换矩阵中所做的那样),则所有其他变换都假设您正在执行这些变换,并且原点因翻译而移动。因此,翻译后的点将被假定为原点(0,0)
而不是(dx,dy)
,因此其余操作将不正确。
只需移动翻译,使其位于表达式的前面,而不是最后:
T = translation*rotation*scaling*shearingY*shearingX;
这样做的结果是最后会执行翻译,这就是你想要的。其余的转换你不需要将它们移动到任何地方。这些可以是任何顺序,因为它们都是独立的变换。你必须将翻译留到最后。
maketform
和imtransform
目前已被弃用。如果可能,请使用affine2d
代替maketform
和imwarp
代替imtransform
。