Main Content

imtransform

(不推荐)对图像应用二维空间变换

不建议使用 imtransform。请改用 imwarp 进行二维和三维变换。使用 tformarray 进行高维变换。

说明

B = imtransform(A,tform) 根据 tform 定义的二维空间变换来变换图像 A,并返回变换后的图像 B

如果 A 是彩色图像,则 imtransform 会对每个颜色通道应用相同的二维变换。类似地,如果 A 是三维体或具有三个或更多维度的图像序列,则 imtransform 将相同的二维变换应用于沿更高维度的所有二维平面。

示例

B = imtransform(A,tform,interp) 指定要使用的插值形式。

B = imtransform(___,Name,Value) 使用名称-值参量来控制空间变换的各个方面。

[B,xdata,ydata] = imtransform(___) 还返回输出图像 B 在输出 X-Y 空间中的范围。默认情况下,imtransform 会自动计算 xdataydata,使得 B 包含整个变换后的图像 A。但是,您可以通过为 XDataYData 名称-值对组输入参量指定值来覆盖此自动计算。

示例

示例

全部折叠

对灰度图像应用水平剪切。

I = imread("cameraman.tif");
tform = maketform("affine",[1 0 0; .5 1 0; 0 0 1]);
J = imtransform(I,tform);
imshow(J)

Grayscale image with horizontal shear.

用投影变换将正方形映射到一个不规则四边形。

读取一个图像。设置输入坐标系,将输入图像填充到顶点为 (0, 0)、(1, 0)、(1, 1) 和 (0, 1) 的单位正方形。

I = imread("cameraman.tif");
udata = [0 1];  
vdata = [0 1];

变换为具有顶点 (-4, 2)、(-8, 3)、(-3, -5) 和 (6, 3) 的四边形。

tform = maketform("projective",[ 0 0;  1  0;  1  1; 0 1],...
                               [-4 2; -8 -3; -3 -5; 6 3]);

用灰色填充并使用双三次插值。使输出大小与输入大小相同。

[B,xdata,ydata] = imtransform(I,tform,"bicubic", ...
                              "udata",udata,...
                              "vdata",vdata,...
                              "size",size(I),...
                              "fill",128);
subplot(1,2,1); imshow(I,"XData",udata,"YData",vdata)
subplot(1,2,2); imshow(B,"XData",xdata,"YData",ydata)

Original square image on the left, and transformed image on the right. The transformed image is rotated and appears to tilt out of the plane, and background pixels are gray.

读取并显示一张航空照片。

unregistered = imread("westconcordaerial.png");
figure
imshow(unregistered)

Color photo of some roads and buildings as seen from the sky.

读取并显示一个正射影像。

figure
imshow("westconcordorthophoto.png")

Grayscale photo of the same roads and buildings as seen from a different point in the sky. The scene is rotated, translated, and tilted with respect to the aerial photo.

加载先前选取的控制点。

load westconcordpoints

使用这些点创建投影变换的变换结构体。

t_concord = cp2tform(movingPoints,fixedPoints,"projective");

获取正射影像的宽度和高度,执行变换,并查看结果。

info = imfinfo("westconcordorthophoto.png");

registered = imtransform(unregistered,t_concord,...
    "XData",[1 info.Width],"YData",[1 info.Height]);
figure
imshow(registered)

The transformed color photo appears to be captured from the same point in the sky as the grayscale orthophoto.

输入参数

全部折叠

要变换的图像,指定为任意维度的数值或逻辑数组。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

变换结构体,指定为 TFORM 结构体,如 maketform 返回的结构体。变换的第一个维度是水平或 x 坐标,第二个维度是垂直或 y 坐标。该约定与 MATLAB® 中的数组下标约定相反。

插值方法,指定为下列值之一。

插值方法描述
"bilinear"线性插值
"nearest"最近邻插值 - 赋给输出像素的值就是输入点所在像素的值。不考虑其他像素。
"bicubic"三次插值
resampler 结构体makeresampler 返回的 resampler 结构体。此选项允许对 imtransform 如何执行重采样进行更多控制。

数据类型: char

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: "FillValues",128

输入图像 A 在 U-V 输入空间中的空间范围,指定为二元素数值向量。UDataVData 的值表示在世界坐标系中的坐标。UData 的两个元素分别给出 A 的第一列和最后一列的 u 坐标(水平)。VData 的两个元素给出 A 的第一行和最后一行的 v 坐标(垂直)。

默认情况下,A 在 U-V 空间中的空间范围与在内部坐标中的图像范围相同。换句话说,UData 的默认值为 [1 size(A,2)]VData 的默认值为 [1 size(A,1)]

变换后的图像 B 在 X-Y 输入空间中的空间范围,指定为二元素数值向量。XDataYData 的值表示在世界坐标系中的坐标。XData 的两个元素分别给出 B 的第一列和最后一列的 x 坐标(水平)。YData 的两个元素给出 B 的第一行和最后一行的 y 坐标(垂直)。

如果您没有指定 XDataYData,则 imtransform 会估计包含整个变换后输出图像的值。为了确定这些值,imtransform 使用 findbounds 函数。

X-Y 输出空间中像素的大小,指定为数值标量或二元素数值向量。如果 XYScale 是标量,则输出像素为正方形,XYScale 指定边长。否则,XYScale 的两个元素分别指定 X-Y 空间中每个输出像素的宽度和高度。

XYScale 的默认值取决于您是否指定 Size

  • 如果您指定 Size,则 imtransform 根据 SizeXDataYData 计算 XYScale

  • 如果您没有指定 Size,则 imtransform 使用 XYScale 的输入像素的比例,除非会导致输出图像过大。

注意

如果沿用输入图像的比例会导致输出图像过大,imtransform 函数会自动增加 XYScale 的值。要确保输出像素比例与输入像素比例相匹配,请指定 XYScale 参数。例如,使用下列语法调用 imtransform

B = imtransform(A,T,"XYScale",1)

变换后的图像 B 的大小,指定为由正整数组成的二元素向量。Size 的两个元素分别指定输出图像 B 的行数和列数。对于更高的维度,imtransform 直接取输入图像 A 的大小作为 B 的大小。因此,k > 2 时,size(B,k) 等于 size(A,k)

如果您没有指定 Size,则 imtransform 基于 XDataYDataXYScale 获取该值。

用于输入图像边界之外输出像素的填充值,指定为一个数值标量或数值数组。如果输出像素对应的位置经逆变换后完全处于输入图像边界之外,则将对该输出像素使用填充值。

  • 如果输入图像 A 为二维,则 FillValues 必须为标量。

  • 如果 A 为三维或 N 维,则 FillValues 可以是数组,其大小满足以下约束:size(FillValues,k) 必须等于 size(A,k+2)1

    例如,如果 A 是 200×200×3 uint8 RGB 图像,则 FillValues 可以取以下值。

    填充
    0用黑色填充
    [0;0;0]用黑色填充
    255用白色填充
    [255;255;255]用白色填充
    [0;0;255]用蓝色填充
    [255;255;0]用黄色填充

    对于第二个示例,如果 A 为四维且大小为 200×200×3×10,则您可以将 FillValues 指定为标量、1×10 向量、3×1 向量或 3×10 矩阵。

输出参量

全部折叠

变换后的图像,以与输入图像 A 具有相同维度的数值或逻辑数组形式返回。

变换后的图像 B 在 X-Y 输出空间中的水平范围,以二元素数值向量形式返回。xdata 的两个元素分别给出 B 的第一列和最后一列在世界坐标系中的 x 坐标(水平)。

注意

如果指定了此项,则 xdata 的第一个元素始终等于 XData 参量的第一个元素。但是,xdata 的第二个元素有时并不恰好等于 XData 的第二个元素。值之所以不同,可能是因为需要整数行和整数列,也可能是因为您为 XDataYDataXYScaleSize 指定的值不完全一致。

变换后的图像 B 在 X-Y 输出空间中的垂直范围,以二元素数值向量形式返回。ydata 的两个元素分别给出 B 的第一行和最后一行在世界坐标系中的 y 坐标(垂直)。

注意

如果指定了此项,则 ydata 的第一个元素始终等于 YData 参量的第一个元素。但是,ydata 的第二个元素有时并不恰好等于 YData 的第二个元素。值之所以不同,可能是因为需要整数行和整数列,也可能是因为您为 XDataYDataXYScaleSize 指定的值不完全一致。

提示

  • 图像配准。imtransform 函数会自动平移输出图像的原点,以尽可能多地显示变换后的图像。如果您使用 imtransform 进行图像配准,语法 B = imtransform(A,tform) 可能会产生意外的结果。要控制输出图像的空间位置,请显式设置 XDataYData

  • 纯平移。使用纯平移变换调用 imtransform 函数会产生与输入图像完全相同的输出图像,除非您在对 imtransform 的调用中指定 XDataYData 值。例如,如果您希望输出与输入大小相同,同时又显示它相对于输入图像发生了平移,请使用下列语法调用 imtransform

    B = imtransform(A,T,"XData",[1 size(A,2)],...
       "YData",[1 size(A,1)])

    有关此主题的详细信息,请参阅Perform Simple 2-D Translation Transformation

  • 变换速度。如果您没有使用 XDataYData 指定 B 的输出空间位置,则 imtransform 会使用函数 findbounds 自动估计位置。您可以使用 findbounds 作为一些常用变换(如仿射或投影)的快速前向映射选项。对于没有正向映射的变换,如 fitgeotform2d 计算的多项式变换,findbounds 可能需要更长的时间。如果您可以直接为这些变换指定 XDataYData,则 imtransform 的运行速度可能会明显加快。

  • 裁剪。使用 findboundsXDataYData 进行自动估计时有可能裁剪输出图像。为避免裁剪,请直接设置 XDataYData

版本历史记录

在 R2006a 之前推出