假设我有4个角点:(x1,y1); (x2,y2);(x3,y3); (x4,y4)和矩形图像尺寸(m,n) 如何显示图像,使显示的图像在所提到的四个点处有角。 换句话说,四个角可以控制图像旋转的角度(请记住图像边缘可能不平行) 谢谢!
答案 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
)和由data
和data
表示的新坐标系。如果您只保留输出图像,那么它将与原始坐标系中的输入图像大小相同(因此它会有点拉伸)。
为了正确显示图像,您可以使用以下命令:
imshow(out_im,'XData',xdata,'YData',ydata);
这是一个例子。让我们考虑一下Lena的情况如下所示
应用转换后,我们可以使用如下所示的正确坐标显示
如果我们决定只显示输出图像而不参考新的坐标系,我们得到如下图所示的图像
此示例中使用的输出矩形为:[-1 -2;2 -1;3 3;-3 1]