文章目录
透视变换简介
真实的世界是三维的,而图像是二维的(至少目前是),如果要以二维图像描述三维世界,并且看起来足够真实,那么三维世界向二维图像转化的过程就需要满足一定的几何投影关系,即透视关系,用非常简单的话来讲就是近处的物体在图像中显得比较大,远处的物体在图像中显得比较小。比如下图中的铁轨,越往远处看,图像中铁轨的间距越小,但实际上铁轨的间距是不变的。

透视变换就是对图像中的物体进行空间坐标变换时,使变换结果满足一定的透视关系。透视变换包含以下三个过程:
- 二维坐标向齐次坐标的变换
- 齐次坐标投影
- 图像插值
说到这里可能仍然非常抽象,继续向下看应该能使各位对透视变换的概念逐渐变得清晰一些。
预备知识
在继续向下了解透视变换的公式推导之前,建议先详细了解一下仿射变换和图像插值的相关知识,这部分知识在其他地方已经写过了,所以这里不会再写,不过请务必详细了解,否则再往下理解起来可能会有点费劲。
图像坐标空间变换:仿射变换(Affine Transformation)
图像插值:最邻近(nearest)与双线性(bilinear)
其中特别注意以下内容:
- 符号约定:(u,v)用来表示原始图像中的坐标,(x,y)用来表示变换后图像的坐标
- 齐次坐标的初步概念
- 仿射变换通式
- 前向映射与后向映射,并理解为了图像插值方便,空间坐标变换通常使用后向映射方式实现
透视变换公式推导
下面我们先讲投影的概念,然后再讲二维坐标向齐次坐标的变换(请注意,这个讲述顺序与计算顺序相反)
投影
在仿射变换(Affine Transformation)中曾经简单讲过, ( x , y , 1 ) (x,y,1) (x,y,1)就是 ( x , y ) (x,y) (x,y)对应的齐次坐标。现在我们要扩展一下齐次坐标的概念。当我们使用相机进行拍摄时,可以认为三维空间中的物体都投影在了一个二维图像上面,如下图所示,红色的平面就可以认为是投影平面,我们将其定义为 z = 1 z=1 z=1的平面,那么 ( x , y , 1 ) (x,y,1) (x,y,1)就是二维图像上的点 ( x , y ) (x,y) (x,y)在三维空间中的坐标。
接下来,对 ( x , y , 1 ) (x,y,1) (x,y,1)乘以一个系数,即 α ( x , y , 1 ) \alpha(x,y,1) α(x,y,1),改变 α \alpha α就相当于在红色虚线上移动 ( x , y , 1 ) (x,y,1) (x,y,1)点,这一点可以通过相似三角形的原理进行证明。红色虚线通过连接观察者(或相机)与点 ( x , y , 1 ) (x,y,1) (x,y,1)得到。
我们将 α ( x , y , 1 ) \alpha(x,y,1) α(x,y,1)记为 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),即 ( X = α x , Y = α y , Z = α ) (X=\alpha x, Y=\alpha y, Z=\alpha) (X=αx,Y=αy,Z=α)。投影就是将 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)投影至 ( x , y , 1 ) (x,y,1) (x,y,1)的过程。若已知 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),可以通过投影计算出 ( x , y ) (x,y) (x,y),其计算过程比较简单,根据 α ( x , y , 1 ) = ( X , Y , Z ) \alpha(x,y,1)=(X,Y,Z) α(x,y,1)=(X,Y,Z)的定义, ( X , Y ) (X,Y) (X,Y)同除以 Z Z Z即可:
{ x = X / Z y = Y / Z \begin{cases} x = X/Z \\[2ex] y = Y/Z \end{cases} ⎩⎨⎧x=X/Zy=Y/Z
上述定义和计算过程表明,所有由 α ( x , y , 1 ) \alpha(x,y,1) α(x,y,1)定义的点有着一个共同的投影坐标,即 ( x , y , 1 ) (x,y,1) (x,y,1)。

二维坐标向齐次坐标的变换
此处我们直接推导后向映射过程,后向映射是编程时真正使用的计算方法。
记原始图像中的坐标为 ( u , v ) (u,v) (u,v),对应的齐次坐标为 ( U , V , W ) (U,V,W) (U,V,W),变换后图像的坐标为 ( x , y ) (x,y) (x,y)。
那么有:
[ U V W ] = [ x y 1 ] [ t 11 t 12 t 13 t 21 t 22 t 23 t 31 t 32 t 33 ] \begin{bmatrix} U & V & W \end{bmatrix} = \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} t_{11} & t_{12} & t_{13} \\ t_{21} & t_{22} & t_{23} \\ t_{31} & t_{32} & t_{33} \end{bmatrix} [UVW]=[xy1]⎣⎡t11t21t31t12t22t32t13t23t33⎦⎤
请注意,这个式子不好求解,因为如果将此式化为方程组形式,你会发现没有常系数项。接下来,我们要运用上面投影部分讲过的概念变换此式,使其容易求解。
根据投影的概念,当我们求出 ( U , V , W ) (U,V,W) (U,V,W)后,我们接着通过 ( u = U / W , v = V / W ) (u = U/W,v=V/W) (u=U/W,v=V/W)来求解 ( u , v ) (u,v) (u,v),请特别注意,在这个过程中,我们可以对 ( U , V , W ) (U,V,W) (U,V,W)乘以任意一个常系数而不会影响计算结果,也就是说,我们可以对上面的矩阵方程两边同乘以一个系数。
那么我们两边同除以 t 33 t_{33} t33,得到的结果除了将 t 33 t_{33} t33改写为1以外,其他符号保持不变,所以可得:
[ U V W ] = [ x y 1 ] [ t 11 t 12 t 13 t 21 t 22 t 23 t 31 t 32 1 ] \begin{bmatrix} U & V & W \end{bmatrix} = \begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} t_{11} & t_{12} & t_{13} \\ t_{21} & t_{22} & t_{23} \\ t_{31} & t_{32} & 1 \end{bmatrix} [UVW]=[xy1]⎣⎡t11t21t31t12t22t32t13t231⎦⎤
这个式子就容易求解了。
现在可以去跟仿射变换(Affine Transformation)对比一下,然后会发现,这里的变换矩阵多了两个参数: t 13 t_{13} t13和 t 23 t_{23} t23

本文深入解析透视变换原理,涵盖从预备知识到公式推导的全过程,包括投影、齐次坐标变换及图像插值等内容,附带实例讲解A4纸视角校正,揭示透视变换的局限性。
最低0.47元/天 解锁文章
4442

被折叠的 条评论
为什么被折叠?



