迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > MATLAB >

在 MATLAB 中对图像应用几何变换

作者:迹忆客 最近更新:2023/04/23 浏览次数:

本教程将讨论使用 MATLAB 中的 imwarp() 函数将几何变换应用于图像。


在 MATLAB 中对图像应用几何变换

几何变换根据我们的要求变换图像,例如旋转、调整大小和剪切图像。 我们可以使用 MATLAB 中的 imwarp() 函数对图像应用几何变换。

图像由放置在特定位置的像素组成。 imwrap() 函数根据给定的转换对象更改像素的位置。

例如,如果我们想垂直翻转图像,我们只需要改变图像中存在的像素的位置。 顶行像素将与给定图像中存在的最后一行像素互换。

imwarp() 函数的基本语法如下所示。

output_image = imwarp(input_image, geo_tran);

我们可以使用上述语法将给定的几何变换 geo_tran 应用于输入图像 input_image,结果将存储在 output_image 中。 输入图像可以是数字、逻辑或分类图像。

我们可以使用 MATLAB 的 affine2d() 函数创建一个二维几何变换对象或矩阵。 我们必须在 affine2d() 函数中定义一个 3×3 矩阵来创建变换对象,并将其传递到 imwarp() 函数中以将其应用于给定图像。

例如,让我们使用已存储在 MATLAB 中的相机图像,并使用 imwarp() 函数应用几何变换。

请参阅下面的代码。

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = affine2d([1 0 0; .5 1 0; 1 0 1])
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

输出:

transformation using affine2d

在上面的输出中,我们可以看到右侧图像发生了变化,唯一的变化是像素的位置。 我们还可以根据给定的图像和我们希望从函数中获得的输出类型来更改变换矩阵。

如果我们想为 3d 图像创建几何变换矩阵,我们可以使用 MATLAB 的 affine3d() 函数。

对于 affine3d(),输入矩阵的大小应为 4×4。

将图像旋转 N 度

要旋转图像,我们可以使用 randomaffine2d() 函数创建一个随机二维仿射变换对象,然后将其与给定图像一起传递到 imwarp() 函数中,以将变换应用于给定图像。 我们可以使用 randomaffine2d() 函数的 Rotation 参数,之后,我们必须设置角度或角度范围来创建旋转给定图像的变换。

例如,让我们将上面的图像旋转 45 度。 请参阅下面的代码。

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

输出:

Image Rotation Using imwarp

在上面的代码中,我们应用了两次相同的值 45,但我们也可以提供一个范围,函数将从该范围中随机选择一个角度来创建变换对象。

反射、缩放、剪切和平移图像

要创建图像的 x 轴或 y 轴反射,我们可以使用 XReflection 和 YReflection 参数。 定义参数名称后,我们必须传递 true,因为默认情况下,这些参数设置为 false。

反射参数将水平或垂直翻转图像。 我们还可以剪切图像,这意味着将图像的一部分朝一个方向移动,另一部分朝相反的方向移动。

我们还可以使用 XShear 和 YShear 参数应用 x 或 y 轴剪切,之后,我们必须将值设置为二元向量。 我们还可以使用 randomaffine2d() 函数的缩放参数缩放图像。

如果scale值小于1,图像尺寸会减小; 如果它大于 1,它将增加。 我们还可以使用 XTranslation 和 YTranslation 参数在 x 轴或 y 轴上平移图像,之后,我们必须定义用于平移的 2 元素矩阵。

例如,让我们更改上面提到的属性并查看结果。 请参阅下面的代码。

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[15 15],'XTranslation',[20 20]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

输出:

Changing Properties of Transformation

我们可以分别更改每个属性以查看其在原始图像上的结果。

对于 3D 图像,我们可以使用 randomaffine3d() 函数创建 3d 转换对象,我们可以像更改 randomaffine2d() 函数的属性一样更改其属性。


设置输出图像的边缘、视图和边界样式

我们也可以改变 imwarp() 函数的属性,如插值方法,默认设置为最近,我们可以将其更改为线性或三次。 在某些情况下,输出图像的边缘不平滑,但我们可以使用 imwarp() 函数内的 SmoothEdges 参数来获得平滑的边缘。

我们还可以使用 OutputView 参数更改输出图像的输出视图,之后,我们必须传递一个使用 affineOutputView() 函数创建的视图对象。 affineOutputView() 函数的第一个参数是输入图像的大小,第二个参数是变换对象。

第三个可选参数 BoundingStyle 用于设置输出图像的边界样式。 共有三种类型的样式可用:CenterOutput、FollowOutput 和 SameAsInput 样式。

例如,让我们更改上面提到的 imwarp() 函数的属性。 请参阅下面的代码。

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Output_view = affineOutputView(size(Img),gform,'BoundsStyle','CenterOutput');
Jmg = imwarp(Img,gform,'SmoothEdges',true,'OutputView',Output_view);
figure
imshow(Jmg)

输出:

Changing Properties of imwarp

右侧图像(输出图像)与输入图像大小相同,因为我们使用了平滑边缘参数。 如果我们不使用 smooth edges 参数,输出图像的大小将会增加,这也显示在图像旋转的第一个示例中。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 MATLAB 中注释多行

发布时间:2023/04/23 浏览次数:111 分类:MATLAB

可以使用注释块方法或 MATLAB 编辑器在 MATLAB 中注释多行。

MATLAB 最大索引

发布时间:2023/04/23 浏览次数:192 分类:MATLAB

在本教程中,我们将讨论如何使用 MATLAB 中的 max() 函数从数组及其索引中查找最大值。

MATLAB 索引超出矩阵尺寸

发布时间:2023/04/23 浏览次数:103 分类:MATLAB

要解决索引超出矩阵索引的问题,请检查你要获取或替换数据的索引。

MATLAB 检查变量类型

发布时间:2023/04/23 浏览次数:92 分类:MATLAB

在本教程中,我们将讨论如何使用 MATLAB 中的 class() 和 whos 函数检查给定变量的类型。

MATLAB vs Octave

发布时间:2023/04/23 浏览次数:74 分类:MATLAB

我们可以说 Octave 是 MATLAB 的免费版本。

MATLAB MAT 文件

发布时间:2023/04/23 浏览次数:89 分类:MATLAB

可以使用 MAT 文件在 MATLAB 中存储和加载格式化的数据。

MATLAB asv 文件

发布时间:2023/04/23 浏览次数:180 分类:MATLAB

.asv 文件是 MATLAB 生成的自动保存文件,因此在计算机崩溃时你不会丢失数据。

MATLAB 三元运算符

发布时间:2023/04/23 浏览次数:130 分类:MATLAB

MATLAB 中没有三元运算符,因此你必须使用标准格式。

MATLAB & vs &&

发布时间:2023/04/23 浏览次数:134 分类:MATLAB

在 MATLAB 中,&是逻辑与运算符,&&也是表现出短路行为的逻辑运算符。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便