Main Content

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

imtransform

将二维空间变换应用于图像

不建议使用 imtransform。请改用 imwarp

说明

示例

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

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

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)

投影变换

用投影变换将正方形映射到一个不规则四边形。设置输入坐标系,将输入图像填充到顶点为 (0 0)、(1 0)、(1 1)、(0 1) 的单位正方形。

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

变换为具有顶点 (-4 2)、(-8 3)、(-35)、(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)

图像配准

将航拍照片读入 MATLAB® 工作区并查看它。

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

将正射影像读入 MATLAB 工作区并查看它。

figure
imshow('westconcordorthophoto.png')

加载先前选取的控制点。

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)

输入参数

全部折叠

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

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

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

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

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

数据类型: char

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN

示例: B = imtransform(A,T,'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 获取该值。

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

  • 如果输入图像 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 作为一些常用变换(如仿射或投影)的快速前向映射选项。对于没有正向映射的变换,如 fitgeotrans 计算的多项式变换,findbounds 可能需要更长的时间。如果您可以直接为这些变换指定 XDataYData,则 imtransform 的运行速度可能会明显加快。

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

  • 任意维度变换。使用 imtransform 时,对 tform 使用二维变换。有关任意维度数组变换,请参阅 tformarray

在 R2006a 之前推出