失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲

matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲

时间:2020-10-06 02:19:19

相关推荐

matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲

本文同步发表在我的微信公众号“计算摄影学”,欢迎扫码关注

你有没有想过,下面这个视频中的特效应该如何实现?

Morphing Female Stars/video/1179863411041787904

【转载请注明来源与作者】

这个效果叫做面部变形(Face Morph),这里面将要用到一种叫做扭曲(Image Warp)的图像变换技术。在3. 数码相机内的图像处理-基本图像滤波中,我讲过基本的图像处理包括如下两大类,当时我重点介绍了图像的滤波类操作。

改变图像的像素值, 我们称为滤波(Filtering)改变图像的像素位置,我们称为扭曲(Warping)

图像的两类变换

而今天这篇文章则会给大家讲解2D图像的扭曲类操作。

1. 基本图像扭曲变换

2D图像的变换有多种,包括平移、旋转、比例缩放、仿射变换、透视变换、柱状变换等,如下图所示:

各种2D图像变换

我们来看看一种称之为Scaling的缩放变换,下面从图1到图2就是一次Scaling变换

如果用数学表达式表达,那么上述变换是:

如果我们对上述公式略加改造,变为:

那么得到的将是另外一种叫做Shear的变换:

对于图像的旋转,那么有:

上面的几种2D变换都可以这样表达,即图像中的每个点的坐标都经过一个矩阵M的改变来得到:

这里的M是一个2 x 2的矩阵,很多变换都可以这样来表达,例如

2. 齐次坐标

但并非所有的2D变换都可以用2 x 2的变换矩阵来表达,例如2D的平移:

这里 2 x 2的M就不存在,你可以仔细试试,看是否能行?

那么此时我们如何再把平移表现为矩阵M和点的乘法呢?这里就必须引入一种新的武器了,这就是所谓的齐次坐标。对于2D点来说,齐次坐标就是在原有的坐标分量上加入一个常量1

从定义上讲,其次坐标乘以任意常量后的三维向量间都是等价的

有了这个武器,我们就能够将2D坐标的平移表示为矩阵和点的乘积了

其中

这里有个例子:

我们再来看看其次坐标的一些更多特性:

齐次坐标具有一定的物理意义:

我们可以将一些常见的2D变换用齐次坐标表示如下,对应的矩阵M称为变换矩阵

当对一个点连续做多种不同的变换时,可以将多种变换的合并为一个矩阵

这里要注意的是,变换的顺序不同,结果可是不一样的哦!

3. 各种类型的扭曲变换及其自由度

各种类型的扭曲变换的变换矩阵如下图所示,包括平移变换(Translation)、刚体变换(Rigid)、相似变换(Similarity)、仿射变换(Affine)、投影变换(Projective)。

它们对应的变换矩阵如下:

平移、刚体、相似变换的变换矩阵拆开看如下所示, 它们的自由度,或者说控制变量,分别为2、3、4。

而仿射变换的自由度是6,它更加的复杂:

在3维空间中,仿射变换后的物体和变换前的物体位于同一个平面上。

最复杂的变换称为投影变换:

在3维空间中,仿射变换后的物体和变换前的物体位于通常不在同一个平面上。

4. 确定未知的图像变换

如果已经知道下面两个三角形 ABC和DEF,如果已知A变换为D,B变换为E,C变换为F,我们如何确定两者之间的变换类型?

我们可以观察到两者时间应该有:

旋转平移错切一点点缩放

根据前面所讲的各种变换模型,我们可以认为两者之间至少是一种仿射变换:

那么如何求取组成变换矩阵M的各个变量的值呢?这里我们认为:

先把变换关系表达如下:

这其实是一个2元1次方程组,其中已知的是x, y, x', y'。 相当于有两个等式,6个未知数。 那么我们知道为了确定所有未知数,我们至少需要6个方程,因此至少需要3对匹配点。

把这样的3对匹配点的变换关系累积起来,可以写成如下的关系:

于是,整个变换关系就可以表达为Ax=b这样非常简单的形式了,我们完全可以采用最小二乘法来求取x,即变换矩阵M的各个元素

有的时候,我们会遇到这种情况,即已知一对图像I1和I1', I1'由I1变换得到。 同时我们还有图像f,要求对f采用同样的变换得到一幅图像g'。 这时我们的有两种方法:

正向变换法:

首先在I1和I1’之间建立足够多对的匹配点对根据可能的先验知识,假设I1和I1'之间满足某种变换关系,例如假设他们之间满足仿射变换关系,或者投影变换关系,构建变换矩阵利用上面讲的方法,求取变换矩阵中的未知量对f上的点,应用此变换矩阵,将f(x,y)贴到g(x', y')上。

注意这里第4步

注意这里的第4步会遇到的问题,点(x,y)映射到了(x',y')上,但是x',y'是浮点数。此时我们的解决方案是将值f(x,y)散布(splatting)到(x',y')周围的整数坐标点上。这就存在g中一个点可能会收获(gather)多个源像素点值的可能性,这就要求我们还要计算这些值的加权均值。正向变换如此复杂,因此人们又考虑了另外一种方法叫做反向变换。

反向变换法

首先在I1和I1’之间建立足够多对的匹配点对根据可能的先验知识,假设I1和I1'之间满足某种变换关系,例如假设他们之间满足仿射变换关系,或者投影变换关系,构建变换矩阵T利用上面讲的方法,求取变换矩阵T中的未知量求取T的逆矩阵T-1对g上的点(x',y'),应用此变换矩阵T-1,可以得到源坐标(x,y)。把f(x,y)拷贝到g(x',y')即完成了变换

这里的关键问题依然是浮点数的处理

如果求得的(x,y)是浮点数,那么一般会采用插值方法来获取最终的值g(x',y'),典型的插值方法是双线性插值,其示意图如下:

在Matlab中,调用interp2函数即可方便的实现双线性插值。

5. 总结

今天我给各位介绍了2D图像的各种基本变换,包括动作包括平移、旋转、错切、缩放等,进一步我们引入了齐次坐标表达式,把基本的变换都用齐次坐标表达式统一起来了。接下来,我介绍了各种图像扭曲变换,包括平移变换、刚体变换、相似变换、仿射变换,以及投影变换。这些都是非常非常重要而基础的知识,在包括计算摄影在内的很多领域都发挥着重要的作用。例如,利用图像的扭曲变换,可以得到非常有趣的结果,例如Face Morphy(面部变形)。

希望今天的介绍对有帮助。正如我在计算摄影学及本专栏介绍中所说,计算摄影学是多种学科的综合学科。接下来的许多篇文章都会偏重于与计算摄影相关的投影几何相关的知识,从某种程度上讲它们更偏向于计算机视觉,敬请期待,别忘了给我点赞哦^_^

计算摄影学是综合学科

6. 参考文献

CMU Fall Computational Photography Course 15-463, Lecture 10/watch?v=pHlV-8UYlvw

如果觉得《matlab 通过矩阵变换使图像旋转平移_28. 图像扭曲》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。