Я думаю, что ваша проблема исходит из размера XData и YData, которые вы предоставляете имтрансформации. Поскольку они соответствуют размеру исходного изображения, а более поздняя версия переведена, MATLAB заполняет пробелы 0, чтобы заполнить пробелы, но поскольку вы указываете, что хотите получить конкретное измерение для своего изображения, вы, кажется, получаете только часть изображения.
Вот обходной путь, чтобы показать вам, что ваш перевод делает работу:
1) Создание холста, содержащий исходное изображение; холст достаточно большой, чтобы содержать изображение, а остальное просто черное. Я использую изображение монеты, которое поставляется с MATLAB.
img = imread('coins.png');
%// Get size of original image
[height,width,~] = size(img)
canvas = zeros(2*size(img),'like',img);
%// Put image in canvas.
canvas(height+1:end,width+1:end) = img;
figure;
imagesc(canvas)
colormap gray
title('Original image','FontSize',16)
Глядя, как это:
Затем нанесите свой код, чтобы перевести изображение. Обратите внимание на то, что изменение в XData и YData в функции imtransform:
tran= [1 0 0; 0 1 0; -130 -100 1];
traninv= [1 0 0; 0 1 0; 130 100 1];
% apply translation
tform= maketform('affine', tran);
ttform=maketform('affine', traninv);
out=imtransform(canvas, tform, 'XData',[1 size(canvas,2)],'YData',[1 size(canvas,1)]); %// Size is important!
figure;
imagesc(out);
title ('translated image','FontSize',16);
colormap gray
ot=imtransform(out, ttform, 'XData',[1 size(canvas,2)],'YData',[1 size(canvas,1)]);
figure;
imagesc(ot);
title ('inverse translated image','FontSize',16);
colormap gray
, который дает следующий перевод изображения:
и обратное переведенный изображение:
, который выглядит точно так же, как оригинал. Обратите внимание, что предпочтительно использовать affine2d
в сочетании с imwarp
вместо maketform
и imtransform
, но это ваш звонок.
Надеюсь, что это поможет!
использовать 'tformarray' вместо' imtform', он лучше обрабатывает переводы. – Shai