在 MATLAB 中对图像应用几何变换
本教程将讨论使用 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)
输出:
在上面的输出中,我们可以看到右侧图像发生了变化,唯一的变化是像素的位置。 我们还可以根据给定的图像和我们希望从函数中获得的输出类型来更改变换矩阵。
如果我们想为 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)
输出:
在上面的代码中,我们应用了两次相同的值 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)
输出:
我们可以分别更改每个属性以查看其在原始图像上的结果。
对于 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)
输出:
右侧图像(输出图像)与输入图像大小相同,因为我们使用了平滑边缘参数。 如果我们不使用 smooth edges 参数,输出图像的大小将会增加,这也显示在图像旋转的第一个示例中。
相关文章
MATLAB 检查变量类型
发布时间:2023/04/23 浏览次数:92 分类:MATLAB
-
在本教程中,我们将讨论如何使用 MATLAB 中的 class() 和 whos 函数检查给定变量的类型。