我想根据从here提取的这个方案使用控制点转换图像:
A
和B
包含目标顶点的源坐标。
我正在将转换矩阵计算为:
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');
如何使用imtransform
来产生我预期的结果?:
有没有其他方法可以实现它?
答案 0 :(得分:2)
您的问题是,在XData
中指定了YData
和imtransform
时,您意外裁剪了输出图像。一种选择是使用tformfwd
转换A
来计算有效的XData
和YData
范围。
[U,V] = tformfwd(T, A(:,1), A(:,2));
Z = imtransform(X,T,'XData',[min(U) max(U)], 'YData', [min(V) max(V)]);