一、基础知识铺垫
假设在二维平面上的任意点坐标为,经过变换 后得到点
1、图像缩放
变换矩阵:
则有:
得到:
这个变换只作用于对应的分量上,可知变换矩阵正对角线(左上到右下)为缩放因子。
2、图像旋转
变换矩阵:
则有:
得到:
可见原本轴维度上的分量变换到维度上的分量,原本轴维度上的分量变换到维度上的分量。可知变换矩阵反对角线(右上到左下)为旋转因子。
3、图像错切
水平错切
变换矩阵:
则有:
得到:
垂直错切
变换矩阵:
则有:
得到:
水平垂直一起错切
变换矩阵:
则有:
得到:
4、图像平移
为方便理解,这里需要再添加一个维度变量
变换矩阵:
则有:
得到:
很好理解,各在x轴和y轴做偏移,M矩阵最后一列为偏移因子。
至此,变换矩阵M可以是这样的:
二、仿射变换(图像的二维平面变换)
变换矩阵:
则有:
得到:
也是对图像的缩放、错位以及平移的综合操作。同时可以看到其中的未知数有6个:
求解这个齐次方程,则需要变换前3个坐标点和对应变换后3个目标坐标点,这就是为什么opencv的仿射变换函数需要提供6个坐标点的原理了。
三、透视变换(图像的三维在二维平面的变换)
重点来啦!仿射变换只是二维平面的综合操作。那如果考虑现实三维空间中深度对图像的变换,得引入深度维度z,则一个三维空间得点表示为:
考虑到二维图像中的点并没有z坐标信息,那就设置为, 其在三维空间得表示为:
设经过变换后得到三维空间点为:
变换矩阵:
则有:
得到:
但问题来了,透视变换最终还是要把变换得图画在二维得图像平面上的,点的不好直接在二维图像中表示吧。既然二维图像中只有x轴和y轴,那么就要用z轴的信息对x轴和y轴的坐标信息做一个变换吧,我这里自大地起个名字 —— “降维变换”:
其中:
可以理解为x轴分量与z轴分量的夹角的关系。
可以理解为y轴分量与z轴分量的夹角的关系。
这个时候,有8个未知数要求解:
需要变换前的4个坐标点和变换后的4个目标坐标点来求出。这个就是为什么opencv的透明变换一定要提供8个坐标点的原理了。