我正在使用此代码翻译图像但是当我对图像应用逆时,它没有显示整个图像,它只显示转换后的图像。
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(img, tform, 'XData',[1 size(img,2)],'YData',[1 size(img,1)]);
figure;
imagesc(out);
title ('translated image');
colormap gray
ot=imtransform(out, ttform, 'XData',[0 size(out,0)],'YData',[0 size(out,0)]);
figure;
imagesc(ot);
title ('inverse translated image');
colormap gray
答案 0 :(得分:2)
我认为您的问题来自您提供imtransform的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)
看起来像这样:
然后应用您的代码翻译图片。请注意imtransform中的XData和YData的更改:
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
,但这是您的电话。
希望有所帮助!