image - 如何在 MATLAB 中将图像变形为梯形

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

我尝试使用 fitgeotransprojective2daffine2d 都没有成功,也许我没有正确理解这些函数的行为。

感谢您的帮助。

最佳答案

只是一个警告 fitgeotrans是 MATLAB R2013b 的一部分,因此这不适用于低于此版本的任何版本。


将图像变形为“梯形”的过程非常简单。您需要做的是创建一个变换对象,该对象采用图像的四个角点并将它们放置到您想要的梯形的相应角上。一旦你找到这个变换,你就用这个变换对象扭曲图像,但要确保你指定的坐标系是原点相对于原始图像的左上角。如果你不这样做,那么原点是关于将被裁剪的新图像。一旦您找到这个扭曲的图像,我们就会将其显示在相对于原始图像坐标系的图像帧上。

您正在使用臭名昭著的 Mandrill图片来自University of Southern California's SIPI (Signal and Image Processing Institute) Image Database MATLAB 将其作为图像处理工具箱的一部分。首先加载数据集,因为这是具有指定颜色映射的索引图像,ind2rgb需要将其转换为彩色图像。

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

山魈图像存储在img中,我们得到:

现在下一部分是创建一个变换对象,将图像的四个角点扭曲到梯形坐标。 fitgeotrans完美地做到了这一点。您需要指定一组“移动点”,即您想要转换的点。在本例中,这些是您要变换的原始图像的四个角点。您将其放入 4 x 2 矩阵中,其中第一列是列/x 坐标,第二列是行/y 坐标.我将分别指定左上角、右上角、左下角和右下角坐标。接下来,您需要指定一组“固定点”,这些点是您希望移动点最终移动到的点。同样,这将在 4 x 2 矩阵中,这些是梯形的坐标。我不得不胡乱处理坐标以使其正确,但非常欢迎您根据自己的喜好修改它。您还想指定一个projective 变换,因为在梯形中经历了纯粹的经验。

%// 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');

tform 存储转换对象。接下来,我们需要创建一个引用坐标系来扭曲我们的图像。我们想针对原始图像坐标系执行此操作。您可以使用 imref2d要做到这一点。第一个输入是图像的大小,分别是向量中的行和列,然后指定 x/column 限制和 y/row 限制。我们希望这是关于原始图像的。

%// 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 存储这个引用帧。您需要做的最后一件事是使用这个新的转换对象扭曲图像。使用 imwarp来实现这种翘曲。要使用该函数,您需要指定要变形的图像和变换对象,并且您要确保变形是相对于原始图像帧坐标系的,因此您必须指定 'OutputView'标记为上面创建的内容。

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

out 包含变形图像,r 包含图像相对于的坐标系。就此问题而言,r 应等于 RA

现在如果你想看图片,使用imshow使用这个新的坐标系来最终显示图像。执行此操作时,您会看到显示的坐标轴,因此请将其关闭:

%// 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;

https://stackoverflow.com/questions/33508066/

相关文章:

amazon-web-services - spark-ec2 --copy-aws-credent

sql-server - 动态透视多列

android - 如何使用具有不同文本和图像的相同布局

visual-studio-2015 - VS2015数据库项目: Turn off schema

android - 我可以预加载 Animation Drawable 吗?

angularjs - 如何在 git 存储库中拆分 Angular 应用程序客户端/服务器端代码

Python - sys.stderr 未保存到 .txt 或 .log

python - 如何将不同的环境变量分配给池中的不同进程?

php - 在 IIS URL 重写后用 PHP 获取 URL 参数

javascript - AngularJS 错误 : [$injector:nomod]