接上篇文章齐次坐标的理解(1):https://blog.csdn.net/m0_37957160/article/details/119549709
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。
1、齐次变换的两种解读
所以由上边我们可以基于两种理解:
(1)齐次坐标可以将n维空间中不明确的概念给明确出来。这句话如何理解呢?
比如在二维空间中不只可以表示一个坐标,还可以表示一个向量(向量就是有确定的长度哈确定的方向,他的位置是不固定的,在二维坐标系中它可以任意移动,只要他的长度和方向是固定的就行)。所以如果在二维形式下你写作是存在歧义的,其一表示向量,其二表示坐标。所以引入齐次坐标这种记法,表示向量写作;表示坐标的话写作;我们把n维变成n+1维,表示向量在后边添加0;表示坐标在后边添加1,表示n维的那个坐标。
这样,(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:
(1)从普通坐标转换成齐次坐标时:
如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0);
(2)从齐次坐标转换成普通坐标时 :
如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z);
以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移T、旋转R、缩放S这3个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向。而旋转和缩放对于向量和点都有意义。
此外,对于一个普通三维坐标的点 P=(Px, Py, Pz) ,有对应的一族齐次坐标 (wPx, wPy, wPz, w) ,其中 w 不等于零 。比如, P(1, 4, 7) 的齐次坐 标有 (1, 4, 7, 1) 、( 2, 8, 14, 2 )、( -0.1, -0.4, -0.7, -0.1 )等等 。 因此,如果把一个点从普通坐标变成齐次坐标,给 x,y,z 乘上同一个非零数 w ,然后增加第 4 个分量 w ;如果把一个齐 次坐标转换成普通坐标,把 前三个坐标同时除以第 4 个坐标,然后去掉第 4 个分量。
由于齐次坐标使用了 4 个分量来表达 3D 概念,使得平移变换可以使用矩阵进行,从而如 F.S. Hill, JR 所说,仿射(线性)变换的进行 更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。
-----所以很明显的区分向量和坐标。
(2)引入齐次坐标,可以非常方便的进行仿射(线性)几何变换。(简而言之就是很方便进行矩阵运算)
具体解释我们以二维图像的几何变换矩阵推导为例来进行解释:
2、二维图像的几何变换矩阵推导
常用到的二维图像的几何变换有三种:
- (1)平移
- (2)缩放
- (3)旋转
对二维图像做几何变换实际上就是把坐标变换为一个新的坐标。所以想进行变换就需要找到变换到之间的一个关系。
针对于三种变换我们会给出变换的公式形式以及变换的矩阵形式,使用变换的矩阵形式(矩阵形式的运算容易被计算机所理解和计算,并且效率很高C++中的Eigen运算)坐标。
图像的缩放变换和旋转变换,可以用矩阵乘法的形式来表达变换后的像素位置映射关系。
对于平移变换呢?平移变换表示的是位置变化的概念。如下图所示,一个图像矩形从中心点[x1,y1]平移到了中心点[x2,y2]处,整体大小和角度都没有变化。在x方向和y方向上分别平移了tx和ty大小。
显然:
平移变换:
这对于图像中的每一个点都是成立的。写成矩阵的形式就是:
平移矩阵形式:
我们再把前面的缩放变换和旋转变换的矩阵形式写出来:
缩放矩阵形式:
旋转变换形式:
我们注意到,缩放变换和旋转变换都可以表示成矩阵乘法的形式。实际上,图像的几何变换通常不是单一的,也就是说经常性的缩放、旋转、平移一起变换。例如先放大2倍,然后旋转45度,然后再缩小0.5倍。那么就可以表示成矩阵乘法串接的形式:
这样,不管有多少次变换,都可以用矩阵乘法来实现。但是平移变换呢?从前面看到,平移变换并不是矩阵乘法的形式,而是矩阵加法的形式!
那能不能把缩放变换、旋转变换、平移变换统一成矩阵乘法的形式呢,这样不管进行多少次变换,都可以表示成矩阵连乘的形式,将极大的方便计算和降低运算量。
这种方法就是“升维”,引入“齐次坐标”,将图像从平面2D坐标变成3D坐标。我们看看平移变换的矩阵形式:
将其升维,变成3维,上式就可以表示成:
升维之后才满足矩阵的乘法法则:3行3列乘以3行1列=3行1列;否则没有办法写成矩阵乘法的形式。
这样,平移变换通过升维后的齐次坐标,也变成了矩阵乘法的形式。当然缩放变换和旋转变换的矩阵形式也得改一改,统一变成3维的形式。
缩放变换:
旋转变换:
终于统一了。以后所有的变换,不管怎样变换,变换多少次,都可以表示成一连串的矩阵相乘了,这是多么的方便。这就是引入齐次坐标的第二种理解作用,把各种变换都统一了起来。
PS:齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。
许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为 x=R∗X+t(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X为原向量,x 为变换后的向量)。
具体的旋转变换见链接:https://blog.csdn.net/m0_37957160/article/details/111167036
https://wenku.baidu.com/view/7962a10376232f60ddccda38376baf1ffc4fe30c.html
参考链接:https://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html
https://blog.csdn.net/zhuiqiuzhuoyue583/article/details/95230246