本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

几何变换的矩阵表示

您可以使用几何变换矩阵来执行图像的全局变换。首先,定义变换矩阵,并使用它创建几何变换对象。然后,通过使用几何变换对象调用 imwarp 对图像应用全局变换。有关示例,请参阅Perform Simple 2-D Translation Transformation

二维仿射变换

下表列出了二维仿射变换以及用于定义它们的变换矩阵。对于二维仿射变换,最后一列必须包含 [0 0 1] 同构坐标。

使用变换矩阵创建一个 affine2d 几何变换对象。

二维仿射变换示例(原始图像和变换后的图像)变换矩阵
平移

tx 指定沿 x 轴的位移

ty 指定沿 y 轴的位移。

有关像素坐标的详细信息,请参阅图像坐标系

缩放

sx 指定沿 x 轴的缩放因子

sy 指定沿 y 轴的缩放因子。

剪切

shx 指定沿 x 轴的剪切因子

shy 指定沿 y 轴的剪切因子。

旋转

q 指定围绕原点的旋转角度。

二维投影变换

投影变换使图像平面倾斜。平行线可以向一个消失点收敛,形成深度的外观。

变换矩阵是一个 3×3 矩阵。与仿射变换不同,变换矩阵的最后一列没有限制。

二维投影变换 示例变换矩阵
倾斜

[10E01F001]

EF 对消失点有影响。

EF 较大时,消失点更接近原点,因此平行线似乎收敛得更快。

请注意,当 EF 等于 0 时,该变换成为仿射变换。

投影变换经常用于配准未对齐的图像。如果您要对齐两个图像,请先使用 cpselect 选择控制点对。然后,使用 fitgeotrans 并将 transformationType 设置为 'projective' 来对成对控制点进行投影变换矩阵拟合。这将自动创建 projective2d 几何变换对象。变换矩阵作为属性存储在 projective2d 对象中。然后,可以使用 imwarp 将变换应用于其他图像。

创建复合二维仿射变换

您可以使用矩阵乘法将多个变换合并成一个矩阵。矩阵乘法的顺序很重要。

此示例说明如何创建二维平移和旋转变换组合。

创建一个将发生变换的棋盘图像。同时为图像创建一个空间参照对象。

cb = checkerboard(4,2);
cb_ref = imref2d(size(cb));

要展示图像的空间位置,请创建一个平面背景图像。将棋盘叠加到背景上,使用绿色突出显示棋盘位置。

background = zeros(150);
imshowpair(cb,cb_ref,background,imref2d(size(background)))

创建一个变换矩阵,并将其存储为 affine2d 几何变换对象。此平移将使图像水平移动 100 个像素。

T = [1 0 0;0 1 0;100 0 1];
tform_t = affine2d(T);

创建一个旋转矩阵,并将其存储为 affine2d 几何变换对象。此旋转将使图关于原点顺时针旋转 30 度。

R = [cosd(30) sind(30) 0;-sind(30) cosd(30) 0;0 0 1];
tform_r = affine2d(R);

平移后旋转

首先执行平移,然后执行旋转。在变换矩阵的乘法运算中,平移矩阵 T 位于左侧,旋转矩阵 R 位于右侧。

TR = T*R;
tform_tr = affine2d(TR);
[out,out_ref] = imwarp(cb,cb_ref,tform_tr);
imshowpair(out,out_ref,background,imref2d(size(background)))

旋转后平移

颠倒变换的顺序:先执行旋转,再执行平移。在变换矩阵的乘法运算中,旋转矩阵 R 位于左侧,平移矩阵 T 位于右侧。

RT = R*T;
tform_rt = affine2d(RT);
[out,out_ref] = imwarp(cb,cb_ref,tform_rt);
imshowpair(out,out_ref,background,imref2d(size(background)))

请注意变换后的图像的空间位置与先平移后旋转情形的不同之处。

三维仿射变换

下表列出了三维仿射变换以及用于定义它们的变换矩阵。请注意,在三维情况下具有多个矩阵,具体取决于您要如何旋转或剪切图像。最后一列必须包含 [0 0 0 1]。

使用变换矩阵创建一个 affine3d 几何变换对象。

三维仿射变换变换矩阵  
平移

[100001000010txtytz1]

  
缩放

[sx0000sy0000sz00001]

  
剪切x,y 剪切:

x'=x+azy'=y+bzz'=z

[10000100ab100001]

x,z 剪切:

x'=x+ayy'=yz'=z+cy

[1000a1c000100001]

y, z 剪切:

x'=xy'=y+bxz'=z+cx

[1bc0010000100001]

旋转关于 x 轴:

[10000cos(a)sin(a)00sin(a)cos(a)00001]

关于 y 轴:

[cos(a)0sin(a)00100sin(a)0cos(a)00001]

关于 z 轴:

[cos(a)sin(a)00sin(a)cos(a)0000100001]

对于 N 维仿射变换,最后一列必须包含 [zeros(N,1); 1]imwarp 不支持三维以上的变换。

另请参阅

|

相关示例

详细信息