Main Content

imwarp

对图像应用几何变换

说明

示例

B = imwarp(A,tform) 根据几何变换 tform 来变换数值、逻辑或分类图像 A。该函数在 B 中返回变换后的图像。

B = imwarp(A,D) 根据位移场 D 变换图像 A

[B,RB] = imwarp(A,RA,tform) 变换由图像数据 A 指定的空间参照图像及其关联的空间参照对象 RA。输出是由图像数据 B 指定的空间参照图像及其关联的空间参照对象 RB

[___] = imwarp(___,interp) 指定要使用的插值的类型。

示例

[___] = imwarp(___,Name,Value) 指定名称-值参数来控制几何变换的各个方面。

提示

如果输入变换 tform 未定义正向变换,则使用 OutputView 名称-值参数来加速变换。

示例

全部折叠

读取并显示灰度图像。

I = imread('cameraman.tif');
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

创建一个二维仿射变换。

A = [1 0.5 0; 0 1 0; 0 0 1];
tform = affinetform2d(A);

对图像应用变换。

J = imwarp(I,tform);
imshow(J)

Figure contains an axes object. The axes object contains an object of type image.

加载并显示一个三维 MRI 数据体图像。

load("mri");
mriVolume = squeeze(D);
volshow(mriVolume);

创建一个围绕 y 轴旋转图像的三维刚性变换对象。

theta = [0 22.5 0];
transl = [0 0 0];
tform = rigidtform3d(theta,transl);

对该图像应用变换并显示结果。

mriVolumeRotated = imwarp(mriVolume,tform);
volshow(mriVolumeRotated);

读取并显示图像。要查看图像的空间范围,请使坐标区可见。

A = imread("kobi.png");
A = imresize(A,0.25);
iptsetpref("ImshowAxesVisible","on")
imshow(A)

Figure contains an axes object. The axes object contains an object of type image.

创建一个二维仿射变换。此示例创建一个随机变换,该变换包括按 [1.2, 2.4] 范围内的因子缩放、按 [-45, 45] 度范围内的角度旋转以及按 [100, 200] 像素范围内的距离水平平移。

tform = randomAffine2d("Scale",[1.2,2.4],"XTranslation",[100 200],"Rotation",[-45,45]);

为图像和变换创建三个不同输出视图。

centerOutput = affineOutputView(size(A),tform,"BoundsStyle","CenterOutput");
followOutput = affineOutputView(size(A),tform,"BoundsStyle","FollowOutput");
sameAsInput = affineOutputView(size(A),tform,"BoundsStyle","SameAsInput");

使用每种不同输出视图样式将变换应用于输入图像。

BCenterOutput = imwarp(A,tform,"OutputView",centerOutput);
BFollowOutput = imwarp(A,tform,"OutputView",followOutput);
BSameAsInput = imwarp(A,tform,"OutputView",sameAsInput);

显示生成的图像。

imshow(BCenterOutput)
title("CenterOutput Bounds Style");

Figure contains an axes object. The axes object with title CenterOutput Bounds Style contains an object of type image.

imshow(BFollowOutput)
title("FollowOutput Bounds Style");

Figure contains an axes object. The axes object with title FollowOutput Bounds Style contains an object of type image.

imshow(BSameAsInput)
title("SameAsInput Bounds Style");

Figure contains an axes object. The axes object with title SameAsInput Bounds Style contains an object of type image.

iptsetpref("ImshowAxesVisible","off")

输入参数

全部折叠

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

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

几何变换,指定为表中列出的几何变换对象。

几何变换对象描述
二维线性几何变换
transltform2d平移变换
rigidtform2d刚性变换:平移和旋转
simtform2d相似变换:平移、旋转和各向同性缩放
affinetform2d仿射变换:平移、旋转、各向异性缩放、翻转和剪切
projtform2d投影变换
三维线性几何变换
transltform3d平移变换
rigidtform3d刚性变换:平移和旋转
simtform3d相似变换:平移、旋转和各向同性缩放
affinetform3d仿射变换:平移、旋转、各向异性缩放、翻转和剪切
非线性几何变换
geometricTransform2d二维几何变换
geometricTransform3d三维几何变换
PolynomialTransformation2D局部加权均值变换
PiecewiseLinearTransformation2D分段线性变换
LocalWeightedMeanTransformation2D局部加权均值变换
  • 如果 tform 为二维并且 A 有两个以上的维度(例如对于 RGB 图像),则 imwarp 会将相同的二维变换应用于沿更高维度的所有二维平面。

  • 如果 tform 为三维,则 A 必须为三维图像体。

注意

您还可以将 tform 指定为 rigid2drigid3daffine2daffine3dprojective2d 类型的对象。但是,不推荐使用这些对象。有关详细信息,请参阅兼容性注意事项

位移场,指定为数值数组。位移场定义输出图像的网格大小和位置。位移值以像素为单位。imwarp 假设 D 参照默认的内部坐标系。要估计位移场,请使用 imregdemons

  • 如果 A 是大小为 m×n 的二维灰度图像,则将位移场指定为 m×n×2 数组。D(:,:,1) 包含沿 x 轴的位移。imwarp 将这些值添加到 D 中的列和行位置,以在 A 中生成重新映射的位置。同样,D(:,:,2) 包含沿 y 轴的位移。

  • 如果 A 是大小为 m×n×c 的二维 RGB 或多光谱图像,并且您将 D 指定为 m×n×2 数组,则 imwarp 会独立地对每个二维颜色通道执行运算。D(:,:,1) 包含所有颜色通道沿 x 轴的位移。同样,D(:,:,2) 包含沿 y 轴的位移。

  • 如果 A 是大小为 m×n×p 的三维灰度图像,则请将位移场数组指定为 m×n×p×3 数组。D(:,:,:,1) 包含沿 x 轴的位移。imwarp 将这些值添加到 D 中的列、行和深度位置,以在 A 中生成重新映射的位置。同样,D(:,:,:,2)D(:,:,:,3) 包含沿 y 和 z 轴的位移。

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

要变换的图像的空间参照信息,对于二维变换指定为 imref2d 对象,对于三维变换指定为 imref3d 对象。

使用的插值的类型,指定为下列值之一。

插值方法描述
"nearest"

最近邻点插值。赋给输出像素的值就是输入点所在像素的值。不考虑其他像素。

最近邻点插值是分类图像支持的唯一方法,也是此类型的图像的默认方法。

"linear"线性插值。这是数值和逻辑图像的默认插值方法。
"cubic"三次插值

数据类型: char | string

名称-值参数

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

示例: B = imwarp(A,tform,FillValues=255) 使用填充值 255

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

示例: B = imwarp(A,tform,"FillValues",255) 使用填充值 255

输出图像在世界坐标系中的大小和位置,指定为 imref2dimref3d 空间参照对象。对象具有定义输出图像大小和输出图像在世界坐标系中位置的属性。

您可以使用 affineOutputView 函数创建输出视图。要复制由 imwarp 计算的默认输出视图,请使用 affineOutputView 的默认边界样式 ("CenterOutput")。

在指定了输入位移场 D 时,将无法指定 OutputView

当输出图像落在输入图像之外时的填充值,指定为表中的值之一。如果输出像素对应的位置经逆变换后完全处于输入图像边界之外,imwarp 将对该输出像素使用填充值。

数值和逻辑图像的默认填充值为 0。分类图像的默认填充值为 missing,对应于 <undefined> 类别。

图像类型

变换维度

填充值的格式

二维灰度或逻辑图像二维
  • 数值标量

二维彩色图像或二维多光谱图像二维
  • 数值标量

  • 包含 c 个元素的数值向量,为 c 个通道中的每个通道指定一个填充值。对于彩色图像,通道数 c 为 3。

包含 p 个二维图像的序列二维

  • 数值标量

  • c×p 数值矩阵。对于灰度图像,通道数 c 为 1,对于彩色图像为 3。

N 维图像二维
  • 数值标量

  • 数值数组,其大小与输入图像 A 的维度 3 至 N 相匹配。例如,如果 A 是 200×200×10×3,则 FillValues 可以是 10×3 数组。

三维灰度或逻辑图像二维
  • 数值标量

分类图像二维或三维
  • 图像中的有效类别,指定为字符串标量或字符向量。

  • missing,对应于 <undefined> 类别。有关详细信息,请参阅 missing

示例: 255 表示用白色像素填充 uint8 图像

示例: 1 表示用白色像素填充 double 图像

示例: [0 1 0] 表示用绿色像素填充 double 彩色图像

示例: 对于一个包含两个 double 彩色图像的序列,[0 1 0; 0 1 1]' 表示用绿色像素填充第一个图像,用青色像素填充第二个图像

示例: "vehicle" 表示用 "vehicle" 类别填充分类图像

填充图像以创建平滑边缘,指定为 truefalse。当设置为 true 时,imwarp 通过用 FillValues 指定的值填充输入图像,在输出图像中创建更平滑的边缘。当设置为 false 时,imwarp 不会填充图像。对输入图像选择 false(不填充)会使输出图像的边缘更加锐利。当并排配准两个图像时,这种更锐利的边缘可能有助于最小化接缝失真。

输出参数

全部折叠

变换后的图像,以与输入图像 A 具有相同数据类型的数值、逻辑或分类数组形式返回。

变换后图像的空间参照信息,以 imref2dimref3d 空间参照对象形式返回。

算法

imwarp 通过将输出图像中的位置映射到输入图像中的对应位置来确定输出图像中的像素值(逆映射)。当输出图像中的像素中心没有映射到输入图像中的像素中心时,imwarp 会在输入图像中进行插值,以计算输出像素值。

该图说明棋盘图像的平移变换,其中每个方块均为 10×10 像素。按照惯例,输入空间中的坐标轴标记为 uv,输出空间中的坐标轴标记为 xy。使用逆变换,将输出坐标空间中具有 (x,y) 坐标 (25,35) 的像素映射到输入坐标空间中的 (u,v) 坐标 (5,5)。

Checkerboard image in input coordinate space and translated checkerboard image in output coordinate space

imwarp 使用世界坐标执行映射。有关详细信息,请参阅图像坐标系

扩展功能

版本历史记录

在 R2013a 中推出

全部展开