imwarp
对图像应用几何变换
语法
说明
[___] = imwarp(___,
指定要使用的插值的类型。interp
)
[___] = imwarp(___,
指定名称-值对组参数来控制几何变换的各个方面。 Name,Value
)
提示
如果输入变换 tform
未定义正向变换,则使用 OutputView
名称-值对组参数来加速变换。
示例
对图像应用水平剪切
将灰度图像读入工作区并显示它。
I = imread('cameraman.tif');
imshow(I)
创建一个二维几何变换对象。
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)
对三维 MRI 数据集应用旋转变换
将三维 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
创建一个三维几何变换对象。首先创建一个围绕 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
将两个坐标区的视图链接在一起。
linkprop([hAxOriginal,hAxRotated],'View');
设置视图以查看旋转效果。
set(hAxRotated,'View',[-3.5 20.0])
使用不同输出视图样式使图像发生畸变
读取并显示图像。要查看图像的空间范围,请使坐标区可见。
A = imread('kobi.png'); iptsetpref('ImshowAxesVisible','on') imshow(A)
创建一个二维仿射变换。此示例创建一个随机变换,该变换包括按 [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');
imshow(BFollowOutput)
title('FollowOutput Bounds Style');
imshow(BSameAsInput)
title('SameAsInput Bounds Style');
iptsetpref('ImshowAxesVisible','off')
输入参数
A
- 要变换的图像
数值数组 | 逻辑数组 | 分类数组
要变换的图像,指定为任意维度的数值、逻辑或分类数组。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
| categorical
D
- 位移场
数值数组
位移场,指定为数值数组。位移场定义输出图像的网格大小和位置。位移值以像素为单位。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
interp
- 使用的插值的类型
'nearest'
| 'linear'
| 'cubic'
使用的插值的类型,指定为下列值之一。
插值方法 | 说明 |
---|---|
'nearest' | 最近邻点插值。赋给输出像素的值就是输入点所在像素的值。不考虑其他像素。 最近邻点插值是分类图像支持的唯一方法,也是此类型的图像的默认方法。 |
'linear' | 线性插值。这是数值和逻辑图像的默认插值方法。 |
'cubic' | 三次插值 |
数据类型: char
| string
名称-值参数
示例: 'FillValues',255
使用填充值 255
指定可选的、以逗号分隔的 Name,Value
对组参数。Name
为参数名称,Value
为对应的值。Name
必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN
。
OutputView
- 输出图像的大小和位置
imref2d
对象 | imref3d
对象
输出图像在世界坐标系中的大小和位置,指定为由 'OutputView'
和 imref2d
或 imref3d
空间参照对象组成的以逗号分隔的对组。对象具有定义输出图像大小和输出图像在世界坐标系中位置的属性。
您可以使用 affineOutputView
函数创建输出视图。要复制由 imwarp
计算的默认输出视图,请使用 affineOutputView
的默认边界样式 ('CenterOutput'
)。
在指定了输入位移场 D
时,将无法指定 OutputView
。
FillValues
- 填充值
数值标量 | 数值数组 | 字符串标量 | 字符向量 | missing
当输出图像落在输入图像之外时的填充值,指定为由 'FillValues'
和下列值之一组成的以逗号分隔的对组。如果输出像素对应的位置经逆变换后完全处于输入图像边界之外,imwarp
将对该输出像素使用填充值。
数值和逻辑图像的默认填充值为 0
。分类图像的默认填充值为 missing
,对应于 <undefined>
类别。
图像类型 | 变换维度 | 填充值的格式 |
---|---|---|
二维灰度或逻辑图像 | 二维 |
|
二维彩色图像或二维多光谱图像 | 二维 |
|
包含 p 个二维图像的序列 | 二维 |
|
N 维图像 | 二维 |
|
三维灰度或逻辑图像 | 二维 |
|
分类图像 | 二维或三维 |
|
示例: 255
表示用白色像素填充 uint8
图像
示例: 1
表示用白色像素填充 double
图像
示例: [0 1 0]
表示用绿色像素填充 double
彩色图像
示例: 对于一个包含两个 double
彩色图像的序列,[0 1 0; 0 1 1]'
表示用绿色像素填充第一个图像,用青色像素填充第二个图像
示例: "vehicle"
表示用 "vehicle" 类别填充分类图像
SmoothEdges
- 填充图像以创建平滑边缘
false
(默认) | true
填充图像以创建平滑边缘,指定为 true
或 false
。当设置为 true
时,imwarp
通过用 FillValues
指定的值填充输入图像,在输出图像中创建更平滑的边缘。当设置为 false
时,imwarp
不会填充图像。对输入图像选择 false
(不填充)会使输出图像的边缘更加锐利。当并排配准两个图像时,这种更锐利的边缘可能有助于最小化接缝失真。
输出参数
算法
imwarp
通过将输出图像中的位置映射到输入图像中的对应位置来确定输出图像中像素的值(逆映射)。imwarp
在输入图像中进行插值,以计算输出像素值。
下图说明了一种平移变换。按照惯例,输入空间中的坐标轴标记为 u 和 v,输出空间中的坐标轴标记为 x 和 y。在图中,请注意 imwarp
修改了定义输入图像中像素位置的空间坐标。(1,1) 处的像素现在位于 (41,41)。在棋盘图像中,每个黑色、白色和灰色正方形的高度和宽度均为 10 个像素。有关空间坐标和像素坐标之间区别的详细信息,请参阅图像坐标系。
输入图像平移后
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
imwarp
支持 C 代码生成(需要 MATLAB® Coder™)。请注意,如果您选择通用的MATLAB Host Computer
目标平台,imwarp
生成的代码将使用平台特定的预编译共享库。使用共享库可保留性能上的优化,但适用范围仅限于生成的代码所适用的目标平台。有关详细信息,请参阅Image Processing Toolbox 中代码生成支持的类型。不支持分类数据类型的输入图像。
几何变换对象输入
tform
必须为rigid2d
、affine2d
或projective2d
对象。插值方法和可选参数名称必须为常量。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
使用说明和限制:
不支持分类数据类型的输入图像。
几何变换对象输入
tform
必须为rigid2d
、affine2d
或projective2d
对象。插值方法和可选参数名称必须为常量。
不支持空间参照信息输出
RB
。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
版本历史记录
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)