在Matlab的四个角点之间显示图像

时间:2014-02-16 23:18:39

标签: matlab image-processing image-rotation

假设我有4个角点:(x1,y1); (x2,y2);(x3,y3); (x4,y4)和矩形图像尺寸(m,n) 如何显示图像,使显示的图像在所提到的四个点处有角。 换句话说,四个角可以控制图像旋转的角度(请记住图像边缘可能不平行) 谢谢!

3 个答案:

答案 0 :(得分:5)

您需要扭曲图像以获得通用解决方案。你可以这样做:

首先,阅读图像。

img=imread('cameraman.tif');
if size(img,3)==3
   img=rgb2gray(img);

指定转换点集(在您的情况下为(x1,y1) ... (x4,y4)),它们是fixedPoints

movingPoints=[1 1;256 1; 256 256; 1 256] %(x,y) coordinate
fixedPoints=[25 25;250 12;255 200;30 180];

然后,估计转变。我选择投射变换。你也可以选择仿射。

TFORM = fitgeotrans(movingPoints,fixedPoints,'projective');

由于您希望图像转到指定的角落,因此您必须指定输出视图。可以通过如下构建参考2-D图像来完成。

R=imref2d(size(img),[1 size(img,2)],[1 size(img,1)]);

最后,扭曲图像。

imgTransformed=imwarp(imread('cameraman.tif'),R,TFORM,'OutputView',R);

显示图片。

imshow(imgTransformed,[]);

您应该在指定点处拥有图像的角,并且包含图像的框将具有原始图像的大小。

答案 1 :(得分:2)

假设图像不会改变,只需要2个点来计算图像旋转。一般情况类似于

angle = atan2(y2-y1, x2-x1)*180/pi; %angle between image and axis (in degrees)
B = imrotate(A,angle);              %rotation

答案 2 :(得分:2)

另一种与@Parag提出的方法非常相似的方法是以简单的方式使用MATLAB的图像变换功能。
方法如下: 首先,您必须考虑图像是否在“单位”矩形内并相应地定义初始变换条件:

udata = [0 1]; 
vdata = [0 1];
fill_color = 128;
org_rect = [0 0;1 0;1 1;0 1];

请注意,fill_color变量仅表示用于填充画布中未被变换图像覆盖的部分的颜色。然后,您应用从原始到表示图像画布的新矩形的投影变换,如下所示:

tform = maketform('projective', org_rect, new_rect);
[out_im,xdata,ydata] = imtransform( in_im, tform, 'bicubic', 'udata', udata, 'vdata', vdata, 'size', size(in_im), 'fill', fill_color);

您可能会注意到转换是双三次的,并返回外部图像(out_im)和由datadata表示的新坐标系。如果您只保留输出图像,那么它将与原始坐标系中的输入图像大小相同(因此它会有点拉伸)。 为了正确显示图像,您可以使用以下命令:

imshow(out_im,'XData',xdata,'YData',ydata);

这是一个例子。让我们考虑一下Lena的情况如下所示 original Lena RGB
应用转换后,我们可以使用如下所示的正确坐标显示 transformed Lena within the new coordinate system
如果我们决定只显示输出图像而不参考新的坐标系,我们得到如下图所示的图像 transformed Lena without coordinate system
此示例中使用的输出矩形为:[-1 -2;2 -1;3 3;-3 1]