用MATLAB进行图像处理

图像处理概念,算法和MATLAB

R2022b中新的几何变换矩阵约定

在R2022b版本中,图像处理工具箱包括几个新的几何变换对象,例如 rigidtform2d affinetform3d ,等等,使用 自左乘 矩阵惯例而不是 自右乘 公约。其他几个相关的工具箱函数,例如 imregtform ,现在优先使用这些新对象。在计算机视觉工具箱和激光雷达工具箱中有一些函数现在使用预乘法约定和新对象。这些变化也提高了与机器人系统工具箱和导航工具箱的设计一致性。
有关文档中的关键信息,请参见:
在今天的文章中,我将解释这一切是如何发生的,为什么发生,以及它对用户有什么影响。

仿射变换矩阵

所讨论的矩阵定义了仿射变换和射影变换,包括平移、旋转、刚性变换和相似变换。在接下来的讨论中,我将重点关注仿射变换,但同样的概念也适用于射影变换。
对于二维空间,仿射变换矩阵是a $ 3 \乘以3 $ 映射一个二维点的矩阵, $ (u,v) $ ,使用矩阵乘法,像这样:
[xy1]=[abcdef001]×[uv1]=A×[uv1]" style="vertical-align:-26px"> x y 1 一个 b c d e f 0 0 1 × u v 1 一个 × u v 1
当仿射变换写成如上所示时,第三行 一个 总是 [001]" style="vertical-align:-5px"> 0 0 1 .因为矩阵出现在它所乘的向量之前,我称它为 自左乘公约
这个运算还有另一种写法。你可以把所有东西转置,像这样:
[xy1]=[uv1]×[ad0be0cf1]=[uv1]×B" style="vertical-align:-26px"> x y 1 u v 1 × 一个 d 0 b e 0 c f 1 u v 1 × B
在这种形式中,矩阵出现在向量之后,所以我称它为 自右乘公约 .请注意, 一个 而且 B 由矩阵转置相关: $ a = b ^{t} $ , $ b = a ^{t} $

竞争的约定

第一个包含通用几何图像转换函数的图像处理工具箱发布于1999年至2001年。当时,许多讨论图像几何变换的最有用的出版物都在计算机图形学文献中。两种矩阵惯例,前乘和后乘,都被使用了。您学习的约定取决于您阅读的书籍和论文,或者您使用的图形软件框架,如OpenGL或DirectX。
当时我受到了这本书的影响 数字图像翘曲 ,它使用了后乘惯例。我还认为后乘约定和常用的MATLAB表示约定一起工作得很好 P 二维点作为a $ P \乘以2 $ 矩阵。
digital-image-warping.jpg 仿射转换- 3 - 3. - png
由于这些影响,最初的工具箱功能, maketform 而且 imtransform ,以及下一代函数, imwarp 而且 affine2 D和其他的,使用后乘惯例。
几年之内,很明显,这种设计选择让人们感到困惑。我提到过我的困惑 2006年2月07日关于仿射几何变换的博客文章

决定改变公约

自2001年以来,前乘法惯例使用得比后乘法惯例广泛得多。最流行的信息来源,如 维基百科 ,使用前置乘法约定。结果,我们使用的后乘惯例让更多人感到困惑。我们可以在许多帖子中看到这种困惑 MATLAB的答案 以及技术支持请求。图像处理工具箱和计算机视觉工具箱团队的开发人员得出结论,我们应该尝试做一些事情,即使这可能是困难和耗时的。设计工作始于2021年春季。在今年的冬天和春天,最后的推动是一个团队的努力(见下文),包括多个团队的开发人员、作家和质量工程师。

新的几何变换类型

R2022b版本的图像处理工具箱介绍了这些新类型:
  • projtform2d-二维射影几何变换
  • affinetform2d-二维仿射几何变换
  • simtform2d-二维相似度几何变换
  • rigidtform2d-二维刚性几何变换
  • transltform2d-二维平移几何变换
  • affinetform3d-三维仿射几何变换
  • simtform3d-三维相似度几何变换
  • rigidtform3d-三维刚性几何变换
  • transltform3d-三维平移几何变换
我们鼓励每个人开始使用这些类型,而不是早期的类型集: projective2d affine2d rigid2d affine3d , rigid3d

使用新类型

当你从一个变换矩阵中得到一个新的变换类型时,使用前置乘法形式。对于预乘法形式的仿射矩阵,底下一行是 [001]" style="vertical-align:-5px"> 0 0 1
A = [1.5 0 10;0.1 2 15;0 0 1]
一个= 3×3
1.5000 0 10.0000 0.1000 2.0000 15.0000 00 1.0000
tform = affinetform2d(A)
tform =
affinetform2d属性:维度:2 A: [3×3 double]
tform。一个
ans = 3×3
1.5000 0 10.0000 0.1000 2.0000 15.0000 00 1.0000
为了简化转换,新类型要尽可能地与为旧类型编写的代码互操作。例如,让我们看一下旧函数, affine2d
T = a '
T = 3×3
1.5000 0.1000 00 2.0000 0 10.0000 15.0000 1.0000
tform_affine2d = affine2d
tform_affine2d =
affine2d与属性:T: [3×3 double]维数:2
tform_affine2d。T
ans = 3×3
1.5000 0.1000 00 2.0000 0 10.0000 15.0000 1.0000
对于旧的类型, T 性质是变换矩阵的后乘形式。对于新的类型, 一个 性质是变换矩阵的前乘形式。
虽然它是隐藏的,新类型也有一个 T 属性,这个属性包含后乘形式的变换矩阵。
tform
tform =
affinetform2d属性:维度:2 A: [3×3 double]
tform。一个
ans = 3×3
1.5000 0 100.0000 0.1000 2.0000 15.0000 00 1.0000
tform。T
ans = 3×3
1.5000 0.1000 00 2.0000 0 100.0000 15.0000 1.0000
这个隐藏属性在那里,如果你有代码来获取或设置 T 属性,则您将能够使用新类型而无需更改该代码。设置或获取 T 属性将自动设置或获取相应的 一个 财产。
tform.T(3,1) = 100;
tform。T
ans = 3×3
1.5000 0.1000 00 2.0000 0 100.0000 15.0000 1.0000
tform。一个
ans = 3×3
1.5000 0 100.0000 0.1000 2.0000 15.0000 00 1.0000

翻译,刚性,和相似变换

除了泛型仿射变换,新类型还包括更专门化的变换 翻译 刚性 , 相似 .你可以使用比仿射变换矩阵更直观的参数来创建这些矩阵。例如, 刚性 变换是旋转和平动的结合,所以你可以创建一个 rigidtform2d 对象通过直接指定旋转角度(以度为单位)和平移向量。
R_tform = rigidtform2d(45,[0.2 0.3])
r_tform =
rigidtform2d与属性:维度:2旋转角度:45翻译:[0.2000 0.3000]R: [2×2 double] A: [3×3 double]
如果你问 R (旋转矩阵)或 一个 (仿射变换矩阵),它由旋转和平移参数直接计算。
r_tform。R
ans = 2×2
0.7071 -0.7071 0.7071
r_tform。一个
ans = 3×3
0.7071 -0.7071 0.2000 0.7071 0.7071 0.3000 00 1.0000
你可以直接改变这些矩阵,但前提是结果是一个有效的刚性变换。下面的赋值只改变了水平平移偏移量,是允许的,因为结果仍然是一个刚性转换:
r_tform.A(1,3) = 0.25
r_tform =
rigidtform2d与属性:维度:2旋转角度:45翻译:[0.2500 0.3000]R: [2×2 double] A: [3×3 double]
但是如果你试着改变左上角 $ 2 \乘以2 $ 子矩阵,所以它不是一个旋转矩阵,你会得到一个错误:
rigid-tform-error.png

转换点和图像

转换点和图像的工作方式与旧对象相同。
[x,y] = transformPointsForward(r_tform,2,3)
X = -0.4571
Y = 3.8355
[u,v] = transformPointsInverse(r_tform,x,y)
U = 2
V = 3
下面的代码生成100对随机点,转换它们使用 r_tform 从上面开始,然后画出从原点到变换后的点的线段。
Xy =兰特(100,2)- 0.5;
uv = transformPointsForward(r_tform,xy);
clf
持有
K = 1:size(xy,1)
Plot ([xy(k,1) uv(k,1)],[xy(k,2) uv(k,2)])
结束
持有
平等的
imwarp 使用与以前相同的语法解释新的转换类型。
A = imread(“peppers.png”);
B = imwarp(A,r_tform);
imshow (B)

相关的工具箱

这些几何变换对象在几个MathWorks工具箱中被广泛使用。目前有 大约20个不同的文档示例使用rigidtform3d .这些例子来自以下产品:2022世界杯八强谁会赢?
  • 图像处理工具箱
  • 计算机视觉工具箱
  • 自动驾驶工具箱
  • 激光雷达的工具箱
以下是一个例子:
monocular-vision-example.png
build-map-lidar.png
ground-truth-and-estimated-maps.png
register-3d-images.png

学分

今年早些时候,我们花了一大群人的努力,对图像处理工具箱、计算机视觉工具箱、自动驾驶工具箱和激光雷达工具箱进行了所有的更改。我参与的图像处理工具箱的设计和实现相对简单,但计算机视觉工具箱的变化很大,而且相当复杂。感谢Corey、Paola和Qu的实现和设计工作。(科里,我很抱歉这个项目占用了你整个实习时间!我很高兴你现在正式加入了开发团队。)Witek帮助修改了计算机视觉工具箱的设计,以纳入过去几年的经验教训。(维特克是即将出版的2023年版 机器人,视觉和控制:MATLAB的基本算法 ,它使用前置乘法约定。)来自激光雷达工具箱团队的Kritika帮助设计和实现,Hrishikesh更新了一些示例。
Alex,谢谢你成为我的图像处理工具箱设计伙伴;你的经验是无价的。Vignesh,谢谢你给我关于代码生成的建议。阿希什,谢谢你在最后一刻救了我,提供了关键的执行帮助。Jessica为所有四个产品提供了大量的文档和示例更新。2022世界杯八强谁会赢?Abhi帮助在紧迫的期限内完成了最终的多产品集成并进行了验证。
谢谢大家!
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。

Baidu
map