Как применить аффинное преобразование, чтобы оно хорошо работало со всеми преобразованиями, включая перевод?

По какой-то причине функция imtransform по умолчанию игнорирует часть перевода.

Если я добавлю дополнительное пространство с помощью XData и YData, как указано в руководстве, я буду обрабатывать только простые случаи (т.е. только перевод).

Итак, как применить полнофункциональное аффинное преобразование в Matlab?

I = imread('cameraman.png');
imshow(I);

% does not translate
xform = [1 2 0; 2 1 0; 100 0 1];
T = maketform('affine',xform);
I2 = imtransform(I,T);
figure, imshow(I2)


% translates but cuts some portion of an image
xform = [1 2 0; 2 1 0; 100 0 1];
T = maketform('affine',xform);
I2 = imtransform(I,T,'XData',[1 size(I,2)+xform(3,1)],'YData',[1 size(I,1)+xform(3,2)]);
figure, imshow(I2)

person Suzan Cioc    schedule 10.07.2013    source источник
comment
Я думаю, вы путаете команду «XData» с командой «ось». В блог Стива об обработке изображений в Matlab несколько отличных примеров.   -  person Maurits    schedule 10.07.2013
comment
Статья выглядит не сказать что-то новое для меня. И я до сих пор не понимаю, как выполнять преобразования во всех случаях. Примечание. Я не хочу правильно РИСОВАТЬ изображение на экране, я хочу, чтобы оно правильно преобразовывалось в памяти.   -  person Suzan Cioc    schedule 10.07.2013


Ответы (1)


Поэтому я обнаружил, что должен применить преобразование и к диапазону изображений.

После этого я могу решить, что делать, если угол изображения не находится в начале координат.

I = imread('cameraman.png');
XData=[1 size(I,2)];
YData=[1 size(I,1)];
imshow(I);

xform = [1 2 0; 2 1 0; 100 0 1];

T = maketform('affine',xform);
[XData1, YData1] = tformfwd(T, XData, YData);
if XData1(1)>1
    XData1(1)=1;
end
if YData1(1)>1
    YData1(1)=1;
end
I2 = imtransform(I,T,'XData',XData1,'YData',YData1);
figure, imshow(I2)
person Suzan Cioc    schedule 10.07.2013