齐次坐标

来源:互联网 发布:淘宝店改区域 编辑:程序博客网 时间:2024/05/17 04:42

 

齐次坐标的理解

    一直对齐次坐标这个概念的理解不够彻底,只见大部分的书中说道“齐次坐标在仿射变换中非常的方便”,然后就没有了后文,今天在一个叫做“三百年重生”的博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明,特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S.Hill, JR。

     由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来:

     对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b+ v3 c         (1)

 而对于一个p,则可以找到一组坐标(p1,p2,p3),使得 p – o = p1 a+ p2 b + p3 c            (2),

 

从上面对向量的表达,我们可以看出为了在坐标系中表示一个(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:o + p1 a+ p2 b + p3 c(3)

 

(1)(3)是坐标系下表达一个向量的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!

    我们现在把(1)(3)写成矩阵的形式:v = (v1 v2 v3 0) X (a b c o)

p = (p1 p2p3 1) X (a b c o),这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

 

这样,上面的(1, 4, 7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标(OrdinaryCoordinate)和齐次坐标(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所说,仿射(线性)变换的进行更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

 

   以上很好的阐释了齐次坐标的作用及运用齐次坐标的好处。其实在图形学的理论中,很多已经被封装的好的API也是很有研究的,要想成为一名专业的计算机图形学的学习者,除了知其然必须还得知其所以然。这样在遇到问题的时候才能迅速定位问题的根源,从而解决问题。

 

 所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。例如,二维点(x,y)的齐次坐标表示为(hx,hy,h)。由此可以看出,一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标(8,4,2)、(4,2,1)表示的都是二维点(4,2)。

给出点的齐次表达式[X Y H],就可求得其二维笛卡尔坐标,即

                                                              [X Y H]→= [x y 1]
        这个过程称为正常化处理。

        在几何意义上,相当于把发生在三维空间的变换限制在H=1的平面内。

        那么引进齐次坐标有什么必要,它有什么优点呢?

        许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量p'为变换后的向量)引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

其次,它可以表示无穷远的点。n+1维的齐次坐标中如果h=0,实际上就表示了n维空间的一个无穷远点。对于齐次坐标(a,b,h),保持a,b不变,|V|=(x1*x1,y1*y1,z1*z1)^1/2的过程就表示了标准坐标系中的一个点沿直线 ax+by=0 逐渐走向无穷远处的过程。

 

 

齐次坐标的概念和定义

实际上齐次坐标的概念解释很简单很简单。也没有太多的数学公式。
关于齐次坐标,能做什么。实际上,这句话已经说的很清楚了。
齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR
它既能够用来明确区分向量和点,
看到这句话,我们思考一下为什么?我们需要区分点和向量?。比如欧式坐标系统中(1,2),可以表示一个点也可以表示一个向量我们无法区分。这里我就不再详细解释齐次坐标是如何应区分点和向量的。实在是太简单了直接给出前人的总结就可以了。

(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)

详情参考下篇
http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html


同时也更易用于进行仿射(线性)几何变换
许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p*m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

 http://blog.csdn.net/pinbodexiaozhu/article/details/43373299

 

“齐次”之名?齐次坐标的数学定义及特性
如果我们要将欧式坐标的一个二维点 (1,2)(1,2)转换为齐次坐标,根据规则,我们可以选择刚才用到的 (1,2,1)(1,2,1),也可以选择 (2,4,2)(2,4,2),还可以选择(4,8,4),(8,16,8)...(4,8,4),(8,16,8)...,即(k,2k,k),kR(k,2k,k),kR都是合法的齐次坐标表示,这些点都映射到欧式空间中的一点,即这些点具有 尺度不变性(Scale Invariant),齐性的”(同族的),所以称之为齐次坐标。
同样的,线性系统的齐次性是指在输入量倍乘的情况下,输出同时倍乘同一因子。以及齐次函数的定义等,都和倍乘某一个常数因子有关。
https://oncemore2020.github.io/blog/homogeneous/

齐次坐标中的应用

齐次坐标的一个应用就是将平移用矩阵乘法来表示,推导的过程当然无可厚非,也算是巧妙吧,下面简单复述一下吧,

1、位移变换实际上可以归类为一种矩阵的加法,如下图所示

  平移后的值(x+tx,y+ty)

2、一个有趣的现象是我们在做缩放的矩阵变换时,得到的矩阵乘法是这样

假如我们数学主够敏感的话,我们知道矩阵乘法操作,也可以变成1那种平移的效果(类似x*1+0*y+tx*Z,0*x+1*y+ty*Z),只是再加上一个维度就可以了,实际上看起来很巧妙,再看这个矩阵其实就是齐次坐标

3、实际上这种升一个维度用高维的矩阵乘法进行平移运算思想,就是齐次坐标的一种应用。

4、题外话,如果再发散一下,那么这个升维的矩阵到底是什么呢?

对比下图

(图懒得画了看3X3就行)

仔细看看其实它是三维的错切变换矩阵(左乘的Z轴变换),几何意义是错切在z=1面上的截面(纳尼,好难理解,就算有下面这张图)。

实际上3维空间有时候也挺难想象的,不然为什么还有那么多路盲的存在,这个简单的理解是这样,有一打扑克,你无论按那个方向去推它们,顶部和底部的一张,永远是平行的,只是发生了位移而已。所以嘛,人家才翻译成,错切

YY开始

下面就让我们开始大话下齐次坐标,关于升一个维度比较好理解,如何理解尺度不变性原则,让我们举个生活中的例子,

假如放大镜的倍数和与物体的距离成正比(忽略凸透镜的焦点什么的),将这个放大倍数类比齐次坐标中的w是不是很好理解,当我们放大物体12倍,3倍的时候我们从放大镜里看它是变大了,但是物体的大小还是那么大没有发生过变化,我们拿放大镜来看物体,只是我们设计的一种新的视角来观察物体而已,并不会改变物体本身,这也许就是齐次坐标尺度不变性原则的原理所在。

让我们再发散一下(yy),看下面的图,在三维空间中我们有一个方形椎体(视锥),黑色的框是几个正方形截面

我们根据正方形的大小做一种动态的齐次变化(把齐次变换的w常量当成变量),或者分多次来看也行,

也就是把第一个正方形齐次变化的w取为4,第二个取为2,第三个取为1,根据我们刚才的理论,齐次变化实际没有改变物体的本质(或者说我们有能力通过w再次推导会原来的值),变化后齐次坐标是什么样子呢

如果x,y,z坐标如果满足一定关系,我们完全可以在齐次坐标系中获得如上图的表示,将一视椎体变换了一个立方体。

脑洞大开

最后提出一个问题,提供给大家YY,如下图所示的曲线,我们有什么办法给它变成直线呢?(白话叫拉直)

 

 

 

齐次坐标系(Homogeneous Coordinates 是计算机视觉和图形学中的一个重要的数学工具。

1. 游戏名目

1.1. 齐次坐标引入

在欧式空间里,两条共面的平行线无法相交,然而在 投影空间(Projective Space 内却不是这样,一个感性的理解是,如下图中的两条铁轨的间距随着视线变远而减小,直至在地平线处(无限远点)相交。

欧式空间采用 (x,y,z)(x,y,z) 来表示一个三维点,但是无穷远点 (∞,∞,∞)(∞,∞,∞) 在欧式空间里是没有意义的,在投影空间中进行图形和几何运算并不是一个简单的问题,为了解决这个问题,数学家 August Ferdinand Möbius1 提出了齐次坐标系,采用 N+1N+1 个量来表示 NN 维坐标。例如,在二维齐次坐标系中,我们引入一个量 ww,将一个二维点 (x,y)(x,y) 表示为 (X,Y,w)(X,Y,w) 的形式,其转换关系是

x=Xwy=Ywx=Xwy=Yw

例如,在欧式坐标中的一个二维点 (1,2)(1,2) 可以在齐次坐标中表示为 (1,2,1)(1,2,1),如果点逐渐移动向无穷远处,其欧式坐标变为 (∞,∞)(∞,∞),而齐次坐标变为 (1,2,0)(1,2,0),注意到在齐次坐标下不需要  就可以表示无限远处的点。

1.2. “齐次之名?

如果我们要将欧式坐标的一个二维点 (1,2)(1,2) 转换为齐次坐标,根据规则,我们可以选择刚才用到的 (1,2,1)(1,2,1),也可以选择 (2,4,2)(2,4,2),还可以选择 (4,8,4),(8,16,8)...(4,8,4),(8,16,8)...,即 (k,2k,k),kR(k,2k,k),kR 都是合法的齐次坐标表示,这些点都映射到欧式空间中的一点,即这些点具有 尺度不变性(Scale Invariant,是齐性的”(同族的),所以称之为齐次坐标。

同样的,线性系统的齐次性是指在输入量倍乘的情况下,输出同时倍乘同一因子。以及齐次函数的定义等,都和倍乘某一个常数因子有关。

1.3. 平行线相交:不太严格的证明

考虑两条平行线:

{Ax+By+C=0Ax+By+D=0{Ax+By+C=0Ax+By+D=0

在欧式空间中,C=DC=D 时两条线重合,否则不相交。尝试用 xw,ywxw,yw 替换 x,yx,y(如前面提到的,用 N+1N+1 个量表示 NN 维坐标,这里增加了一个量 ww),可以得到:

{Ax+By+Cw=0Ax+By+Dw=0{Ax+By+Cw=0Ax+By+Dw=0

可以得到解 (x,y,0)(x,y,0),即两条平行线在 (x,y,0)(x,y,0) 处相遇,称之为无穷点(注意这里不要用欧式空间的思维去想象这个点在哪里)。

1.4.重要性

《计算机图形学(OpenGL)》的作者F.S. Hill Jr.写到:

齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。

于是我们知道,其重要性,主要有二:其一,是区分向量和点;其二,是易于进行 仿射变化(Affine Transformation,但是这两点内部的原因又是什么呢?吹牛逼要吹到家,总不能说是大牛说的就是对的吧,要理解这两点,需要进行更细致一些的了解,请往下看。

2. 深入理解

首先,我们需要对齐次坐标系的形式化表达更明了,为了简化说明,主要以 2维点做之后的说明。

2.1. 平面点

欧式坐标表示:

x=(x,y)R2x=(x,y)R2

齐次坐标表示:

x~=(x^,y^,w)P2x~=(x^,y^,w)P2

w=0w=0 时称为 无穷点(points at infinity,其中 P2=R3−(0,0,0)P2=R3−(0,0,0)  2D投影空间齐次矢量 x~x~ 可转换为欧式表示:

x~=(x^,y^,w)=w(x,y,1)=wx¯x~=(x^,y^,w)=w(x,y,1)=wx¯

x¯ 称为 增广矢量(augmented vector)

2.2. 平面线

齐次表示:

l~=(a,b,c)l~=(a,b,c)

对应欧式空间直线方程:

x¯l~=ax+by+c=0l~=ax+by+c=0

例外是在 l~=(0,0,1)l~=(0,0,1) 时为 无穷线,包含了所有的2维无穷点。

可将 l~l~ 标准化为 l=(n^x,n^y,d)=(n^,d),n^=1l=(n^x,n^y,d)=(n^,d),n^=1n^n^ 称为 法向量,与直线 l~l~ 垂直,dd 为原点到直线的距离,下图给出了比较形象的解释:

采用齐次坐标系时,可求得两条直线的交点的齐次表达:

x~=l~1×l~2x~=l~1×l~2

×× 表示叉积。同时,两个点确定的直线方程的齐次表达为:

l~=x~1×x~2l~=x~1×x~2

以上结论的严格的证明是很容易的,最粗暴简单的思路就是在欧式空间内计算出结果后转化为齐次表达,并与采用齐次表达计算结果进行对比,这里略过。

2.3. 更易用于仿射变换?

对于一个 2维点 p=(x,y)p=(x,y),仿射变换(TT)是线性变换(ApAp)和平移变换(+t+t)的叠加:

T(p)=Ap+tT(p)=Ap+t

线性变换在欧式空间中可以表示为矩阵乘积形式,如旋转变换和缩放变换:

[x`y`]=[cos(θ)sin(θ)−sin(θ)cos(θ)][xy][x`y`]=[cos(θ)−sin(θ)sin(θ)cos(θ)][xy]

[x`y`]=[Sx00Sy][xy][x`y`]=[Sx00Sy][xy]

而平移变换

[x`y`]=[xy]+[txty][x`y`]=[xy]+[txty]

却不能用矩阵相乘的形式表达。现在引入齐次坐标系表达 p~=(x,y,1)p~=(x,y,1),(尺度不变性,实际上在高一维的空间映射到 w=1w=1 平面,这样计算后结果直接可导出到欧式空间)。可以将旋转变换和尺度变换表示为:

⎡⎣⎢x`y`1⎤⎦⎥=⎡⎣⎢cos(θ)sin(θ)0−sin(θ)cos(θ)0001⎤⎦⎥⎡⎣⎢xy1⎤⎦⎥[x`y`1]=[cos(θ)−sin(θ)0sin(θ)cos(θ)0001][xy1]

⎡⎣⎢x`y`1⎤⎦⎥=⎡⎣⎢Sx000Sy0001⎤⎦⎥⎡⎣⎢xy1⎤⎦⎥[x`y`1]=[Sx000Sy0001][xy1]

平移变换表示为:

⎡⎣⎢x`y`1⎤⎦⎥=⎡⎣⎢100010txty1⎤⎦⎥⎡⎣⎢xy1⎤⎦⎥[x`y`1]=[10tx01ty001][xy1]

然后我们可以导出仿射变换的矩阵形式,

T=[AO1×2t1]⎡⎣⎢xy1⎤⎦⎥T=[AtO1×21][xy1]

其中 O1×2=[0  0]O1×2=[0  0],仿射变换保留了点的共线/面性质及比例(可以参考一些图形学资料),这在图形处理中非常重要,比如对于平面上的一个几何形状进行变换,只需要对其顶点进行变换就可实现(在 2 维线上的点变换后一定与变换后的端点共线)。而齐次坐标系的引入使仿射变换能以紧凑统一的矩阵形式表达和计算,这体现了其对仿射变换的重要性。

2.4. 能够区分向量和点?

当我们在坐标系 xOyxOy 中用 (a,b)(a,b) 定义一个向量 v v→ 时,表示 v =ax +by v→=ax→+by→,当我们在同样的坐标系中用 (a,b)(a,b) 表示一个点 pp 时,表示 po=ax +by p−o=ax→+by→,假若写下 (2,1)(2,1),如无附加说明,不能区别出它是向量还是点。将点的表示重写为:

p=[a  b  1]⎡⎣⎢x y o⎤⎦⎥p=[a  b  1][x→y→o]

将向量的表示写为:

p=[a  b  0]⎡⎣⎢x y o⎤⎦⎥p=[a  b  0][x→y→o]

这样能够清晰地区分向量和点,用 3个量表示 2 维点,这即是齐次坐标的思想。

3. 下一步

文章为了便于思考,讨论的都是简单的情形,还有很多问题都没有严格的证明,比如,3维点表达是否还适用?面表达,线表达呢?还有仿射变换为什么保留了共线/面信息?更深入的了解建议找一本计算机图形学的资料,能够了解到更多关于投影空间,2D变换,3D变换,3D2D变换的形式化表示,以及更严格的证明和表述。

参考资料:《Computer Vision: Algorithms andApplications- Richard Szeliski - Chapter 2. Image Formation

  1. 中文音译名莫比乌斯,德国数学家,Wikipedia