本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。
您可以使用几何变换矩阵来执行图像的全局变换。首先,定义变换矩阵,并使用它创建几何变换对象。然后,通过使用几何变换对象调用 imwarp
对图像应用全局变换。有关示例,请参阅Perform Simple 2-D Translation Transformation。
下表列出了二维仿射变换以及用于定义它们的变换矩阵。对于二维仿射变换,最后一列必须包含 [0 0 1] 同构坐标。
使用变换矩阵创建一个 affine2d
几何变换对象。
二维仿射变换 | 示例(原始图像和变换后的图像) | 变换矩阵 | |
---|---|---|---|
平移 |
有关像素坐标的详细信息,请参阅图像坐标系。 | ||
缩放 |
|
| |
剪切 |
|
| |
旋转 |
|
|
投影变换使图像平面倾斜。平行线可以向一个消失点收敛,形成深度的外观。
变换矩阵是一个 3×3 矩阵。与仿射变换不同,变换矩阵的最后一列没有限制。
二维投影变换 | 示例 | 变换矩阵 | |
---|---|---|---|
倾斜 |
|
当 请注意,当 |
投影变换经常用于配准未对齐的图像。如果您要对齐两个图像,请先使用 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
几何变换对象。
三维仿射变换 | 变换矩阵 | ||
---|---|---|---|
平移 |
| ||
缩放 |
| ||
剪切 | x,y 剪切:
| x,z 剪切:
| y, z 剪切:
|
旋转 | 关于 x 轴:
| 关于 y 轴:
| 关于 z 轴:
|
对于 N 维仿射变换,最后一列必须包含 [zeros(N,1);
1]
。imwarp
不支持三维以上的变换。