Аффинное преобразование в 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);

заранее большое спасибо


person FatmaZahraaAhmed    schedule 09.10.2015    source источник


Ответы (1)


Да, это так... однако... вы должны сделать перевод последним шагом. Повороты, сдвиг и другие операции предполагают, что это делается в исходной точке. Таким образом, выполните все необходимые операции, а затем переместите преобразованное изображение после использования матрицы перевода. Если вы перевели сначала (как вы делали в исходной матрице преобразования), все остальные преобразования предполагают, что вы выполняете их по отношению к исходной точке, и эта исходная точка сместилась из-за перевода. Следовательно, точки после перевода будут считаться относительно начала координат (0,0), а не там, где находится (dx,dy), и поэтому остальные операции будут неверными.

Просто переместите перевод так, чтобы он находился в начале выражения, а не в конце:

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

В результате перевод будет выполняться последним, чего вы и хотите. Остальные ваши преобразования вам не нужно никуда перемещать. Они могут быть в любом порядке, потому что все это независимые преобразования. Вы должны оставить перевод до конца.


Незначительное примечание

maketform и imtransform в настоящее время устарели. Если возможно, используйте affine2d вместо maketform и < a href="http://www.mathworks.com/help/images/ref/imwarp.html" rel="nofollow">imwarp вместо imtransform.

person rayryeng    schedule 09.10.2015
comment
Проблема в том, что я использую MATLAB 2008, где affine2d и imwarp не поддерживаются. В чем проблема с функциями maketransform и imtransform? Дают ли они неправильные результаты? А для T правильная ли последовательность преобразований или она должна быть: T=translation*shearingX*shearingY*scaling*rotation; - person FatmaZahraaAhmed; 10.10.2015
comment
Как я уже сказал... просто переместите перевод в начало. Остальное в порядке. Однако остальные ваши преобразования могут быть в любом порядке, поскольку все они являются независимыми преобразованиями. Вы должны оставить перевод до конца. - person rayryeng; 10.10.2015