仿射空间中几种基本映射的矩阵表述
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仿射空间中几种基本映射的矩阵表述相关的知识,希望对你有一定的参考价值。
参考技术A在 用矩阵表述变换与齐次坐标 一文中我们了解了旋转、平移的矩阵表述。在这里,我们试着总结一下仿射空间中其他几种映射的矩阵表述。
为了方便观察,在这里我们仅讨论二维空间中的基本变换。对于每一个变换,我们采取方程组,坐标系图,矩阵分别描述,便于理解。
需要注意,在这里我们只讨论比较常用的“坐标系保持不动,向量绕坐标轴旋转”观点。
对于给定点 ,计算其绕 轴逆时针旋转 后新的坐标 。如下图所示:
由于涉及到角度,我们可以把笛卡尔坐标系转换为极坐标系,设 为极半径。则 点坐标为
相应的, 点坐标为
由方程组(1)、(2)可知, 关于 , 的方程为:
用4x4矩阵可以表述为:
即,三维旋转变换矩阵为:
同样的方法,我们可以得出下面几种常见的旋转变换矩阵:
我们通常讨论物体延一个或多个坐标轴方向的缩放,每一个坐标轴方向都有其单独的缩放因子。
当所有坐标轴方向的缩放因子一样时,此时的缩放叫做 均匀缩放 或 位似变换 。均匀缩放的结果在几何意义上相似于原始物体。
当各坐标轴方向的缩放因子不同时,缩放后结果的形状可能发生变化,此时的缩放被叫做 方向缩放 。
对于给定物体中某一点 ,计算其均匀缩放 ( 时为放大, 时为缩小)后的结果 。
在这里,我们讨论的是三维空间的均匀缩放。但是为了便于观察,我使用了二维平面的均匀缩放的图示。
如图所示,我们已知点 的坐标,则 坐标可表示为
用4x4矩阵表示为
即,三维缩放变换矩阵为:
同样的方法,我们可以得出下面几种常见的缩放变换矩阵(缩放因子 ):
平移是一种等距同构的变换,它可以被视为某一向量施加于物体每一点的结果。即,设 是已知向量, 为空间中一点,则平移
对同一物体的多次连续平移,其结果可用一次平移表示,它符合向量的加法法则。即
对于给定点 ,计算施加向量 的平移结果 。
同样,为了便于观察,我们使用二维空间的平移图示。如下图:
如图所示,我们已知点 的坐标,则点 坐标可表示为
用4x4矩阵表示为
即平移变换矩阵为
需要注意,这里的反射与渲染阶段的光线“反射”不是同一个概念。这里是指数学意义上的反射。
对于给定点 ,计算其针对 平面的镜像结果。如下图所示:
由上图可以很容易得到, 关于 , , 的方程组
用4x4矩阵表示为
即 针对平面 的反射映射矩阵为
同样可以得出以下一些常见的反射变换矩阵
投影是生活中“平行投影”概念的形式化和一般化。例如,在现实生活中,阳光照射物体在地面留下的影子。我们假设阳光是沿着同一方向(平行且垂直于地面的)照射物体,地面是严格的平面。那么,这就是投影最直观的例子。
对于给定点 ,计算其在平面 上的投影点 。如下图:
如上图所示,直线 是直线 在平行于X轴方向上绕Z轴的错切。
此时,点 经过错切的结果点 关于 , , 的方程组为
用4x4矩阵表述为
即水平方向(平行于X轴方向)上的错切变换矩阵为
相应的,我们可以算出一下几种常见的错切变换矩阵( 为错切因子):
上面我们已经了解了反射空间几种基本变换的矩阵表述。下面我们来重新整理一下,首先看如下适用于列向量的4x4矩阵。
我们可以很容易地发现,对于矩阵A
元素 与线性变换有关;
元素 与仿射变换有关。
那么,元素 有什么作用呢?
其实,这三个元素与透视投影变换有关。用矩阵表述变换是不是非常神奇?
图像处理之_仿射变换与透视变换
参考技术A 旋转 (线性变换),平移(向量加).缩放(线性变换),错切,反转仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式.
以上公式将点(x,y)映射到(x’,y’),在OpenCV中通过指定一个2x3矩阵实现此功能(公式中的m矩阵,是线性变换和平移的组合,m11,m12,m21,m22为线性变化参数,m13,m23为平移参数,其最后一行固定为0,0,1,因此,将3x3矩阵简化为2x3)
a) 以原点为中心旋转,2x3矩阵为:
[ cos(theta), -sin(theta), 0 ],
[ sin(theta), cos(theta), 0 ]
则
x’ = x * cos(theta) - sin(theta) * y
y’ = x * sin(theta) + cos(theta) * y
b) 平移,2x3矩阵为
[1,0,tx],
[0,1,ty]
则
x’ = x * 1 + y * 0 + tx = x + tx
y’ = x * 0 + y * 1 + ty = y + ty
在OpenCV中,仿射变换通过函数cvWrapAffine(src,dst,mat)实现,其中mat是2x3的仿射矩阵,该矩阵可以利用函数cvGetAffineTransform(srcTri,dstTri,mat)得到,其中mat是被该函数填充的仿射矩阵,srcTri和dstTri分别是由三个顶点定义的平行四边形(由于是平行四边形,只需要指定三个顶点即可确定),即:给出变换前的ABCD和变换后的A’B’C’D’
将2D矩阵图像变换成3D的空间显示效果,全景拼接.
透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换.
以上公式设变换之前的点是z值为1的点,它三维平面上的值是x,y,1,在二维平面上的投影是x,y,通过矩阵变换成三维中的点X,Y,Z,再通过除以三维中Z轴的值,转换成二维中的点x’,y’.从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间(而不是另一个二维空间).
在OpenCV中,透视变换通过函数cvWrapPerspective(src,dst,mat)实现, 与仿射变换不同的是,透视矩阵是一个3x3的矩阵,在计算矩阵时,可利用函数cvGetPerspectiveTransform(srcQuad,dstQuad,mat),由于不再是平行四边形,需要提供四边形的四个顶点
仿射变换后平行四边形的各边仍操持平行,透视变换结果允许是梯形等四边形,所以仿射变换是透视变换的子集
以上是关于仿射空间中几种基本映射的矩阵表述的主要内容,如果未能解决你的问题,请参考以下文章