【问题标题】:Affine transformation in matlabmatlab中的仿射变换
【发布时间】:2016-01-07 18:21:54
【问题描述】:

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

非常感谢您

【问题讨论】:

    标签: image matlab image-processing affinetransform


    【解决方案1】:

    是的……但是……您必须将翻译作为最后一个步骤。旋转、剪切和其他操作假定这是在原点完成的。因此,请执行您想要的所有操作,然后在使用您的平移矩阵后移动转换后的图像。如果您首先翻译(就像您在原始变换矩阵中所做的那样),所有其他变换都假定您正在相对于原点执行这些变换,并且该原点由于翻译而移动。因此,翻译后的点将被假定为相对于原点(0,0),而不是(dx,dy)所在的位置,因此其余操作将不正确。

    只需移动翻译,使其位于表达式的前面,而不是末尾:

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

    这样做的结果是翻译将在最后执行,这就是您想要的。您无需将其余的转换移动到任何地方。这些可以按任何顺序排列,因为它们都是独立的转换。您必须将翻译留到最后。


    小提示

    maketformimtransform 目前已弃用。如果可能,请使用affine2d 代替maketformimwarp 代替imtransform

    【讨论】:

    • 问题是我使用的 MATLAB 2008 不支持 affine2d 和 imwarp。 maketransform 和 imtransform 函数有什么问题?他们会产生错误的结果吗?而对于T,提示的变换顺序是对还是应该是:T=translation*shearingX*shearingY*scaling*rotation;
    • 正如我所说...只需将翻译移到开头即可。其余的都很好。但是,对于其余的转换,它可以是任何顺序,因为它们都是独立的转换。您必须将翻译留到最后。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2018-09-07
    • 2013-07-04
    相关资源
    最近更新 更多