主要内容

创建复合2-D仿射变换

这个例子展示了如何创建2-D平移和旋转转换的组合。转换的顺序很重要,因此有两种方法来创建组合:

1)创建一个表示各个变换的矩阵,然后通过将矩阵相乘来创建复合变换,最后将变换矩阵存储为affinetform2d对象。这种方法具有最大的灵活性,因为您可以使用所有类型的仿射变换,包括剪切、反射、各向异性缩放和其他复合仿射变换。你也可以通过矩阵乘法的顺序来控制变换的顺序。

2)创建一个simtform2drigidtform2d,或transltform2d几何对象。当您知道非反射相似变换的比例因子、旋转角度和平移距离时,这种方法可以很容易地创建复合变换。然而,几何变换对象总是以固定的顺序执行相关的变换:首先缩放,然后旋转,然后平移。如果需要以不同的顺序执行转换,则必须使用矩阵并创建仿射转换对象。

这个例子演示了包含平移和旋转的刚性变换的两种方法。

创建一个棋盘图像,将进行转换。还要为图像创建一个空间引用对象。

Cb = checkerboard(4,2);Cb_ref = imref2d(size(cb));

为了说明图像的空间位置,创建一个平面背景图像。将棋盘覆盖在背景上,用绿色突出显示棋盘的位置。

背景=零(150);imshowpair (cb、cb_ref、背景、imref2d(大小(背景)))

图中包含一个轴对象。axis对象包含一个image类型的对象。

创建一个平移矩阵,将图像水平和垂直移动。

tx =One hundred.;泰=0;T = [10 tx;0 1 ty;0 0 1]
T =3×310 100 0 100 0 1

创建一个旋转矩阵,使图像围绕原点顺时针旋转。

θ=30.;R = [cosd(theta) -sind(theta) 0;Sind () cosd() 0;0 0 1]
R =3×30.8660 -0.5000 0 0.5000 0.8660 000 1.0000

使用矩阵进行旋转和平移

首先进行旋转,然后进行平移。使用前乘矩阵的约定,平移矩阵T在左边,旋转矩阵R在右边。

Tr = t * r
TR =3×30.8660 -0.5000 100.0000 0.5000 0.8660 000 1.0000

将复合变换存储为仿射变换,然后对原始棋盘图像进行扭曲。使用空间引用显示结果。

tform_tr = affinetform2d(TR);[out,out_ref] = imwarp(cb,cb_ref,tform_tr);imshowpair (out_ref,背景,imref2d(大小(背景)))

图中包含一个轴对象。axis对象包含一个image类型的对象。

使用矩阵进行平移和旋转

反转转换的顺序:首先执行平移,其次执行旋转。使用预乘矩阵约定,旋转矩阵R在左边平移矩阵T在右边。

Rt = r * t
RT =3×30.8660 -0.5000 86.6025 0.5000 0.8660 50.0000 00 1.0000

将复合变换存储为仿射变换,然后对原始棋盘图像进行扭曲。使用空间引用显示结果。注意转换后的图像的空间位置与平移后旋转时是如何不同的。

tform_rt = affinetform2d(RT);[out,out_ref] = imwarp(cb,cb_ref,tform_rt);imshowpair (out_ref,背景,imref2d(大小(背景)))

图中包含一个轴对象。axis对象包含一个image类型的对象。

使用刚性变换对象进行旋转和平移

创建一个具有示例前面指定的旋转角度和平移距离的刚性几何变换对象。

Tform_rigid = rigidtform2d(theta,[tx ty]);

方法查看几何变换矩阵一个财产。这个矩阵等于这个矩阵TR正如预期的那样,因为刚性转换对象在平移之前执行旋转。

tform_rigid。一个
ans =3×30.8660 -0.5000 100.0000 0.5000 0.8660 000 1.0000

通过扭曲测试图像并通过空间引用显示结果来确认操作的顺序。结果与矩阵乘法的结果相同。

[out,out_ref] = imwarp(cb,cb_ref,tform_rigid);imshowpair (out_ref,背景,imref2d(大小(背景)))

图中包含一个轴对象。axis对象包含一个image类型的对象。

另请参阅

相关的话题

Baidu
map