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. The axes contains an object of type image.

创建一个二维几何变换对象。

tform = affine2d([1 0 0; .5 1 0; 0 0 1])
tform = 
  affine2d with properties:

                 T: [3x3 double]
    Dimensionality: 2

对图像应用变换。

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

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

将三维 MRI 数据读入工作区并可视化这些数据。

s = load('mri');
mriVolume = squeeze(s.D);
sizeIn = size(mriVolume);
hFigOriginal = figure;
hAxOriginal  = axes;
slice(double(mriVolume),sizeIn(2)/2,sizeIn(1)/2,sizeIn(3)/2);
grid on, shading interp, colormap gray

Figure contains an axes. The axes contains 3 objects of type surface.

创建一个三维几何变换对象。首先创建一个围绕 y 轴旋转图像的变换矩阵。然后基于变换矩阵创建一个 affine3d 对象。

theta = pi/8;
t = [cos(theta)  0      -sin(theta)   0
     0             1              0     0
     sin(theta)    0       cos(theta)   0
     0             0              0     1];
tform = affine3d(t)
tform = 
  affine3d with properties:

                 T: [4x4 double]
    Dimensionality: 3

对图像应用变换。

mriVolumeRotated = imwarp(mriVolume,tform);

通过变换后的三维体的中心可视化三个切片平面。

sizeOut = size(mriVolumeRotated);
hFigRotated = figure;
hAxRotated  = axes;
slice(double(mriVolumeRotated),sizeOut(2)/2,sizeOut(1)/2,sizeOut(3)/2)
grid on, shading interp, colormap gray

Figure contains an axes. The axes contains 3 objects of type surface.

将两个坐标区的视图链接在一起。

linkprop([hAxOriginal,hAxRotated],'View');

设置视图以查看旋转效果。

set(hAxRotated,'View',[-3.5 20.0])

Figure contains an axes. The axes contains 3 objects of type surface.

Figure contains an axes. The axes contains 3 objects of type surface.

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

A = imread('kobi.png');
iptsetpref('ImshowAxesVisible','on')
imshow(A)

Figure contains an axes. The axes 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. The axes with title CenterOutput Bounds Style contains an object of type image.

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

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

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

Figure contains an axes. The axes 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

要应用的几何变换,指定为 rigid2daffine2dprojective2drigid3daffine3d 对象。

  • 如果 tform 为二维并且 A 有两个以上的维度(例如对于 RGB 图像),则 imwarp 会将相同的二维变换应用于沿更高维度的所有二维平面。

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

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

  • 如果 A 是二维图像,则 D 是 m×n×2 数组。位移场的第一个平面 D(:,:,1) 说明加性位移的 x 分量。imwarp 将这些值添加到 D 中的列和行位置,以在 A 中生成重映射位置。位移场的第二个平面 D(:,:,2) 说明加性位移值的 y 分量。对于具有多个颜色通道的二维彩色或多光谱图像,imwarp 对每个通道应用相同的 m×n×2 位移场。

  • 如果 A 是三维图像,则 D 是 m×n×p×3 数组。位移场的第一个平面 D(:,:,1) 说明加性位移的 x 分量。imwarp 将这些值添加到 D 中的列和行位置,以在 A 中生成重映射位置。同样,位移场的第二个和第三个平面分别说明加性位移值的 y 和 z 分量。

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

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

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

插值方法说明
'nearest'

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

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

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

数据类型: char | string

名称-值对组参数

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

示例: J = imwarp(I,tform,'FillValues',255) 使用白色像素作为填充值。

输出图像在世界坐标系中的大小和位置,指定为由 'OutputView'imref2dimref3d 空间参照对象组成的以逗号分隔的对组。对象具有定义输出图像大小和输出图像在世界坐标系中位置的属性。

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

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

当输出图像落在输入图像之外时的填充值,指定为由 'FillValues' 和下列值之一组成的以逗号分隔的对组。如果输出像素对应的位置经逆变换后完全处于输入图像边界之外,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 在输入图像中进行插值,以计算输出像素值。

下图说明了一种平移变换。按照惯例,输入空间中的坐标轴标记为 uv,输出空间中的坐标轴标记为 xy。在图中,请注意 imwarp 修改了定义输入图像中像素位置的空间坐标。(1,1) 处的像素现在位于 (41,41)。在棋盘图像中,每个黑色、白色和灰色正方形的高度和宽度均为 10 个像素。有关空间坐标和像素坐标之间区别的详细信息,请参阅图像坐标系

输入图像平移后

扩展功能

在 R2013a 中推出