Image 在MATLAB中如何将图像扭曲成梯形

Image 在MATLAB中如何将图像扭曲成梯形,image,matlab,image-processing,Image,Matlab,Image Processing,我正在处理狒狒图像,我想要的是获得如下图像: 我尝试了fitgeotrans、projective2d和affine2d但没有成功,可能我没有正确理解这些函数的行为 谢谢您的帮助。这只是MATLAB R2013b中的一个警告,因此这对以下任何版本都不起作用 将图像扭曲为“梯形”的过程非常简单。您需要做的是创建一个变换对象,该对象获取图像的四个角点,并将它们放置到所需梯形的相应角点。找到此变换后,将使用此变换对象扭曲图像,但请确保指定坐标系,以便原点相对于原始图像的左上角。如果没有,则原点与将

我正在处理狒狒图像,我想要的是获得如下图像:

我尝试了
fitgeotrans
projective2d
affine2d
但没有成功,可能我没有正确理解这些函数的行为

谢谢您的帮助。

这只是MATLAB R2013b中的一个警告,因此这对以下任何版本都不起作用


将图像扭曲为“梯形”的过程非常简单。您需要做的是创建一个变换对象,该对象获取图像的四个角点,并将它们放置到所需梯形的相应角点。找到此变换后,将使用此变换对象扭曲图像,但请确保指定坐标系,以便原点相对于原始图像的左上角。如果没有,则原点与将被裁剪的新图像有关。一旦你找到这个扭曲的图像,我们会在一个图像框上显示它,相对于原始图像坐标系

您使用的是来自的臭名昭著的图像,MATLAB将其作为图像处理工具箱的一部分。首先加载数据集,因为这是具有指定颜色映射的索引图像,所以需要将其转换为彩色图像

%// Load in the image
load mandrill;
img = ind2rgb(X,map);
曼德尔图像存储在
img
中,我们得到:

现在,下一部分是创建变换对象,将图像的四个角点扭曲到梯形坐标。这很完美。您需要指定一组“移动点”,这些点是您想要变换的点。在本例中,这些是要变换的原始图像的四个角点。将其放入
4x2
矩阵中,其中第一列为列/
x
坐标,第二列为行/
y
坐标。我将分别指定左上、右上、左下和右下的坐标。接下来,您需要指定一组“固定点”,它们是您希望移动点最终移动到的点。同样,这将是一个
4x2
矩阵,这些是梯形的坐标。我不得不摆弄坐标来获得正确的结果,但是非常欢迎你根据自己的喜好修改这个。您还需要指定一个投影的变换,因为在梯形中有绝对的经验

%// Create perspective transformation that warps the original 
%// image coordinates to the trapezoid
movingPoints = [1 1; size(img,2) 1; 1 size(img,1); size(img,2) size(img,1)];
fixedPoints = [180 100; 340 100; 50 300; 450 300];
tform = fitgeotrans(movingPoints, fixedPoints, 'Projective');
t表单
存储转换对象。接下来,我们需要创建一个用于扭曲图像的参考坐标系。我们希望对原始图像坐标系执行此操作。你可以用它来做。第一个输入是图像的大小,即向量中的行和列,然后指定
x
/列限制和
y
/行限制。我们希望这是关于原始图像的

%// Create a reference coordinate system where the extent is the size of
%// the image
RA = imref2d([size(img,1) size(img,2)], [1 size(img,2)], [1 size(img,1)]);
RA
存储此参考帧。最后需要做的事情是使用这个新的变换对象扭曲图像。用于实现此翘曲。要使用该函数,请指定要扭曲的图像、变换对象,并希望确保扭曲相对于原始图像帧坐标系,因此必须将
'OutputView'
标记指定为上面创建的标记

%// Warp the image
[out,r] = imwarp(img, tform, 'OutputView', RA);
out
包含扭曲的图像,
r
包含图像相对于的坐标系<就本问题而言,代码>r应等于<代码>RA

现在,如果要查看图像,请使用此新坐标系最终显示图像。执行此操作时,将显示轴,因此请禁用该选项:

%// Show the image and turn off the axes
imshow(out, r);
axis off;
。。。。我们得到:


为了便于您复制和粘贴,以下是完整的代码:

%// Load in the image
load mandrill;
img = ind2rgb(X,map);

%// Create perspective transformation that warps the original 
%// image coordinates to the trapezoid
movingPoints = [1 1; size(img,2) 1; 1 size(img,1); size(img,2) size(img,1)];
fixedPoints = [180 100; 340 100; 50 300; 450 300];
tform = fitgeotrans(movingPoints, fixedPoints, 'Projective');

%// Create a reference coordinate system where the extent is the size of
%// the image
RA = imref2d([size(img,1) size(img,2)], [1 size(img,2)], [1 size(img,1)]);

%// Warp the image
[out,r] = imwarp(img, tform, 'OutputView', RA);

%// Show the image and turn off the axes
imshow(out, r);
axis off;

谢谢你,答案正是我想要的。我使用了正确的函数,但我用错了。你的解释也很清楚。我真的很感谢你!!我的荣幸!这只需要练习:)。祝你好运我是一个硬核几何变换的家伙,我喜欢乘那些矩阵,而不是使用那些简单的tforms!呵呵。很好的答案,一个几何变换一个是失踪的book@rayryeng也许这只是一种困惑,就像Lenna/Lena:-)@LuisMendo-如果可以的话,我会给你+10作为评论:请注意,a不是a,尽管他们在同一个家庭。