0%

透视变换原理及其Opencv实现

有关于图像处理中的线性变换、仿射变换、透视变换原理的理解和对于透视变换的Opencv实现(可以进行图片的视角变换)。

Opencv实现代码在我的Github中

perspective-transform

如对于线代和矩阵记忆模糊,推荐可以先去看3Blue1Brown的【官方双语/合集】线性代数的本质 - 系列合集

如果嫌视频讲的太啰嗦,可以去我的📒线性代数的本质-笔记查看我对视频的笔记记录,可能有些部分没有完成,但是会慢慢把坑填上。

1 线性变换

线性变换和后面要说的仿射变换、透视变换,本质上都是通过操作矩阵来实现对于空间的变换,其中为何矩阵是对空间的变换操作,可以看👆上面的📺视频或者📒笔记具体了解。

线性变换矩阵为:

线性变换的过程为:

最终的坐标值为

可以看出来线性变换对于只是对空间中的基向量对应变换为,从而实现对空间中点的变换。

所以可以看出来线性变换特点是:

  1. 变换前是直线变换后仍是直线(平行关系)
  2. 直线比例保持不变(比例关系)
  3. 变换前是原点的,变换后依然是原点

2 仿射变换

仿射变换矩阵为:

仿射变换的过程为:

仿射变换和线性变换相似,只是后面多一个平移向量,可以除了旋转、翻转、剪切等基本线性操作以外还可以对整个空间进行平移。

所以可以看出来仿射变换特点是:

  1. 变换前是直线变换后仍是直线(平行关系)
  2. 直线比例保持不变(比例关系)
  3. 原点在变换后可能改变

3 透视变换

透视变换矩阵为:

透视变换的过程为:$$\begin{bmatrix} a_{11}&a_{12}&a_{13} \\ a_{21}&a_{22}&a_{23} \\ a_{31}&a_{32}&a_{33} \end{bmatrix} \begin{bmatrix}x\\y\\1\end{bmatrix} = x\begin{bmatrix}a_{11}\\a_{21}\\a_{31}\end{bmatrix} + y\begin{bmatrix}a_{12}\\a_{22}\\a_{32}\end{bmatrix} + 1\begin{bmatrix}a_{13}\\a_{23}\\a_{33}\end{bmatrix} = \begin{bmatrix}{x}'\\{y}'\\{z}'\end{bmatrix}$$ 最终坐标为$$\begin{bmatrix}{x}''\\{y}''\\1\end{bmatrix} = \begin{bmatrix}{\frac{{x}'}{{z}'}}\\\frac{{y}'}{{z}'}\\\frac{{z}'}{{z}'}\end{bmatrix}$$,只取$\begin{bmatrix}{x}''\\{y}''\end{bmatrix}$就行。

由变换过程可以看出来,透视变换是将二维的坐标转到了三维空间中去,只不过只是在三维的一个面上,这个面就是$z=1$,然后再通过一个$3*3$的变换矩阵在三维空间中变换。完成后再将x、y除以z得到三维空间中投影到原本二维面的图像。

透视变换在三种变换中是最为灵活的一种,因为将其放在了三维空间中,提升了纬度,最后能得到的投影情况也是更多。

如果您觉得还不错,可以请我喝杯咖啡。