使用控制点扭曲图像

时间:2015-08-28 08:17:46

标签: matlab image-processing octave homography projective-geometry

我想根据从here提取的这个方案使用控制点转换图像:

enter image description here

AB包含目标顶点的源坐标。

我正在将转换矩阵计算为:

A = [51 228;  51 127; 191 127; 191 228];
B = [152 57; 219 191;  62 240;  92 109];
X = imread('rectangle.png');
info = imfinfo('rectangle.png');
T = cp2tform(A,B,'projective');

到目前为止它似乎正常工作,因为(使用标准化坐标)源顶点产生其目标顶点:

H = T.tdata.T;
> [51 228 1]*H
ans =
  -248.2186   -93.0820    -1.6330
> [51 228 1]*H/ -1.6330
ans =
   152.0016    57.0006     1.0000

问题是imtransform会产生意外结果:

Z = imtransform(X,T,'XData',[1 info.Width], 'YData',[1 info.Height]);
imwrite(Z,'projective.png');

Unexpected result

如何使用imtransform来产生我预期的结果?:

enter image description here

有没有其他方法可以实现它?

1 个答案:

答案 0 :(得分:2)

您的问题是,在XData中指定了YDataimtransform时,您意外裁剪了输出图像。一种选择是使用tformfwd转换A来计算有效的XDataYData范围。

[U,V] = tformfwd(T, A(:,1), A(:,2));

Z = imtransform(X,T,'XData',[min(U) max(U)], 'YData', [min(V) max(V)]);