文档

几何变换的矩阵表示

您可以使用一个几何变换矩阵来完成全球转换的图像。首先,定义一个变换矩阵,并使用它来创建一个几何变换对象。然后,应用到一个图像通过调用一个全球转换imwarp与对象的几何变换。例如,看到的执行简单的二维翻译转换

二维仿射变换

下表列出了一些二维仿射变换的变换矩阵用于定义它们。对于二维仿射变换,最后一列必须包含(0 0 1)齐次坐标。

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

二维仿射变换 示例(原始和转换图像) 变换矩阵
翻译

tx指定的位移x

ty指定的位移y轴。

关于像素坐标的更多信息,请参阅图像坐标系统

规模

年代x指定的比例因子x

年代y指定的比例因子y轴。

剪切

上海x沿着指定剪因素x

上海y沿着指定剪因素y轴。

旋转

指定绕原点旋转的角度。

二维射影变换

射影变换使得图像的平面倾斜。平行线可以收敛到一个消失点,创造深度。

3 x3的转换矩阵。和仿射变换不同的是,没有任何限制的最后一列变换矩阵。

二维射影变换 例子 变换矩阵
倾斜

( 1 0 E 0 1 F 0 0 1 ]

EF影响消失点。

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

注意,当EF等于0,转换成为一个仿射变换。

射影变换经常用于注册图像对齐。如果你有两张图片,你想要对齐,首先选择控制点对使用cpselect。然后,适合一个射影变换矩阵控制点对使用fitgeotrans并设置transformationType“射影”。这会自动地创建一个projective2d几何变换对象。变换矩阵存储为属性projective2d对象。转换可以被应用到其他图像imwarp

创建复合二维仿射变换

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

这个例子展示了如何创建一个复合的二维平移和旋转变换。

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

cb =棋盘(4,2);cb_ref = imref2d(大小(cb));

为了说明图像的空间位置,创建一个平坦的背景图像。叠加棋盘背景,用绿色突出显示棋盘的位置。

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

创建一个转换矩阵,并将其存储为affine2d几何变换对象。这种转换将100像素的图像水平。

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

创建一个旋转矩阵,并将其存储为affine2d几何变换对象。这翻译会顺时针旋转30度图像原点。

R = [cosd(30)信德(30)0;信德(30)cosd (30) 0。0 0 1);tform_r = affine2d (R);

翻译跟着旋转

执行翻译第一和第二旋转。在变换矩阵的乘法,转换矩阵T在左边,和旋转矩阵R在右边。

TR = T * R;tform_tr = affine2d (TR);[,out_ref] = imwarp (cb、cb_ref tform_tr);imshowpair (out_ref,背景,imref2d(大小(背景)))

旋转之后,翻译

反向转换的顺序:先进行旋转和翻译。在变换矩阵的乘法,旋转矩阵R在左边,翻译矩阵T在右边。

RT = R * T;tform_rt = affine2d (RT);[,out_ref] = imwarp (cb、cb_ref tform_rt);imshowpair (out_ref,背景,imref2d(大小(背景)))

注意转换后的图像的空间位置不同翻译时旋转紧随其后。

三维仿射变换

下表列出了三维仿射变换的变换矩阵用于定义它们。注意,在三维情况下,有多个矩阵,这取决于你想旋转或剪切图像。最后一列必须包含(0 0 0 1)。

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

三维仿射变换 变换矩阵
翻译

( 1 0 0 0 0 1 0 0 0 0 1 0 t x t y t z 1 ]

规模

( 年代 x 0 0 0 0 年代 y 0 0 0 0 年代 z 0 0 0 0 1 ]

剪切 x, y剪:

x = x + 一个 z y = y + b z z = z

( 1 0 0 0 0 1 0 0 一个 b 1 0 0 0 0 1 ]

x, z剪:

x = x + 一个 y y = y z = z + c y

( 1 0 0 0 一个 1 c 0 0 0 1 0 0 0 0 1 ]

y, z剪:

x = x y = y + b x z = z + c x

( 1 b c 0 0 1 0 0 0 0 1 0 0 0 0 1 ]

旋转 关于x轴:

( 1 0 0 0 0 因为 ( 一个 ) ( 一个 ) 0 0 ( 一个 ) 因为 ( 一个 ) 0 0 0 0 1 ]

关于y轴:

( 因为 ( 一个 ) 0 ( 一个 ) 0 0 1 0 0 ( 一个 ) 0 因为 ( 一个 ) 0 0 0 0 1 ]

关于z轴:

( 因为 ( 一个 ) ( 一个 ) 0 0 年代 n ( 一个 ) 因为 ( 一个 ) 0 0 0 0 1 0 0 0 0 1 ]

一天的仿射变换,最后一列必须包含[0 (N, 1);1]imwarp不支持转换超过三个万博1manbetx维度。

另请参阅

|

相关的例子

更多关于

这个主题有帮助吗?