Порядок преобразования изображений Matlab (affine2d, projective2d) - PullRequest
0 голосов
/ 03 июля 2019

В приведенном ниже коде MWE (взятом из документации Matlab ) преобразование 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?

Из кода мне кажется, что вместо этого мы делаем x'=T*R*x.Это не имеет смысла, так как на самом деле вывод x'=R*T*x.Это поведение не объясняется в документации.

До преобразования:

before

После преобразования:

enter image description here

1 Ответ

0 голосов
/ 03 июля 2019

Это потому, что Matlab использует другое соглашение. Вместо вычисления x'=T*x они делают transpose(x')=transpose(T*x), что равно transpose(x)*transpose(T). Поскольку матрица преобразования теперь ПРАВИЛЬНО-МНОЖЕНА, порядок также изменяется. Первая трансформация теперь слева. (Входной аргумент функции уже transpose(T), а не T).

Помимо affine2d и projective2d, их проекционная матрица, созданная cameraMatrix, также транспонируется - она ​​имеет форму 4x3 вместо традиционной 3x4.

Я не уверен, почему они это делают, здесь можно найти обсуждение . Я действительно надеюсь, что они могут лучше объяснить / указать это в документации на imwarp, projective2d и тому подобное. Мне потребовались часы, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...