0、参考链接
1、问题:两条平行线可以相交于一点
-
在欧式空间中,同一平面的两条直线不能相交;
-
在透视空间中,两条平行线可以相交,火车轨道随着我们的视线越来越窄,最后两条平行线在无穷远处交于一点;
-
欧式空间描述2D/3D几何非常合适,但这种方法不适合处理透视空间的问题。
2、解决方法:利用齐次坐标解决这一问题
-
齐次坐标就是用N+1维来代表N维坐标;
-
我们可以在一个2D笛卡尔坐标(X, Y)末尾加上一个额外的变量w来形成2D齐次坐标(x, y, w),并且有:
X = x / w
Y = y / w
例如,笛卡尔坐标系下(1, 2)的齐次坐标可以表示为(1, 2, 1),如果(1, 2)移动到无限远处,在笛卡尔坐标系下变成(∞, ∞),这个点没有意义,它的齐次坐标为(1, 2, 0)。
-
平行线在透视空间的无穷远处交于一点,但是在欧氏空间却不能。
3、为什么叫齐次坐标?
我们把齐次坐标转化为笛卡尔坐标的方法是前面n-1个坐标分量分别除以最后一个分量即可。
(
x
,
y
,
w
)
⇔
(
x
w
,
y
w
)
Homogeneous
\begin{array}{cc} (x, y, w) & \Leftrightarrow & \left(\frac{x}{w}, \frac{y}{w}\right) \\ \text { Homogeneous } \end{array}
(x,y,w) Homogeneous ⇔(wx,wy)
( 1 , 2 , 3 ) ⇒ ( 1 3 , 2 3 ) ( 2 , 4 , 6 ) ⇒ ( 2 6 , 4 6 ) = ( 1 3 , 2 3 ) ( 4 , 8 , 12 ) ⇒ ( 4 12 , 8 12 ) = ( 1 3 , 2 3 ) ⋮ ⋮ ( 1 a , 2 a , 3 a ) ⇒ ( 1 a 3 a , 2 a 3 a ) = ( 1 3 , 2 3 ) \begin{array}{c} (1,2,3) \Rightarrow\left(\frac{1}{3}, \frac{2}{3}\right) \\ (2,4,6) \Rightarrow\left(\frac{2}{6}, \frac{4}{6}\right) \quad=\left(\frac{1}{3}, \frac{2}{3}\right) \\ (4,8,12) \Rightarrow\left(\frac{4}{12}, \frac{8}{12}\right)=\left(\frac{1}{3}, \frac{2}{3}\right) \\ \vdots & \vdots \\ (1 a, 2 a, 3 a) \Rightarrow\left(\frac{1 a}{3 a}, \frac{2 a}{3 a}\right)=\left(\frac{1}{3}, \frac{2}{3}\right) \end{array} (1,2,3)⇒(31,32)(2,4,6)⇒(62,64)=(31,32)(4,8,12)⇒(124,128)=(31,32)⋮(1a,2a,3a)⇒(3a1a,3a2a)=(31,32)⋮
我们发现(1, 2, 3)、(2, 4, 6)和(4, 8, 12)对应同一个欧几里得点(1/3, 2/3),因此这些点是齐次的,因为它们代表了笛卡尔坐标系里面的同一个点。
4、证明:两条直线可以相交
考虑如下方程组:
{
A
x
+
B
y
+
C
=
0
A
x
+
B
y
+
D
=
0
\left\{\begin{array}{l} A x+B y+C=0 \\ A x+B y+D=0 \end{array}\right.
{Ax+By+C=0Ax+By+D=0
在笛卡尔坐标系里面,该方程无解,因为两条直线平行。
在透视空间里面,用齐次坐标(x / w, y / w)代替x,y:
{
A
x
w
+
B
y
w
+
C
=
0
A
x
w
+
B
y
w
+
D
=
0
⇒
{
A
x
+
B
y
+
C
w
=
0
A
x
+
B
y
+
D
w
=
0
\left\{\begin{array} { l } { A \frac { x } { w } + B \frac { y } { w } + C = 0 } \\ { A \frac { x } { w } + B \frac { y } { w } + D = 0 } \end{array} \Rightarrow \left\{\begin{array}{l} A x+B y+C w=0 \\ A x+B y+D w=0 \end{array}\right.\right.
{Awx+Bwy+C=0Awx+Bwy+D=0⇒{Ax+By+Cw=0Ax+By+Dw=0
现在我们有一个解(x, y, 0),两条直线相交于(x, y, 0),这个点在无穷远处。
齐次坐标的意义
图像的缩放变换和旋转变换可以用矩阵乘法的形式来表达变换后的像素位置映射关系。
那么对于平移变换呢?平移变换表示的是位置变化的概念。
一个图像矩形中心点从[x1, y1]平移到了[x2, y2],整体大小和角度都没有变化。在x方向和y方向上分别平移了tx和ty的大小,即:
x
2
=
x
1
+
t
x
y
2
=
y
1
+
t
y
\begin{array}{l} x 2=x 1+t x \\ y 2=y 1+t y \end{array}
x2=x1+txy2=y1+ty
写成矩阵的形式:
[
x
2
y
2
]
=
[
x
1
y
1
]
+
[
t
x
t
y
]
\left[\begin{array}{l} x 2 \\ y 2 \end{array}\right]=\left[\begin{array}{l} x 1 \\ y 1 \end{array}\right]+\left[\begin{array}{l} t x \\ t y \end{array}\right]
[x2y2]=[x1y1]+[txty]
把缩放变换和旋转变换的矩阵形式写出来:
缩放变换:
[
x
2
y
2
]
=
[
k
x
0
0
k
y
]
[
x
1
y
1
]
\left[\begin{array}{l} x 2 \\ y 2 \end{array}\right]=\left[\begin{array}{cc} k_{x} & 0 \\ 0 & k_{y} \end{array}\right]\left[\begin{array}{l} x 1 \\ y 1 \end{array}\right]
[x2y2]=[kx00ky][x1y1]
旋转变换:
[
x
2
y
2
]
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
[
x
1
y
1
]
\left[\begin{array}{l} x 2 \\ y 2 \end{array}\right]=\left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right]\left[\begin{array}{l} x 1 \\ y 1 \end{array}\right]
[x2y2]=[cosθsinθ−sinθcosθ][x1y1]
缩放变换和旋转变换都可以表示成矩阵乘法的形式。实际上,图像的几何变换通常不是单一的,也就是说经常性的缩放、旋转、平移一起变换。例如先放大2倍,然后旋转45度,然后再缩小0.5倍。那么就可以表示成矩阵乘法串接的形式:
[
x
2
y
2
]
=
[
0.5
0
0
0.5
]
[
cos
45
−
sin
45
sin
45
cos
45
]
[
2
0
0
2
]
[
x
1
y
1
]
\left[\begin{array}{l} x 2 \\ y 2 \end{array}\right]=\left[\begin{array}{cc} 0.5 & 0 \\ 0 & 0.5 \end{array}\right]\left[\begin{array}{cc} \cos 45 & -\sin 45 \\ \sin 45 & \cos 45 \end{array}\right]\left[\begin{array}{ll} 2 & 0 \\ 0 & 2 \end{array}\right]\left[\begin{array}{l} x 1 \\ y 1 \end{array}\right]
[x2y2]=[0.5000.5][cos45sin45−sin45cos45][2002][x1y1]
不管有多少次变换,都可以用矩阵乘法来实现。但是平移变换呢?从前面看到,平移变换并不是矩阵乘法的形式,而是矩阵加法的形式!
那能不能把==缩放变换、旋转变换、平移变换统一成矩阵乘法的形式==呢,这样不管进行多少次变换,都可以表示成矩阵连乘的形式,将极大的方便计算和降低运算量。
这种方法就是**升维,引入齐次坐标**,将图像从平面2D坐标变成3D坐标。
平移变换升成3D,表示为:
[
x
2
y
2
1
]
=
[
1
0
t
x
0
1
t
y
0
0
1
]
[
x
1
y
1
1
]
\left[\begin{array}{c} x 2 \\ y 2 \\ 1 \end{array}\right]=\left[\begin{array}{ccc} 1 & 0 & t x \\ 0 & 1 & t y \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x 1 \\ y 1 \\ 1 \end{array}\right]
⎣⎡x2y21⎦⎤=⎣⎡100010txty1⎦⎤⎣⎡x1y11⎦⎤
这是个非常优美的地方,学习过矩阵乘法的同学可以算一下右边的式子,是否最终结果与前面是一样的。
这样,平移变换通过升维后的齐次坐标,也变成了矩阵乘法的形式。当然缩放变换和旋转变换的矩阵形式也得改一改,统一变成3维的形式。
缩放变换:
[
x
2
y
2
1
]
=
[
k
x
0
0
0
k
y
0
0
0
1
]
[
x
1
y
1
1
]
\left[\begin{array}{c} x 2 \\ y 2 \\ 1 \end{array}\right]=\left[\begin{array}{ccc} k_{x} & 0 & 0 \\ 0 & k_{y} & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x 1 \\ y 1 \\ 1 \end{array}\right]
⎣⎡x2y21⎦⎤=⎣⎡kx000ky0001⎦⎤⎣⎡x1y11⎦⎤
旋转变换:
[
x
2
y
2
1
]
=
[
cos
θ
−
sin
θ
0
sin
θ
cos
θ
0
0
0
1
]
[
x
1
y
1
1
]
\left[\begin{array}{c} x 2 \\ y 2 \\ 1 \end{array}\right]=\left[\begin{array}{ccc} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} x 1 \\ y 1 \\ 1 \end{array}\right]
⎣⎡x2y21⎦⎤=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤⎣⎡x1y11⎦⎤
终于统一了。以后所有的变换,不管怎样变换,变换多少次,都可以表示成一连串的矩阵相乘了,这是多么的方便。
这就是引入齐次坐标的作用:把缩放、旋转、平移等变换都统一起来,都表示成一连串的矩阵相乘的形式,保证了形式上的线性一致性。
齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。
许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为 x=R∗X+t(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X为原向量,x 为变换后的向量)。
引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为x=P∗X的形式。