迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > 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 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Matplotlib Pyplot 中显示网格

发布时间:2024/02/04 浏览次数:142 分类:Python

本文演示了如何在 Python Matplotlib 中在一个图上画一个网格。使用 grid()函数来绘制网格,并解释了如何改变网格颜色和线条类型。

如何在 Matplotlib 中画一条任意线

发布时间:2024/02/04 浏览次数:166 分类:Python

本教程讲解了我们如何在 Matplotlib 中使用 matplotlib.pyplot.plot()、matplotlib.pyplot.vlines()、matplotlib.pyplot.hlines()方法和 matplotlib.collection.LineCollection 绘制任意线条。

Matplotlib 中的叠加条形图

发布时间:2024/02/04 浏览次数:182 分类:Python

本教程展示了如何使用 plt.bar()方法将某些数据集的条形图堆叠在另一个数据集上。我们在 Matplotlib 中使用 matplotlib.pyplot.bar()方法生成条形图。

设置 Matplotlib 网格间隔

发布时间:2024/02/04 浏览次数:250 分类:Python

本教程将介绍我们如何在 Matplotlib 绘图中设置网格间距,并对主要网格和次要网格应用不同的样式。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便