假设我有4个角点:(x1,y1);(x2,y2);(x3,y3);(x4,y4),和一个矩形图像尺寸 (m,n)。如何显示图像,以便在显示时,图像的四个角位于上述四个点处?换句话说,这四个角可以控制图像旋转的角度(请注意,图像边缘可能不平行)。谢谢!
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');
由于您希望图片到达指定的角落,因此必须指定输出视图。可以通过以下方式构建参考2D图像来完成。
R=imref2d(size(img),[1 size(img,2)],[1 size(img,1)]);
imgTransformed=imwarp(imread('cameraman.tif'),R,TFORM,'OutputView',R);
显示图片。
imshow(imgTransformed,[]);
您需要将图像的角落放置在指定的点上,包含图像的盒子的大小将与原始图像的大小相同。
假设图像不会被改变,只需要2个点就可以计算图像的旋转。一般情况如下:
angle = atan2(y2-y1, x2-x1)*180/pi; %angle between image and axis (in degrees)
B = imrotate(A,angle); %rotation
另一种与@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]
new_rec
是什么? - SalahAdDin