Matlab图像变换(affine2d,projective2d)排序

时间:2019-07-03 16:29:57

标签: matlab image-processing

在下面的MWE代码中(取自Matlab documentation),T给出了R后跟T*R的转换,而不是大多数情况下的R*T计算机图形学或视觉教科书。

    cb = checkerboard(4,2);
    cb_ref = imref2d(size(cb));
    background = zeros(150);
    imshowpair(cb,cb_ref,background,imref2d(size(background)))

    T = [1 0 0;0 1 0;100 0 1];
    tform_t = affine2d(T);
    R = [cosd(30) sind(30) 0;-sind(30) cosd(30) 0;0 0 1];
    tform_r = affine2d(R);

    TR = T*R; % This line
    tform_tr = affine2d(TR);
    [out,out_ref] = imwarp(cb,cb_ref,tform_tr);
    imshowpair(out,out_ref,background,imref2d(size(background)))

如果我们想先通过x然后通过x'将图像T转换为R,我们不应该做x'=R(T(x))=R*T*x吗?

从代码中,tt在我看来是我们正在做x'=T*R*x。这是没有意义的,因为输出实际上在做x'=R*T*x。文档中没有解释此行为。

转换前:

before

转换后:

enter image description here

1 个答案:

答案 0 :(得分:0)

这是因为Matlab使用了不同的约定。他们执行x'=T*x等于transpose(x')=transpose(T*x)而不是计算transpose(x)*transpose(T)。由于变换矩阵现在为RIGHT-MULTIPLIED,因此顺序也发生了变化。现在,第一个转换位于左侧。 (该函数的输入参数已经是transpose(T),而不是T。)

除了affine2dprojective2d之外,由cameraMatrix创建的投影矩阵也被转置-它的形状为4x3而不是传统的3x4

我不确定他们为什么要这样做,here可以找到一些讨论。我真的希望他们能在imwarpprojective2d等文档中更好地解释/指出这一点。我花了几个小时才弄清楚。